TCP(Transmission Control Protocol 傳輸控制協(xié)議)是1種面向連接的、可靠的、基于字節(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)程。1個(gè) TCP 報(bào)文段必須包括源端口號(hào),使目的主機(jī)知道應(yīng)當(dā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ā)送1個(gè)報(bào)文時(shí),即便這些報(bào)文到達(dá)目的主機(jī)的順序不1樣,序列號(hào)也能夠使目的主機(jī)按順序排列它們。
在 SYN 標(biāo)志未置位時(shí),該字段唆使了用戶(hù)數(shù)據(jù)區(qū)中第1個(gè)字節(jié)的序號(hào);在 SYN 標(biāo)志置位時(shí),該字段唆使的是初始發(fā)送的序列號(hào)。
在建立連接時(shí)發(fā)送的第1個(gè)報(bào)文段中,雙方都提供1個(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)文段中第1個(gè)數(shù)據(jù)字節(jié)的數(shù)量就是初始序列號(hào),其后數(shù)據(jù)字節(jié)按順序編號(hào)。如果源主機(jī)使用一樣的連接發(fā)送另外一個(gè)報(bào)文段,那末這個(gè)報(bào)文段的序列號(hào)等于前1個(gè)報(bào)文段的序列號(hào)與前1個(gè)報(bào)文段中數(shù)據(jù)字節(jié)的數(shù)量之和。例如,假定源主機(jī)發(fā)送 3 個(gè)報(bào)文段,每一個(gè)報(bào)文段有 100 字節(jié)的數(shù)據(jù),且第1個(gè)報(bào)文段的序列號(hào)是 1000,那末第2個(gè)報(bào)文段的序列號(hào)就是 1100(1000 + 100),第3個(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)等于順序接收到的最后1個(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)等于前1個(gè)報(bào)文段的序列號(hào)與前1個(gè)報(bào)文段中數(shù)據(jù)字節(jié)的數(shù)量之和。例如,假定源主機(jī)發(fā)送 3 個(gè)報(bào)文段,每一個(gè)報(bào)文段有 100 字節(jié)的數(shù)據(jù),且第1個(gè)報(bào)文段的序列號(hào)是 1000,那末接收到第1個(gè)報(bào)文段后,目的主機(jī)返回含確認(rèn)號(hào)1100 的報(bào)頭。接收到第2個(gè)報(bào)文段(其序號(hào)為 1100 )后,目的主機(jī)返回確認(rèn)號(hào) 1200。接收到第3個(gè)報(bào)文段后,目的主機(jī)返回確認(rèn)號(hào) 1300 。
目的主機(jī)不1定在每次接收到報(bào)文段后都返回確認(rèn)號(hào)。在上面的例子中,目的主機(jī)可能等到所有 3 個(gè)報(bào)文段都收到后,再返回1個(gè)含確認(rèn)號(hào) 1300 的報(bào)文段,表示已接收到全部 1200 字節(jié)的數(shù)據(jù)。但是如果目的主機(jī)再發(fā)回確認(rèn)號(hào)之前等待時(shí)間太長(zhǎng),源主機(jī)會(huì)認(rèn)為數(shù)據(jù)沒(méi)有到達(dá)目的主機(jī),并自動(dòng)重發(fā)。
上面的例子中,如果目的主機(jī)接收到了報(bào)文段號(hào)為 1000 的第1個(gè)報(bào)文段和報(bào)文段號(hào)為 1200 的最后1個(gè)報(bào)文段,則可返回確認(rèn)號(hào) 1100,但是再返回確認(rèn)號(hào) 1300 之前,應(yīng)當(dāng)?shù)却龍?bào)文段號(hào)為 1100 的中間報(bào)文段。
5) 數(shù)據(jù)偏移(首部長(zhǎng)度)(4位)
TCP 報(bào)文段的數(shù)據(jù)起始處距離 TCP 報(bào)文段的起始處有多遠(yuǎn),即首部長(zhǎng)度。由于 TCP 報(bào)頭的長(zhǎng)度隨 TCP 選項(xiàng)字段內(nèi)容的不同而變化,因此報(bào)頭中包括1個(gè)指定報(bào)頭字段的字段。該字段以 32 比特為單位,所以報(bào)頭長(zhǎng)度1定是 32 比特的整數(shù)倍,有時(shí)需要在報(bào)頭末尾補(bǔ) 0 。如果報(bào)頭沒(méi)有 TCP 選項(xiàng)字段,則報(bào)頭長(zhǎng)度值為 5 ,表示報(bào)頭1個(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ī)定,在連接建立后所有轉(zhuǎn)達(dá)的報(bào)文段都必須把 ACK 置 1。
推送 PSH:當(dāng)兩個(gè)利用進(jìn)程進(jìn)行交互式的通訊時(shí),有時(shí)在1真?zhèn)€利用進(jìn)程希望在鍵入1個(gè)命令后立即就可以夠收到對(duì)方的響應(yīng)。在這類(lèi)情況下,TCP 就能夠使用推送(push)操作,這時(shí)候,發(fā)送方 TCP 把 PSH 置 1 ,并立即創(chuàng)建1個(gè)報(bào)文段發(fā)送出去,接收方收到 PSH = 1 的報(bào)文段,就盡快地(即“推送”向前)交付給接收利用進(jìn)程,而不再等到全部緩存都填滿(mǎn)后再向上交付。
復(fù)位 RST:用于復(fù)位相應(yīng)的 TCP 連接
同步 SYN:僅在3次握手建立 TCP 連接時(shí)有效。當(dāng) SYN = 1 而 ACK = 0 時(shí),表明這是1個(gè)連接要求報(bào)文段,對(duì)方若同意建立連接,則應(yīng)在相應(yīng)的報(bào)文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示這是1個(gè)連接要求或連接接受報(bào)文。
終止 FIN:用來(lái)釋放1個(gè)連接。當(dāng) FIN = 1 時(shí),表明此報(bào)文段的發(fā)送方的數(shù)據(jù)已發(fā)送終了,并要求釋放運(yùn)輸連接。
8)窗口(16位)
此字段用來(lái)進(jìn)行流量控制,這個(gè)值是本機(jī)期望1次接收的字節(jié)數(shù),即發(fā)送數(shù)據(jù)的窗口大小。告知對(duì)方在不等待確認(rèn)的情況下,可以發(fā)來(lái)多大的數(shù)據(jù)。這里表示的最大長(zhǎng)度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用選項(xiàng)中的窗口擴(kuò)大因子選項(xiàng)。
指發(fā)送本報(bào)文段的1方的接收窗口(而不是自己的發(fā)送窗口)。
9)校驗(yàn)和(16位)
源主機(jī)和目的主機(jī)根據(jù) TCP 報(bào)文段和偽報(bào)頭的內(nèi)容計(jì)算校驗(yàn)和。在偽報(bào)頭中寄存著來(lái)自 IP 報(bào)頭和 TCP 報(bào)文段長(zhǎng)度信息。與 UDP 1樣,偽報(bào)頭其實(shí)不在網(wǎng)絡(luò)中傳輸,并且在校驗(yàn)和中包括偽報(bào)頭的目的是為了避免目的主機(jī)毛病地接收存在路由的毛病數(shù)據(jù)報(bào)。
偽首部,又稱(chēng)為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數(shù)據(jù)報(bào)格式中,在數(shù)據(jù)報(bào)首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協(xié)議字段、TCP 或 UDP 數(shù)據(jù)報(bào)的總長(zhǎng)度等共12字節(jié),所構(gòu)成的擴(kuò)大首部結(jié)構(gòu)。此偽首部是1個(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 。緊急指針1般用處是使用戶(hù)可中斷進(jìn)程。
11)選項(xiàng)、填充字段
可能包括“窗口擴(kuò)大因子”、“時(shí)間戳”等選項(xiàng)。長(zhǎng)度可變,最長(zhǎng)可達(dá) 40 字節(jié),當(dāng)沒(méi)有使用選項(xiàng)時(shí),TCP 首部長(zhǎng)度是 20 字節(jié)。
填充用于保證任選項(xiàng)為 32bit 的整數(shù)倍。
12)數(shù)據(jù)(長(zhǎng)度可變)
TCP 首部結(jié)束以后的部份
UDP 是 User Datagram Protocol 的簡(jiǎn)稱(chēng), 中文名是用戶(hù)數(shù)據(jù)報(bào)協(xié)議,是1種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。
1)源端口(2 字節(jié)):發(fā)送方端口號(hào)
2)目的端口(2 字節(jié) ):接收方端口號(hào)
3)報(bào)文長(zhǎng)度(2 字節(jié)):UDP 用戶(hù)數(shù)據(jù)報(bào)的總長(zhǎng)度,以字節(jié)為單位。
4)校驗(yàn)和(2 字節(jié)):檢測(cè) UDP 用戶(hù)數(shù)據(jù)報(bào)在傳輸中是不是有錯(cuò),有錯(cuò)就拋棄。
用于校驗(yàn) UDP 數(shù)據(jù)報(bào)的數(shù)字段和包括 UDP 數(shù)據(jù)報(bào)首部的“偽首部”。
偽首部,又稱(chēng)為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數(shù)據(jù)報(bào)格式中,在數(shù)據(jù)報(bào)首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協(xié)議字段、TCP 或 UDP 數(shù)據(jù)報(bào)的總長(zhǎng)度等共12字節(jié),所構(gòu)成的擴(kuò)大首部結(jié)構(gòu)。此偽首部是1個(gè)臨時(shí)的結(jié)構(gòu),它既不向上也不向下傳遞,僅僅只是為了保證可以校驗(yàn)套接字的正確性。
5)數(shù)據(jù):UDP 的數(shù)據(jù)部份如果不為偶數(shù)需要用 0 彌補(bǔ),就是說(shuō),如果數(shù)據(jù)長(zhǎng)度為奇數(shù),數(shù)據(jù)長(zhǎng)度加“1”。