TCP報(bào)文段首部結(jié)構(gòu)
TCP雖然是面向字節(jié)流的,但TCP傳送的數(shù)據(jù)單元卻是報(bào)文段。
TCP
報(bào)文段如APR
報(bào)文、IP
數(shù)據(jù)報(bào)一樣,也是由首部
與數(shù)據(jù)區(qū)域
組成,TCP首部
內(nèi)容很豐富,各個(gè)字段都有特定的含義,一般來(lái)說(shuō)TCP
首部只有20個(gè)字節(jié),TCP報(bào)文段首部的前20
個(gè)字節(jié)是固定的,后面有4N
字節(jié)是根據(jù)需要而增加的選項(xiàng)字段(N是整數(shù))。因此TCP
首部的最小長(zhǎng)度是20
字節(jié)。
在LwIP
中,TCP
首部采用一個(gè)名字叫tcp_hdr
的結(jié)構(gòu)體進(jìn)行描述,此處用PACK_STRUCT_BEGIN與PACK_STRUCT_END宏定義禁止編譯器對(duì)齊,因?yàn)樵?code>tcp首部中存在某些字段是以1
字節(jié)對(duì)齊的。
1PACK_STRUCT_BEGIN
2struct tcp_hdr {
3 PACK_STRUCT_FIELD(u16_t src); /* 源端口 */
4 PACK_STRUCT_FIELD(u16_t dest); /* 目的端口 */
5 PACK_STRUCT_FIELD(u32_t seqno); /* 序號(hào) */
6 PACK_STRUCT_FIELD(u32_t ackno); /* 確認(rèn)序號(hào) */
7 PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); /* 首部長(zhǎng)度+保留位+標(biāo)志位 */
8 PACK_STRUCT_FIELD(u16_t wnd); /* 窗口大小 */
9 PACK_STRUCT_FIELD(u16_t chksum); /* 校驗(yàn)和 */
10 PACK_STRUCT_FIELD(u16_t urgp); /* 緊急指針 */
11} PACK_STRUCT_STRUCT;
12PACK_STRUCT_END
TCP報(bào)文段首部(圖片來(lái)源《計(jì)算機(jī)網(wǎng)絡(luò)》-謝希仁)
首部固定部分各字段的意義如下:* 每個(gè)TCP
報(bào)文段都包含源主機(jī)
和目標(biāo)主機(jī)
的端口號(hào),各占2
個(gè)字節(jié),用于尋找發(fā)送端和接收端應(yīng)用線程,這兩個(gè)值加上I P首部中的源I P地址和目標(biāo)I P地址就能確定唯一一個(gè)TCP連接。
- 序號(hào)字段占
4
字節(jié),序號(hào)范圍是[0,4294967295]
,序號(hào)增加到4284967295
后,下一個(gè)序號(hào)就又回到0
,主要是用來(lái)標(biāo)識(shí)從TCP發(fā)送端
向TCP接收端
發(fā)送的數(shù)據(jù)字節(jié)流,它的值表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)所處位置嗎,根據(jù)接收到的數(shù)據(jù)區(qū)域長(zhǎng)度,就能計(jì)算出報(bào)文最后一個(gè)數(shù)據(jù)所處的序號(hào),因?yàn)?code>TCP會(huì)對(duì)發(fā)送或者接收的數(shù)據(jù)進(jìn)行編號(hào)(按字節(jié)流的形式),那么使用序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù),就能很輕易管理這些數(shù)據(jù)。TCP報(bào)文段的初始序列號(hào)(ISN
)是隨機(jī)的,可能是0~4294967295
之間的任意值. - 既然
TCP
給每個(gè)傳輸?shù)淖止?jié)都了編號(hào),那么確認(rèn)序號(hào)就包含接收端所期望收到的下一個(gè)序號(hào),因此,確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)的最后一個(gè)字節(jié)序號(hào)加1
。當(dāng)然,只有ACK
標(biāo)志為1
時(shí)確認(rèn)序號(hào)字段才有效
,TCP為應(yīng)用層提供全雙工服務(wù),這意味數(shù)據(jù)能在兩個(gè)方向上獨(dú)立地進(jìn)行傳輸,因此確認(rèn)序號(hào)通常會(huì)與反向數(shù)據(jù)(即接收端傳輸給發(fā)送端的數(shù)據(jù))封裝在同一個(gè)報(bào)文中(即捎帶
),所以連接的每一端都必須保持每個(gè)方向上的傳輸數(shù)據(jù)序號(hào)準(zhǔn)確性
。 - 首部長(zhǎng)度字段占據(jù)
4bit
空間(或者稱數(shù)據(jù)偏移字段),它指出了TCP報(bào)文段首部長(zhǎng)度
,以字節(jié)為單位,最大能記錄15*4=60
字節(jié)的首部長(zhǎng)度,因此,TCP報(bào)文段首部最大長(zhǎng)度為60字節(jié)
。在首部長(zhǎng)度字段后接下來(lái)有6bit
空間是保留
未用的。 TCP
報(bào)文段首部的標(biāo)志字段
:URG
:首部中的緊急指針字段標(biāo)志,如果是1表示緊急指針字段有效。ACK
:首部中的確認(rèn)序號(hào)字段標(biāo)志,如果是1表示確認(rèn)序號(hào)字段有效。PSH
:該字段置1表示接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層。RST
:重新建立TCP連接。SYN
:握手,發(fā)起連接。FIN
:結(jié)束連接。- TCP的流量控制由連接的每一端通過(guò)
聲明的窗口
大小來(lái)提供,窗口大小為字節(jié)數(shù),起始于確認(rèn)序號(hào)字段指明的值
,這個(gè)值是接收端正期望接收的數(shù)據(jù)序號(hào),發(fā)送方根據(jù)窗口大小調(diào)整發(fā)送數(shù)據(jù),以實(shí)現(xiàn)流量控制。窗口大小是一個(gè)占據(jù)16 bit空間的字段,因而窗口最大為65535
字節(jié),當(dāng)接收方告訴發(fā)送方一個(gè)大小為0的窗口時(shí),將完全阻止發(fā)送方的數(shù)據(jù)發(fā)送。 - 只有當(dāng)
URG
標(biāo)志置1時(shí)緊急指針才有效,緊急指針是一個(gè)正的偏移量
,和序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。簡(jiǎn)單來(lái)說(shuō),本TCP報(bào)文段的緊急數(shù)據(jù)在報(bào)文段數(shù)據(jù)區(qū)域中,從序號(hào)字段開(kāi)始,偏移緊急指針的值結(jié)束。
抓包分析
使用wireshark
抓包工具分析:
-
TCP
+關(guān)注
關(guān)注
8文章
1379瀏覽量
79341 -
字節(jié)
+關(guān)注
關(guān)注
0文章
41瀏覽量
13818 -
apr
+關(guān)注
關(guān)注
0文章
11瀏覽量
6502
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
![](https://file1.elecfans.com/web2/M00/85/2B/wKgZomRmI3qAdlsUAAAbAAOD8Gc484.png)
#硬聲創(chuàng)作季 計(jì)算機(jī)通信與網(wǎng)絡(luò):3.8TCP報(bào)文段首部結(jié)構(gòu)
![](https://file1.elecfans.com/web2/M00/87/FE/wKgZomRmnrmAMoRLAABnFrO-Vu0813.png)
SYN Flood攻擊的原理是什么?如何實(shí)現(xiàn)呢
LWIP TCP報(bào)文基礎(chǔ)知識(shí)及其LWIP中TCP協(xié)議的實(shí)現(xiàn)
無(wú)線鏈路的TCP性能問(wèn)題及其改善
icmp報(bào)文和ip報(bào)文分析
![icmp<b class='flag-5'>報(bào)文</b>和ip<b class='flag-5'>報(bào)文</b><b class='flag-5'>分析</b>](https://file1.elecfans.com//web2/M00/A6/DC/wKgZomUMQOuADxwEAAAZThfhM4w724.png)
tcp報(bào)文格式詳解
![<b class='flag-5'>tcp</b><b class='flag-5'>報(bào)文</b>格式詳解](https://file1.elecfans.com//web2/M00/A7/0C/wKgZomUMQgyAO589AAArGITYVFY810.png)
基于網(wǎng)絡(luò)編碼的TCP協(xié)議傳輸系統(tǒng)
![基于網(wǎng)絡(luò)編碼的<b class='flag-5'>TCP</b>協(xié)議傳輸系統(tǒng)](https://file1.elecfans.com//web2/M00/A7/37/wKgZomUMQxCAJCw5AAAQ-0xWS6M769.jpg)
tcp數(shù)據(jù)包接口封裝的介紹
![<b class='flag-5'>tcp</b>數(shù)據(jù)包接口封裝的介紹](https://file.elecfans.com/web1/M00/E6/0E/o4YBAGBX9jiAdOhpAAAo7T23cKI327.png)
淺析C++基礎(chǔ)語(yǔ)法之計(jì)算機(jī)網(wǎng)絡(luò)中傳輸層(TCP&UDP)
![淺析C++基礎(chǔ)語(yǔ)法之計(jì)算機(jī)網(wǎng)絡(luò)中傳輸層(<b class='flag-5'>TCP</b>&UDP)](https://file.elecfans.com/web2/M00/19/C7/pYYBAGF3Y2WAMuNSAAAK6F5n9t0230.png)
詳解TCP報(bào)文的頭部結(jié)構(gòu)
如何解釋TCP報(bào)文的內(nèi)容
TCP是如何實(shí)現(xiàn)可靠傳輸 HTTP與HTTPS的區(qū)別
基于TCP應(yīng)用層協(xié)議
![基于<b class='flag-5'>TCP</b>應(yīng)用層協(xié)議](https://file1.elecfans.com/web2/M00/AF/70/wKgZomVO86mARy_pAAKHHxEUDqU512.jpg)
評(píng)論