TCP數(shù)據(jù)段格式+UDP數(shù)據(jù)段格式詳解
TCP 報(bào)文格式


TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
TCP 報(bào)文段的報(bào)頭有 10 個(gè)必需的字段和 1 個(gè)可選字段。報(bào)頭至少為 20 字節(jié)。報(bào)頭后面的數(shù)據(jù)是可選項(xiàng)。
1.源端口(16位)
標(biāo)識(shí)發(fā)送報(bào)文的計(jì)算機(jī)端口或進(jìn)程。一個(gè) TCP 報(bào)文段必須包括源端口號(hào),使目的主機(jī)知道應(yīng)該向何處發(fā)送確認(rèn)報(bào)文。
2.目的端口(16位)
標(biāo)識(shí)接收?qǐng)?bào)文的目的主機(jī)的端口或進(jìn)程。
3.序號(hào)(也叫序列號(hào))(32位)
用于標(biāo)識(shí)每個(gè)報(bào)文段,使目的主機(jī)可確認(rèn)已收到指定報(bào)文段中的數(shù)據(jù)。當(dāng)源主機(jī)用于多個(gè)報(bào)文段發(fā)送一個(gè)報(bào)文時(shí),即使這些報(bào)文到達(dá)目的主機(jī)的順序不一樣,序列號(hào)也可以使目的主機(jī)按順序排列它們。
在 SYN 標(biāo)志未置位時(shí),該字段指示了用戶數(shù)據(jù)區(qū)中***個(gè)字節(jié)的序號(hào);在 SYN 標(biāo)志置位時(shí),該字段指示的是初始發(fā)送的序列號(hào)。
在建立連接時(shí)發(fā)送的***個(gè)報(bào)文段中,雙方都提供一個(gè)初始序列號(hào)。TCP 標(biāo)準(zhǔn)推薦使用以 4ms 間隔遞增 1 的計(jì)數(shù)器值作為這個(gè)初始序列號(hào)的值。使用計(jì)數(shù)器可以防止連接關(guān)閉再重新連接時(shí)出現(xiàn)相同的序列號(hào)。
對(duì)于那些包含數(shù)據(jù)的報(bào)文段,報(bào)文段中***個(gè)數(shù)據(jù)字節(jié)的數(shù)量就是初始序列號(hào),其后數(shù)據(jù)字節(jié)按順序編號(hào)。如果源主機(jī)使用同樣的連接發(fā)送另一個(gè)報(bào)文段,那么這個(gè)報(bào)文段的序列號(hào)等于前一個(gè)報(bào)文段的序列號(hào)與前一個(gè)報(bào)文段中數(shù)據(jù)字節(jié)的數(shù)量之和。例如,假設(shè)源主機(jī)發(fā)送 3 個(gè)報(bào)文段,每個(gè)報(bào)文段有 100 字節(jié)的數(shù)據(jù),且***個(gè)報(bào)文段的序列號(hào)是 1000,那么第二個(gè)報(bào)文段的序列號(hào)就是 1100(1000 + 100),第三個(gè)報(bào)文段的序列號(hào)就是 1200(1100 + 100)。
如果序列號(hào)增大至***值將復(fù)位為 0。
4.確認(rèn)號(hào)(32位)
目的主機(jī)返回確認(rèn)號(hào),使源主機(jī)知道某個(gè)或幾個(gè)報(bào)文段已被接收。如果 ACK 控制位被設(shè)置為 1,則該字段有效。確認(rèn)號(hào)等于順序接收到的***一個(gè)報(bào)文段的序號(hào)加 1,這也是目的主機(jī)希望下次接收的報(bào)文段的序號(hào)值。返回確認(rèn)號(hào)后,計(jì)算機(jī)認(rèn)為已接收到小于該確認(rèn)號(hào)的所有數(shù)據(jù)。
例如,序列號(hào)等于前一個(gè)報(bào)文段的序列號(hào)與前一個(gè)報(bào)文段中數(shù)據(jù)字節(jié)的數(shù)量之和。例如,假設(shè)源主 機(jī)發(fā)送 3 個(gè)報(bào)文段,每個(gè)報(bào)文段有 100 字節(jié)的數(shù)據(jù),且***個(gè)報(bào)文段的序列號(hào)是 1000,那么接收到***個(gè)報(bào)文段后,目的主機(jī)返回含確認(rèn)號(hào)1100 的報(bào)頭。接收到第二個(gè)報(bào)文段(其序號(hào)為 1100 )后,目的主機(jī)返回確認(rèn)號(hào) 1200。接收到第三個(gè)報(bào)文段后,目的主機(jī)返回確認(rèn)號(hào) 1300 。
目的主機(jī)不一定在每次接收到報(bào)文段后都返回確認(rèn)號(hào)。在上面的例子中,目的主機(jī)可能等到所有 3 個(gè)報(bào)文段都收到后,再返回一個(gè)含確認(rèn)號(hào) 1300 的報(bào)文段,表示已接收到全部 1200 字節(jié)的數(shù)據(jù)。但是如果目的主機(jī)再發(fā)回確認(rèn)號(hào)之前等待時(shí)間過長,源主機(jī)會(huì)認(rèn)為數(shù)據(jù)沒有到達(dá)目的主機(jī),并自動(dòng)重發(fā)。
上面的例子中,如果目的主機(jī)接收到了報(bào)文段號(hào)為 1000 的***個(gè)報(bào)文段以及報(bào)文段號(hào)為 1200 的***一個(gè)報(bào)文段,則可返回確認(rèn)號(hào) 1100,但是再返回確認(rèn)號(hào) 1300 之前,應(yīng)該等待報(bào)文段號(hào)為 1100 的中間報(bào)文段。
5.數(shù)據(jù)偏移(首部長度)(4位)
TCP 報(bào)文段的數(shù)據(jù)起始處距離 TCP 報(bào)文段的起始處有多遠(yuǎn),即首部長度。 由于 TCP 報(bào)頭的長度隨 TCP 選項(xiàng)字段內(nèi)容的不同而變化,因此報(bào)頭中包含一個(gè)指定報(bào)頭字段的字段。該字段以 32 比特為單位,所以報(bào)頭長度一定是 32 比特的整數(shù)倍,有時(shí)需要在報(bào)頭末尾補(bǔ) 0 。如果報(bào)頭沒有 TCP 選項(xiàng)字段,則報(bào)頭長度值為 5 ,表示報(bào)頭一個(gè)有 160 比特,即 20 字節(jié)。
6.保留位(6位)
由跟在數(shù)據(jù)偏移字段后的 6 位構(gòu)成, 全部為 0 。
7.控制位(6位)
緊急 URG:此位置 1,表明緊急指針字段有效,它告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快傳送。
確認(rèn) ACK:僅當(dāng) ACK = 1 時(shí)確認(rèn)號(hào)字段才有效,TCP 規(guī)定,在連接建立后所有傳達(dá)的報(bào)文段都必須把 ACK 置 1。
推送 PSH: 當(dāng)兩個(gè)應(yīng)用進(jìn)程進(jìn)行交互式的通信時(shí),有時(shí)在一端的應(yīng)用進(jìn)程希望在鍵入一個(gè)命令后立即就能夠收到對(duì)方的響應(yīng)。在這種情況下,TCP 就可以使用推送(push)操作,這時(shí),發(fā)送方 TCP 把 PSH 置 1 ,并立即創(chuàng)建一個(gè)報(bào)文段發(fā)送出去,接收方收到 PSH = 1 的報(bào)文段,就盡快地(即“推送”向前)交付給接收應(yīng)用進(jìn)程,而不再等到整個(gè)緩存都填滿后再向上交付。
復(fù)位 RST:用于復(fù)位相應(yīng)的 TCP 連接
同步 SYN:僅在三次握手建立 TCP 連接時(shí)有效。當(dāng) SYN = 1 而 ACK = 0 時(shí),表明這是一個(gè)連接請(qǐng)求報(bào)文段,對(duì)方若同意建立連接,則應(yīng)在相應(yīng)的報(bào)文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文。
終止 FIN:用來釋放一個(gè)連接。當(dāng) FIN = 1 時(shí),表明此報(bào)文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運(yùn)輸連接。
8.窗口(16位)
此字段用來進(jìn)行流量控制,這個(gè)值是本機(jī)期望一次接收的字節(jié)數(shù),即發(fā)送數(shù)據(jù)的窗口大小。告訴對(duì)方在不等待確認(rèn)的情況下,可以發(fā)來多大的數(shù)據(jù)。這里表示的***長度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用選項(xiàng)中的窗口擴(kuò)大因子選項(xiàng)。
指發(fā)送本報(bào)文段的一方的接收窗口(而不是自己的發(fā)送窗口)。
9.校驗(yàn)和(16位)
源主機(jī)和目的主機(jī)根據(jù) TCP 報(bào)文段以及偽報(bào)頭的內(nèi)容計(jì)算校驗(yàn)和。在偽報(bào)頭中存放著來自 IP 報(bào)頭以及 TCP 報(bào)文段長度信息。與 UDP 一樣,偽報(bào)頭并不在網(wǎng)絡(luò)中傳輸,并且在校驗(yàn)和中包含偽報(bào)頭的目的是為了防止目的主機(jī)錯(cuò)誤地接收存在路由的錯(cuò)誤數(shù)據(jù)報(bào)。
偽首部, 又稱為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數(shù)據(jù)報(bào)格式中,在數(shù)據(jù)報(bào)首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協(xié)議字段、TCP 或 UDP 數(shù)據(jù)報(bào)的總長度等共12字節(jié),所構(gòu)成的擴(kuò)展首部結(jié)構(gòu)。此偽首部是一個(gè)臨時(shí)的結(jié)構(gòu),它既不向上也不向下傳遞,僅僅只是為了保證可以校驗(yàn)套接字的正確性。

