TCP報文段首部結構
TCP雖然是面向字節流的,但TCP傳送的數據單元卻是報文段。
TCP
報文段如APR
報文、IP
數據報一樣,也是由首部
與數據區域
組成,TCP首部
內容很豐富,各個字段都有特定的含義,一般來說TCP
首部只有20個字節,TCP報文段首部的前20
個字節是固定的,后面有4N
字節是根據需要而增加的選項字段(N是整數)。因此TCP
首部的最小長度是20
字節。
在LwIP
中,TCP
首部采用一個名字叫tcp_hdr
的結構體進行描述,此處用PACK_STRUCT_BEGIN與PACK_STRUCT_END宏定義禁止編譯器對齊,因為在tcp
首部中存在某些字段是以1
字節對齊的。
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); /* 序號 */
6 PACK_STRUCT_FIELD(u32_t ackno); /* 確認序號 */
7 PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); /* 首部長度+保留位+標志位 */
8 PACK_STRUCT_FIELD(u16_t wnd); /* 窗口大小 */
9 PACK_STRUCT_FIELD(u16_t chksum); /* 校驗和 */
10 PACK_STRUCT_FIELD(u16_t urgp); /* 緊急指針 */
11} PACK_STRUCT_STRUCT;
12PACK_STRUCT_END
TCP報文段首部(圖片來源《計算機網絡》-謝希仁)
首部固定部分各字段的意義如下:* 每個TCP
報文段都包含源主機
和目標主機
的端口號,各占2
個字節,用于尋找發送端和接收端應用線程,這兩個值加上I P首部中的源I P地址和目標I P地址就能確定唯一一個TCP連接。
- 序號字段占
4
字節,序號范圍是[0,4294967295]
,序號增加到4284967295
后,下一個序號就又回到0
,主要是用來標識從TCP發送端
向TCP接收端
發送的數據字節流,它的值表示在這個報文段中的第一個數據字節所處位置嗎,根據接收到的數據區域長度,就能計算出報文最后一個數據所處的序號,因為TCP
會對發送或者接收的數據進行編號(按字節流的形式),那么使用序號對每個字節進行計數,就能很輕易管理這些數據。TCP報文段的初始序列號(ISN
)是隨機的,可能是0~4294967295
之間的任意值. - 既然
TCP
給每個傳輸的字節都了編號,那么確認序號就包含接收端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到數據的最后一個字節序號加1
。當然,只有ACK
標志為1
時確認序號字段才有效
,TCP為應用層提供全雙工服務,這意味數據能在兩個方向上獨立地進行傳輸,因此確認序號通常會與反向數據(即接收端傳輸給發送端的數據)封裝在同一個報文中(即捎帶
),所以連接的每一端都必須保持每個方向上的傳輸數據序號準確性
。 - 首部長度字段占據
4bit
空間(或者稱數據偏移字段),它指出了TCP報文段首部長度
,以字節為單位,最大能記錄15*4=60
字節的首部長度,因此,TCP報文段首部最大長度為60字節
。在首部長度字段后接下來有6bit
空間是保留
未用的。 TCP
報文段首部的標志字段
:URG
:首部中的緊急指針字段標志,如果是1表示緊急指針字段有效。ACK
:首部中的確認序號字段標志,如果是1表示確認序號字段有效。PSH
:該字段置1表示接收方應該盡快將這個報文段交給應用層。RST
:重新建立TCP連接。SYN
:握手,發起連接。FIN
:結束連接。- TCP的流量控制由連接的每一端通過
聲明的窗口
大小來提供,窗口大小為字節數,起始于確認序號字段指明的值
,這個值是接收端正期望接收的數據序號,發送方根據窗口大小調整發送數據,以實現流量控制。窗口大小是一個占據16 bit空間的字段,因而窗口最大為65535
字節,當接收方告訴發送方一個大小為0的窗口時,將完全阻止發送方的數據發送。 - 只有當
URG
標志置1時緊急指針才有效,緊急指針是一個正的偏移量
,和序號字段中的值相加表示緊急數據最后一個字節的序號。簡單來說,本TCP報文段的緊急數據在報文段數據區域中,從序號字段開始,偏移緊急指針的值結束。
抓包分析
使用wireshark
抓包工具分析:
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
TCP
+關注
關注
8文章
1353瀏覽量
79055 -
字節
+關注
關注
0文章
40瀏覽量
13727 -
apr
+關注
關注
0文章
11瀏覽量
6479
發布評論請先 登錄
相關推薦
SYN Flood攻擊的原理是什么?如何實現呢
隨便設置,但盡量不要太小。校驗和檢驗的范圍包括首部和數據兩部分,在計算校驗和時,要在 TCP 報文段前面加上 12 字節的偽首部。 偽首部的
發表于 07-19 14:40
LWIP TCP報文基礎知識及其LWIP中TCP協議的實現
首部只有 20 個字節,具體見上圖。在 LwIP 中,報文段首部采用一個名字叫 tcp_hdr 的結構體進行描述。PACK_STRUCT_
發表于 10-18 14:54
無線鏈路的TCP性能問題及其改善
介紹了無線鏈路上的TCP性能問題和相關的工作。提出了一種改進從移動主機到固定網絡方向TCP性能的方案,在基站處設置TCP代理來監視在無線鏈路上丟失的TCP
發表于 02-27 16:08
?28次下載
icmp報文和ip報文分析
. ICMP允許主機或路由報告差錯情況和提供有關異常情況。ICMP是因特網的標準協議,但ICMP不是高層協議,而是IP層的協議。通常ICMP報文被IP層或更高層協議(TCP或UDP)使用。一些ICMP報文把差錯
發表于 11-03 09:09
?9965次閱讀
tcp報文格式詳解
TCP(Transmission ControProtocol)傳輸控制協議是一種面向連接的、可靠的、基于字節流的傳輸層協議。TCP報文是TCP層傳輸的數據單元,也稱為
發表于 12-08 11:11
?3.3w次閱讀
基于網絡編碼的TCP協議傳輸系統
方對原始TCP報文段編碼,在接收方解碼,并針對網絡實時丟失率調整編碼報文段的發送冗余,以達到向TCP層掩蓋丟失的目的;同時加入處理器共享技術,該技術旨在用一個合適的初始速率來代替
淺析C++基礎語法之計算機網絡中傳輸層(TCP&UDP)
③可靠交互 ④全雙工通信 ⑤面向字節流 TCP 如何保證可靠傳輸: ①確認和超時重傳 ②數據合理分片和排序 ③流量控制 ④擁塞控制 ⑤數據校驗 TCP 報文結構
詳解TCP報文的頭部結構
和兩個端口號。一個TCP連接通常分為三個階段:連接、數據傳輸、退出(關閉)。通過三次握手建立一個鏈接,通過四次揮手來關閉一個連接。當一個連接被建立或被終止時,交換的報文段只包含TCP頭部,而沒有數據。
TCP是如何實現可靠傳輸 HTTP與HTTPS的區別
數據偏移(占4字位):數據部分的起始位置離報文段起始位置的距離,就是報文首部的長度,單位是4字節,所以4位能表示最大值是十進制的15,就是15 x 4字節 = 60字節,TCP報文首部
發表于 11-21 21:38
?840次閱讀
TCP和UDP分別是什么 TCP和UDP協議各有什么特點
在 TCP 四次揮手的最后一步,客戶端進入 TIME_WAIT 狀態,需要等待一段時間再進入 CLOSED 狀態。等待時間通常是兩個最大報文段生命周期,即 2MSL,這是為了確保服務器端能夠收到客戶端發送的最后一個 ACK 報文
評論