0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解TCP報(bào)文的頭部結(jié)構(gòu)

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:簡(jiǎn)書(shū) ? 作者:InsaneLoafer ? 2022-05-05 15:08 ? 次閱讀

簡(jiǎn)介

TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,在發(fā)送數(shù)據(jù)前,通信雙方必須在彼此間建立一條連接。所謂的“連接”,其實(shí)是客戶(hù)端和服務(wù)端保存的一份關(guān)于對(duì)方的信息,如ip地址、端口號(hào)等。TCP可以看成是一種字節(jié)流,它會(huì)處理IP層或以下的層的丟包、重復(fù)以及錯(cuò)誤問(wèn)題。在連接的建立過(guò)程中,雙方需要交換一些連接的參數(shù)。這些參數(shù)可以放在TCP頭部。一個(gè)TCP連接由一個(gè)4元組構(gòu)成,分別是兩個(gè)IP地址和兩個(gè)端口號(hào)。一個(gè)TCP連接通常分為三個(gè)階段:連接、數(shù)據(jù)傳輸、退出(關(guān)閉)。通過(guò)三次握手建立一個(gè)鏈接,通過(guò)四次揮手來(lái)關(guān)閉一個(gè)連接。當(dāng)一個(gè)連接被建立或被終止時(shí),交換的報(bào)文段只包含TCP頭部,而沒(méi)有數(shù)據(jù)。

1. TCP報(bào)文的頭部結(jié)構(gòu)

在了解TCP連接之前先來(lái)了解一下TCP報(bào)文的頭部結(jié)構(gòu)。

9f235a6a-c858-11ec-bce3-dac502259ad0.jpg

上圖中有幾個(gè)字段需要重點(diǎn)介紹下:

(1)序號(hào):seq序號(hào),占32位,用來(lái)標(biāo)識(shí)從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記。

(2)確認(rèn)序號(hào):ack序號(hào),占32位,只有ACK標(biāo)志位為1時(shí),確認(rèn)序號(hào)字段才有效,ack=seq+1。

(3)標(biāo)志位:共6個(gè),即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

ACK:確認(rèn)序號(hào)有效。

FIN:釋放一個(gè)連接。

PSH:接收方應(yīng)該盡快將這個(gè)報(bào)文交給應(yīng)用層。

RST:重置連接。SYN:發(fā)起一個(gè)新連接。

URG:緊急指針(urgent pointer)有效。需要注意的是:不要將確認(rèn)序號(hào)ack與標(biāo)志位中的ACK搞混了。確認(rèn)方ack=發(fā)起方seq+1,兩端配對(duì)。

2. 三次握手

三次握手的本質(zhì)是確認(rèn)通信雙方收發(fā)數(shù)據(jù)的能力首先,我讓信使運(yùn)輸一份信件給對(duì)方,對(duì)方收到了,那么他就知道了我的發(fā)件能力和他的收件能力是可以的。于是他給我回信,我若收到了,我便知我的發(fā)件能力和他的收件能力是可以的,并且他的發(fā)件能力和我的收件能力是可以。然而此時(shí)他還不知道他的發(fā)件能力和我的收件能力到底可不可以,于是我最后回饋一次,他若收到了,他便清楚了他的發(fā)件能力和我的收件能力是可以的。這,就是三次握手。

9f40e6fc-c858-11ec-bce3-dac502259ad0.jpg

第一次握手:客戶(hù)端要向服務(wù)端發(fā)起連接請(qǐng)求,首先客戶(hù)端隨機(jī)生成一個(gè)起始序列號(hào)ISN(比如是100),那客戶(hù)端向服務(wù)端發(fā)送的報(bào)文段包含SYN標(biāo)志位(也就是SYN=1),序列號(hào)seq=100。