10.緊急指針(16位)
僅在 URG = 1 時(shí)才有意義,它指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)(緊急數(shù)據(jù)結(jié)束后就是普通數(shù)據(jù)),即指出了緊急數(shù)據(jù)的末尾在報(bào)文中的位置,注意:即使窗口為零時(shí)也可發(fā)送緊急數(shù)據(jù)。
如果 URG 為 1 ,則緊急指針標(biāo)志著緊急數(shù)據(jù)的結(jié)束。其值是緊急數(shù)據(jù)*** 1 字節(jié)的序號(hào),表示報(bào)文段序號(hào)的偏移量。例如,如果報(bào)文段的序號(hào)是 1000,前 8 個(gè)字節(jié)都是緊急數(shù)據(jù),那么緊急指針就是 8 。緊急指針一般用途是使用戶可中止進(jìn)程。
11.選項(xiàng)、填充字段
可能包括“窗口擴(kuò)大因子”、“時(shí)間戳”等選項(xiàng)。長度可變,最長可達(dá) 40 字節(jié),當(dāng)沒有使用選項(xiàng)時(shí),TCP 首部長度是 20 字節(jié)。
填充用于保證任選項(xiàng)為 32bit 的整數(shù)倍。
12.數(shù)據(jù)(長度可變)
TCP 首部結(jié)束之后的部分
UDP 報(bào)文格式

