【網絡協議】精講 TCP 數據包格式
1.TCP 報文格式
瞭解報文格式是搞懂一個通信協議的必經之路。TCP 報文由 TCP 首部 (報頭) 和應用數據構成,其中 TCP 首部是 TCP 協議的核心所在,應用數據部分是 TCP 報文的負載,如下圖所示。
以下詳細介紹各字段含義:
-
源端口 (Source Port) 和 目的端口(Destination Port):長度各爲 16 位,即 2 個字節,分別指示發送端的應用程序使用的端口號以及接收端的應用程序期望接收的端口號。它們的長度說明爲什麼計算機端口的範圍是 1-65535 (0 不使用,2^16=65536,最大位 65536 不使用)。有了源端口和目標端口,加上 IP 首部裏的源 IP 和目標 IP,就可以唯一確定一個連接。
-
序列號 (Sequence Number):長度爲 32 位,說明序列號的範圍是 [0, 2^32-1],也就是[0, 4294967295]。當序號增加到 4294967295 後,下一個序號將回到 0 重新開始。在建立連接時由計算機生成的隨機數作爲其初始值(ISN,即 Initial Sequence Number,初始序列號),通過 SYN 包傳給接收端主機,每發送一次數據,就累加一次該“數據字節數” 的大小。序列號用來解決網絡包亂序問題,實現可靠的數據傳輸和流量控制。
-
確認號 (Acknowledgment Number):長度爲 32 位,只有在 ACK 標誌位被設置時纔有效。它指示期望接收的下一個字節的序列號 (所以該字段一般都是上次接收成功的數據字節序號加 1),用於確認已經成功接收的數據。在 TCP 連接建立後,確認號的範圍通常是相對於初始序號(ISN) 的相對偏移量。如果 ISN 的初始值爲 X,那麼確認號的範圍就是[X+1, X+1+N-1],其中 N 表示已經成功接收的字節數。發送端收到這個確認應答以後可以認爲在這個序號以前的數據都已經被正常接收。確認號的範圍是[0, 2^32-1],也就是[0, 4294967295]。
-
數據偏移 (Data Offset):長度爲 4 位,指示 TCP 報文的 “數據” 起始處距離 TCP 報文起始處的距離有多遠,以 4 字節爲單位計算出的數據段開始地址的偏移值。沒有選項時該值爲 5,即 20 字節;4 位能表示的最大整數是 15,也就說明 TCP 報文裏數據開始的位置距離報文起點是 60 個字節(4*15)。這意味着 TCP 的首部長度是 20-60 個字節。
-
保留 (Reserved):長度爲 6 位,保留供將來使用,目前應設置爲零。
-
控制標誌 (Flags):長度爲 9 位,用於控制和管理 TCP 連接。各控制標誌位說明如下:
-
NS(Nonce Sum)*:用於支持一種稱爲 ECN-nonce 的 TCP 擴展機制,該機制用於增加擁塞控制的安全性,防止擁塞控制信息被惡意篡改。
-
CWR(Congestion Window Reduced):用於指示發送方減小擁塞窗口 (Congestion Window) 的大小。CWR 標誌位通常與擁塞控制機制一起使用,以應對網絡擁塞的情況。
-
ECE(ECN-Echo):ECE 標誌被設置表示發送方支持顯式擁塞通知 (Explicit Congestion Notification, ECN) 機制,並請求接收方通知其關於網絡擁塞的情況。接收方在收到設置了 ECE 標誌的 TCP 報文段後,如果網絡出現擁塞,則可以在回覆的 TCP 報文段中設置 ECN-Echo 標誌作爲響應。通過使用 ECE 標誌和 ECN-Echo 回覆,TCP 連接的發送方和接收方可以共同協調擁塞控制,以提高網絡的性能和穩定性。
-
URG(Urgent):指示報文段中包含緊急數據。當 URG=1 時,表明開啓了 urgent mode,通知接收方在處理數據時要特別注意緊急數據的處理。URG 標誌位的設置與緊急指針字段 (Urgent Pointer) 一起使用。
-
ACK(Acknowledgment):指示確認號字段有效。僅當 ACK=1 時確認號字段纔有效,當 ACK=0 時確認號無效。TCP 規定,在連接建立後所有的傳送的報文段都必須把 ACK 置爲 1。
-
PSH(Push):指示接收方應立即將數據推送給應用程序,而不是等待緩衝區填滿。當兩個應用進程進行交互式的通信時,有時一端的應用進程希望在鍵入一個命令後立即就能收到對方的響應。在這種情況下,TCP 就可以使用推送 (push) 操作。這時,發送方 TCP 把 PSH 置爲 1,並立即創建一個報文段發送出去。接收方 TCP 收到 PSH=1 的報文段,就儘快地 (即“推送” 向前)交付接收應用進程。而不用再等到整個緩存都填滿了後再向上交付。
-
RST(Reset):用於復位連接,中斷當前的通信。當 RST=1 時,表示 TCP 連接中出現異常 (如主機崩潰或其他原因) 必須強制斷開連接,然後再重新建立連接進行傳輸。RST 置爲 1 還用來拒絕一個非法的報文段或拒絕打開一個連接。
-
SYN(Synchronize):用於建立連接,發起連接請求。在連接建立時用來同步序號。當 SYN=1 而 ACK=0 時,表明這是一個連接請求報文段。對方若同意建立連接,則應在響應的報文段中使 SYN=1 和 ACK=1,因此 SYN 置爲 1 就表示這是一個連接請求或連接接受報文。
-
FIN(Finish):用於關閉連接,請求終止連接。當 FIN=1 時,表示發送方沒有數據要傳輸了,要求釋放連接。
-
窗口大小 (Window Size):長度爲 16 位,指示接收方的接收窗口大小,用於流量控制,最大的窗口大小爲 2^16-1=65535=64k。這是早期的設計,對於現在的網絡應用,可能會不太夠,因此可以在選項里加一個 窗口擴大選項,來傳輸更多的數據。窗口指的是發送本報文段一方的接受窗口 (而不是自己的發送窗口)。窗口值告訴對方:從本報文段首部中的確認號算起,接收方目前允許對方發送的數據量 (以字節爲單位)。之所以要有這個限制,是因爲接收方的數據緩存空間是有限的。總之,窗口值作爲接收方讓發送方設置其發送窗口的依據。
-
校驗和 (Checksum):長度爲 16 位,用於檢測 TCP 報文段是否在傳輸過程中發生了錯誤。校驗和計算包括報頭和數據。
-
緊急指針 (Urgent Pointer):長度爲 16 位,只有在 URG 標誌位被設置時纔有效。它指出本報文段中的緊急數據的字節數 (緊急數據結束後就是普通數據)。因此,在緊急指針指出了緊急數據的末尾在報文段中的位置。當所有緊急數據都處理完時,TCP 就告訴應用程序恢復到正常操作。值得注意的是,即使窗口爲 0 時也可以發送緊急數據。
-
選項 (Options):可選字段,長度可變,最長可達 40 個字節。當沒有使用 “選項” 時,TCP 的首部長度是 20 字節。選項字段用於提供額外的功能和控制,每個選項的開始是 1 字節的 kind 字段,說明選項的類型。一些常見的選項舉例如下:
-
最大報文段長度 (Maximum Segment Size, MSS):佔用 4 字節,通常在創建連接而設置 SYN 標誌的數據包中指明這個選項,指明本端所能接收的最大長度的報文段。通常將 MSS 設置爲 (MTU-40) 字節,攜帶 TCP 報文段的 IP 數據報的長度就不會超過 MTU(MTU 最大長度爲 1518 字節,最短爲 64 字節),從而避免本機發生 IP 分片。只能出現在同步報文段中,否則將被忽略。
-
窗口擴大因子 (Window Scale Factor):佔用 3 字節,取值 0-14。用來把 TCP 的窗口的值左移的位數,使窗口值乘倍。只能出現在同步報文段中,否則將被忽略。這是因爲現在的 TCP 接收數據緩衝區 (接收窗口) 的長度通常大於 65535 字節。
-
時間戳選項 (TCP Timestamps Option, TSopt):佔用 10 字節,其中最主要的字段是時間戳字段 (Timestamp Value field, TSval, 4 字節) 和時間戳回送回答字段 (Timestamp Echo Reply field, TSecr, 4 字節)。時間戳選項允許通信的兩端在 TCP 報文段中包含時間戳值,以便進行一些時間相關的操作和計算。
-
安全摘要選項 (TCP Authentication Option, TCP Option):用於提供數據完整性和身份驗證的功能。該選項用於對 TCP 報文段進行保護,防止數據篡改和未經授權的訪問。
數據部分:TCP 報文段中的數據部分是可選的。在一個連接建立和一個連接終止時,雙方交換的報文段僅有 TCP 首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多情況中,也會發送不帶任何數據的報文段。
2. TCP 報文結構圖示(一圖學會)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/JpnvWYzPUKX1G7X8ZGEtaw