第二次握手:服務(wù)端收到客戶(hù)端發(fā)過(guò)來(lái)的報(bào)文后,發(fā)現(xiàn)SYN=1,知道這是一個(gè)連接請(qǐng)求,于是將客戶(hù)端的起始序列號(hào)100存起來(lái),并且隨機(jī)生成一個(gè)服務(wù)端的起始序列號(hào)(比如是300)。然后給客戶(hù)端回復(fù)一段報(bào)文,回復(fù)報(bào)文包含SYN和ACK標(biāo)志(也就是SYN=1,ACK=1)、序列號(hào)seq=300、確認(rèn)號(hào)ack=101(客戶(hù)端發(fā)過(guò)來(lái)的序列號(hào)+1)。

第三次握手:客戶(hù)端收到服務(wù)端的回復(fù)后發(fā)現(xiàn)ACK=1并且ack=101,于是知道服務(wù)端已經(jīng)收到了序列號(hào)為100的那段報(bào)文;同時(shí)發(fā)現(xiàn)SYN=1,知道了服務(wù)端同意了這次連接,于是就將服務(wù)端的序列號(hào)300給存下來(lái)。然后客戶(hù)端再回復(fù)一段報(bào)文給服務(wù)端,報(bào)文包含ACK標(biāo)志位(ACK=1)、ack=301(服務(wù)端序列號(hào)+1)、seq=101(第一次握手時(shí)發(fā)送報(bào)文是占據(jù)一個(gè)序列號(hào)的,所以這次seq就從101開(kāi)始,需要注意的是不攜帶數(shù)據(jù)的ACK報(bào)文是不占據(jù)序列號(hào)的,所以后面第一次正式發(fā)送數(shù)據(jù)時(shí)seq還是101)。當(dāng)服務(wù)端收到報(bào)文后發(fā)現(xiàn)ACK=1并且ack=301,就知道客戶(hù)端收到序列號(hào)為300的報(bào)文了,就這樣客戶(hù)端和服務(wù)端通過(guò)TCP建立了連接。

3. 四次揮手

四次揮手的目的是關(guān)閉一個(gè)連接

9f5e94a4-c858-11ec-bce3-dac502259ad0.jpg

比如客戶(hù)端初始化的序列號(hào)ISA=100,服務(wù)端初始化的序列號(hào)ISA=300。TCP連接成功后客戶(hù)端總共發(fā)送了1000個(gè)字節(jié)的數(shù)據(jù),服務(wù)端在客戶(hù)端發(fā)FIN報(bào)文前總共回復(fù)了2000個(gè)字節(jié)的數(shù)據(jù)。

第一次揮手:當(dāng)客戶(hù)端的數(shù)據(jù)都傳輸完成后,客戶(hù)端向服務(wù)端發(fā)出連接釋放報(bào)文(當(dāng)然數(shù)據(jù)沒(méi)發(fā)完時(shí)也可以發(fā)送連接釋放報(bào)文并停止發(fā)送數(shù)據(jù)),釋放連接報(bào)文包含F(xiàn)IN標(biāo)志位(FIN=1)、序列號(hào)seq=1101(100+1+1000,其中的1是建立連接時(shí)占的一個(gè)序列號(hào))。需要注意的是客戶(hù)端發(fā)出FIN報(bào)文段后只是不能發(fā)數(shù)據(jù)了,但是還可以正常收數(shù)據(jù);另外FIN報(bào)文段即使不攜帶數(shù)據(jù)也要占據(jù)一個(gè)序列號(hào)。

第二次揮手:服務(wù)端收到客戶(hù)端發(fā)的FIN報(bào)文后給客戶(hù)端回復(fù)確認(rèn)報(bào)文,確認(rèn)報(bào)文包含ACK標(biāo)志位(ACK=1)、確認(rèn)號(hào)ack=1102(客戶(hù)端FIN報(bào)文序列號(hào)1101+1)、序列號(hào)seq=2300(300+2000)。此時(shí)服務(wù)端處于關(guān)閉等待狀態(tài),而不是立馬給客戶(hù)端發(fā)FIN報(bào)文,這個(gè)狀態(tài)還要持續(xù)一段時(shí)間,因?yàn)榉?wù)端可能還有數(shù)據(jù)沒(méi)發(fā)完。