UDP 是 User Datagram Protocol 的簡稱, 中文名是用戶數(shù)據(jù)報(bào)協(xié)議,是一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。
1)源端口(2 字節(jié)):發(fā)送方端口號(hào)
2)目的端口(2 字節(jié) ):接收方端口號(hào)
3)報(bào)文長度(2 字節(jié)):UDP 用戶數(shù)據(jù)報(bào)的總長度,以字節(jié)為單位。
4)校驗(yàn)和(2 字節(jié)):檢測 UDP 用戶數(shù)據(jù)報(bào)在傳輸中是否有錯(cuò),有錯(cuò)就丟棄。
用于校驗(yàn) UDP 數(shù)據(jù)報(bào)的數(shù)字段和包含 UDP 數(shù)據(jù)報(bào)首部的“偽首部”。
偽首部, 又稱為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數(shù)據(jù)報(bào)格式中,在數(shù)據(jù)報(bào)首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協(xié)議字段、TCP 或 UDP 數(shù)據(jù)報(bào)的總長度等共12字節(jié),所構(gòu)成的擴(kuò)展首部結(jié)構(gòu)。此偽首部是一個(gè)臨時(shí)的結(jié)構(gòu),它既不向上也不向下傳遞,僅僅只是為了保證可以校驗(yàn)套接字的正確性。

5)數(shù)據(jù):UDP 的數(shù)據(jù)部分如果不為偶數(shù)需要用 0 填補(bǔ),就是說,如果數(shù)據(jù)長度為奇數(shù),數(shù)據(jù)長度加“1”。