第三次揮手:服務(wù)端將最后數(shù)據(jù)(比如50個(gè)字節(jié))發(fā)送完畢后就向客戶(hù)端發(fā)出連接釋放報(bào)文,報(bào)文包含F(xiàn)IN和ACK標(biāo)志位(FIN=1,ACK=1)、確認(rèn)號(hào)和第二次揮手一樣ack=1102、序列號(hào)seq=2350(2300+50)。

第四次揮手:客戶(hù)端收到服務(wù)端發(fā)的FIN報(bào)文后,向服務(wù)端發(fā)出確認(rèn)報(bào)文,確認(rèn)報(bào)文包含ACK標(biāo)志位(ACK=1)、確認(rèn)號(hào)ack=2351、序列號(hào)seq=1102。注意客戶(hù)端發(fā)出確認(rèn)報(bào)文后不是立馬釋放TCP連接,而是要經(jīng)過(guò)2MSL(最長(zhǎng)報(bào)文段壽命的2倍時(shí)長(zhǎng))后才釋放TCP連接。而服務(wù)端一旦收到客戶(hù)端發(fā)出的確認(rèn)報(bào)文就會(huì)立馬釋放TCP連接,所以服務(wù)端結(jié)束TCP連接的時(shí)間要比客戶(hù)端早一些。

9f9d2688-c858-11ec-bce3-dac502259ad0.png

4. 常見(jiàn)面試題

為什么TCP連接的時(shí)候是3次?2次不可以嗎?

因?yàn)樾枰紤]連接時(shí)丟包的問(wèn)題,如果只握手2次,第二次握手時(shí)如果服務(wù)端發(fā)給客戶(hù)端的確認(rèn)報(bào)文段丟失,此時(shí)服務(wù)端已經(jīng)準(zhǔn)備好了收發(fā)數(shù)(可以理解服務(wù)端已經(jīng)連接成功)據(jù),而客戶(hù)端一直沒(méi)收到服務(wù)端的確認(rèn)報(bào)文,所以客戶(hù)端就不知道服務(wù)端是否已經(jīng)準(zhǔn)備好了(可以理解為客戶(hù)端未連接成功),這種情況下客戶(hù)端不會(huì)給服務(wù)端發(fā)數(shù)據(jù),也會(huì)忽略服務(wù)端發(fā)過(guò)來(lái)的數(shù)據(jù)。如果是三次握手,即便發(fā)生丟包也不會(huì)有問(wèn)題,比如如果第三次握手客戶(hù)端發(fā)的確認(rèn)ack報(bào)文丟失,服務(wù)端在一段時(shí)間內(nèi)沒(méi)有收到確認(rèn)ack報(bào)文的話(huà)就會(huì)重新進(jìn)行第二次握手,也就是服務(wù)端會(huì)重發(fā)SYN報(bào)文段,客戶(hù)端收到重發(fā)的報(bào)文段后會(huì)再次給服務(wù)端發(fā)送確認(rèn)ack報(bào)文。

為什么TCP連接的時(shí)候是3次,關(guān)閉的時(shí)候卻是4次?

因?yàn)橹挥性诳蛻?hù)端和服務(wù)端都沒(méi)有數(shù)據(jù)要發(fā)送的時(shí)候才能斷開(kāi)TCP。而客戶(hù)端發(fā)出FIN報(bào)文時(shí)只能保證客戶(hù)端沒(méi)有數(shù)據(jù)發(fā)了,服務(wù)端還有沒(méi)有數(shù)據(jù)發(fā)客戶(hù)端是不知道的。而服務(wù)端收到客戶(hù)端的FIN報(bào)文后只能先回復(fù)客戶(hù)端一個(gè)確認(rèn)報(bào)文來(lái)告訴客戶(hù)端我服務(wù)端已經(jīng)收到你的FIN報(bào)文了,但我服務(wù)端還有一些數(shù)據(jù)沒(méi)發(fā)完,等這些數(shù)據(jù)發(fā)完了服務(wù)端才能給客戶(hù)端發(fā)FIN報(bào)文(所以不能一次性將確認(rèn)報(bào)文和FIN報(bào)文發(fā)給客戶(hù)端,就是這里多出來(lái)了一次)。

為什么客戶(hù)端發(fā)出第四次揮手的確認(rèn)報(bào)文后要等2MSL的時(shí)間才能釋放TCP連接?

這里同樣是要考慮丟包的問(wèn)題,如果第四次揮手的報(bào)文丟失,服務(wù)端沒(méi)收到確認(rèn)ack報(bào)文就會(huì)重發(fā)第三次揮手的報(bào)文,這樣報(bào)文一去一回最長(zhǎng)時(shí)間就是2MSL,所以需要等這么長(zhǎng)時(shí)間來(lái)確認(rèn)服務(wù)端確實(shí)已經(jīng)收到了。

原文標(biāo)題:網(wǎng)絡(luò)編程:TCP的三次握手與四次揮手

文章出處:【微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    823

    瀏覽量

    40191
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1337

    瀏覽量

    78863
  • 連接
    +關(guān)注

    關(guān)注

    2

    文章

    95

    瀏覽量

    20917

原文標(biāo)題:網(wǎng)絡(luò)編程:TCP的三次握手與四次揮手

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PPPoe的報(bào)文結(jié)構(gòu)和抓包分析

    PPPoe的頭部后面就是PPP的報(bào)文了,因?yàn)槲覀冃枰氖莗pp協(xié)議中的認(rèn)證功能,所以自然需要有完整的ppp報(bào)文去完成這一部分的功能。
    的頭像 發(fā)表于 01-02 09:47 ?3559次閱讀
    PPPoe的<b class='flag-5'>報(bào)文</b><b class='flag-5'>結(jié)構(gòu)</b>和抓包分析

    一文詳解Modbus TCP通信

    MODBUS報(bào)文的用途。協(xié)議的通用用途是為諸如PLC’s,I/O模塊,以及連接其它簡(jiǎn)單域總線或I/O模塊的網(wǎng)關(guān)服務(wù)的。MODBUS/TCP 使MODBUS_RTU協(xié)議運(yùn)行于以太網(wǎng),MODBUS TCP
    發(fā)表于 12-22 16:06

    LWIP TCP報(bào)文基礎(chǔ)知識(shí)及其LWIP中TCP協(xié)議的實(shí)現(xiàn)

    接收完成后才將數(shù)據(jù)遞交到應(yīng)用層。2 TCP 報(bào)文結(jié)構(gòu)TCP 報(bào)文段依賴(lài) IP 協(xié)議進(jìn)行發(fā)送,因此 TC
    發(fā)表于 10-18 14:54

    TCP-IP詳解_卷3_TCP事務(wù)協(xié)議,HTTP,NNTP

    TCP-IP詳解_卷3_TCP事務(wù)協(xié)議,HTTP,NNTP和UNIX域協(xié)議》
    發(fā)表于 03-24 22:42 ?39次下載

    TCPv1-TCP-IP協(xié)議詳解-卷1

    TCPv1-TCP-IP詳解-卷1.rar I C M P經(jīng)常被認(rèn)為是I P層的一個(gè)組成部分。它傳遞差錯(cuò)報(bào)文以及其他需要注意的信息。I C M P報(bào)文通常被I P層或更高層協(xié)議( T
    發(fā)表于 03-16 15:12 ?60次下載

    tcp ip協(xié)議詳解卷一

    tcp ip協(xié)議詳解卷一:《TCP/IP詳解,卷1:協(xié)議》是一本完整而詳細(xì)的TCP/IP協(xié)議指南。描述了屬于每一層的各個(gè)協(xié)議以及它們?nèi)绾卧诓?/div>
    發(fā)表于 05-19 12:02 ?712次下載

    ICMP控制報(bào)文協(xié)議

    TCP-IP詳解卷2 ICMP控制報(bào)文協(xié)議,學(xué)習(xí)TCP很好的資料。歡迎下載。
    發(fā)表于 05-09 14:13 ?0次下載

    tcp報(bào)文格式詳解

    TCP(Transmission ControProtocol)傳輸控制協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的傳輸層協(xié)議。TCP報(bào)文TCP層傳輸?shù)臄?shù)據(jù)單元,也稱(chēng)為
    發(fā)表于 12-08 11:11 ?3.2w次閱讀
    <b class='flag-5'>tcp</b><b class='flag-5'>報(bào)文</b>格式<b class='flag-5'>詳解</b>

    ModbusTCP報(bào)文詳解

    ModbusTCP報(bào)文詳解是工業(yè)控制常用的一種協(xié)議,通過(guò)對(duì)Modbus報(bào)文的理解,能很快提升自己的實(shí)際應(yīng)用能力。
    發(fā)表于 06-07 15:15 ?4次下載

    如何解釋TCP報(bào)文的內(nèi)容

    TCP協(xié)議有著自己的數(shù)據(jù)包格式,這里把TCP的數(shù)據(jù)包稱(chēng)為報(bào)文段(segment),TCP報(bào)文段封裝在IP數(shù)據(jù)報(bào)中發(fā)送,
    的頭像 發(fā)表于 08-31 09:12 ?2577次閱讀

    tcp報(bào)文段首部的結(jié)構(gòu)分析

    `TCP`報(bào)文段如`APR`報(bào)文、`IP`數(shù)據(jù)報(bào)一樣,也是由`首部`與`數(shù)據(jù)區(qū)域`組成,`TCP首部`內(nèi)容很豐富,各個(gè)字段都有特定的含義,一般來(lái)說(shuō)`
    的頭像 發(fā)表于 02-14 10:32 ?2126次閱讀
    <b class='flag-5'>tcp</b><b class='flag-5'>報(bào)文</b>段首部的<b class='flag-5'>結(jié)構(gòu)</b>分析

    TCP頭部格式是什么

    在學(xué)習(xí) TCP 連接之前,還要學(xué)習(xí)一下 TCP 頭部格式。因?yàn)?TCP 連接建立,需要用 TCP 包來(lái)交換和管理數(shù)據(jù),下面看一下
    的頭像 發(fā)表于 10-08 16:45 ?1533次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>頭部</b>格式是什么

    TCP 協(xié)議深度解析

    頭部信息,此處是 TCP 協(xié)議 Hypertext Transfer Protocol:應(yīng)用層 HTTP 的信息 網(wǎng)絡(luò)分層 應(yīng)用層(Application Layer) 應(yīng)用層的本質(zhì)是規(guī)定了應(yīng)用程序之間如何相互傳遞報(bào)文, 以
    的頭像 發(fā)表于 11-09 11:19 ?829次閱讀
    <b class='flag-5'>TCP</b> 協(xié)議深度解析

    CCLink轉(zhuǎn)Modbus TCP網(wǎng)關(guān)_MODBUS報(bào)文配置

    興達(dá)易控CCLink轉(zhuǎn)Modbus TCP網(wǎng)關(guān)是一種功能強(qiáng)大的設(shè)備,可實(shí)現(xiàn)兩個(gè)不同通信協(xié)議之間的無(wú)縫對(duì)接。它能夠?qū)CLink協(xié)議轉(zhuǎn)換為Modbus TCP協(xié)議,并通過(guò)報(bào)文配置實(shí)現(xiàn)靈活的通信設(shè)置。興
    的頭像 發(fā)表于 11-15 09:05 ?477次閱讀
    CCLink轉(zhuǎn)Modbus <b class='flag-5'>TCP</b>網(wǎng)關(guān)_MODBUS<b class='flag-5'>報(bào)文</b>配置

    淺談OSPF的5種報(bào)文

    OSPF頭部:以下五個(gè)報(bào)文都會(huì)攜帶OSPF頭部
    的頭像 發(fā)表于 12-21 10:11 ?691次閱讀
    淺談OSPF的5種<b class='flag-5'>報(bào)文</b>