TCP報文段首部格式詳解


TCP首部格式

 

 

格式字段詳解

 
源端口、目標端口:
  計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16位表示的,可推算計算機的端口個數為2^16個。
序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由於序列號由32位表示,所以每2^32個字節,就會出現序列號回繞,再次從 0 開始。那如何區分兩個相同序列號的不同TCP報文段就是一個問題了,后面會有答案,暫時可以不管。
確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送發:我希望你(指發送方)下次發送的數據的第一個字節數據的編號是這個確認號。也就是告訴發送方:我希望你(指發送方)下次發送給我的TCP報文段的序列號字段的值是這個確認號。

序號 Sequence Number

占 4 個字節。
TCP 是面向字節流的,在一個 TCP 連接中傳輸的字節流中的每個字節都按照順序編號。
例如 100 kb 的 HTML 文檔數據,一共 102400 (100 * 1024) 個字節,那么每一個字節就都有了編號,整個文檔的編號的范圍是 0 ~ 102399。

序號字段值指的是本報文段所發送的數據的第一個字節的序號。
那么 100 的 HTML 文檔分割成四個等分之后,
第一個 TCP 報文段包含的是第一個 25kb 的數據,0 ~ 25599 字節, 該報文的序號的值就是:0
第二個 TCP 報文段包含的是第二個 25kb 的數據,25600 ~ 51199 字節,該報文的序號的值就是:25600
......

根據 8 位 = 1 字節,那么 4 個字節可以表示的數值范圍:[0, 2^32],一共 2^32 (4294967296) 個序號。
序號增加到最大值的時候,下一個序號又回到了 0.
也就是說 TCP 協議可對 4GB 的數據進行編號,在一般情況下可保證當序號重復使用時,舊序號的數據早已經通過網絡到達終點或者丟失了。

+

 

確認號 Acknowledgemt Number

占 4 個字節。
表示期望收到對方下一個報文段的序號值。
TCP 的可靠性,是建立在「每一個數據報文都需要確認收到」的基礎之上的。
就是說,通訊的任何一方在收到對方的一個報文之后,都要發送一個相對應的「確認報文」,來表達確認收到。
那么,確認報文,就會包含確認號。
例如,通訊的一方收到了第一個 25kb 的報文,該報文的 序號值=0,那么就需要回復一個確認報文,其中的確認號 = 25600.

 

 

TCP首部長度:
  由於TCP首部包含一個長度可變的選項部分,所以需要這么一個值來指定這個TCP報文段到底有多長。或者可以這么理解:就是表示TCP報文段中數據部分在整個TCP報文段中的位置。該字段的單位是32位字,即:4個字節。

保留 Reserved

占 0.75 個字節 (6 位)。
保留為今后使用,但目前應置為 0。

URG:
  表示本報文段中發送的數據是否包含緊急數據。URG=1,表示有緊急數據。后面的緊急指針字段只有當URG=1時才有效。
ACK:
  表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立后,ACK必須為1。
PSH:
  告訴對方收到該報文段后是否應該立即把數據推送給上層。如果為1,則表示對方應當立即把數據提交給上層,而不是緩存起來。
RST:
  只有當RST=1時才有用。如果你收到一個RST=1的報文,說明你與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后再重新建立連接。或者說明你上次發送給主機的數據有問題,主機拒絕響應。
SYN:
  在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1。
FIN:標記數據是否發送完畢。如果FIN=1,就相當於告訴對方:“我的數據已經發送完畢,你可以釋放連接了”
 
窗口大小:
  表示現在運行對方發送的數據量。也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量。
 
校驗和:
  提供額外的可靠性。具體如何校驗,參考其他資料。
 
緊急指針:
  標記緊急數據在數據字段中的位置。
 
選項部分:
  其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,那么選項部分最長為:(2^4-1)*4-20=40字節。
選項部分的應用:

  MSS最大報文段長度(Maxium Segment Size):指明數據字段的最大長度,數據字段的長度加上TCP首部的長度才等於整個TCP報文段的長度。MSS值指示自己期望對方發送TCP報文段時那個數據字段的長度。通信雙方可以有不同的MSS值。如果未填寫,默認采用536字節。MSS只出現在SYN報文中。即:MSS出現在SYN=1的報文段中。

  窗口擴大選項(Windows Scaling):由於TCP首部的窗口大小字段長度是16位,所以其表示的最大數是65535。但是隨着時延和帶寬比較大的通信產生(如衛星通信),需要更大的窗口來滿足性能和吞吐率,所以產生了這個窗口擴大選項。

  SACK選擇確認項(Selective Acknowledgements):用來確保只重傳缺少的報文段,而不是重傳所有報文段。比如主機A發送報文段1、2、3,而主機B僅收到報文段1、3。那么此時就需要使用SACK選項來告訴發送方只發送丟失的數據。那么又如何指明丟失了哪些報文段呢?使用SACK需要兩個功能字節。一個表示要使用SACK選項,另一個指明這個選項占用多少字節。描述丟失的報文段2,是通過描述它的左右邊界報文段1、3來完成的。而這個1、3實際上是表示序列號,所以描述一個丟失的報文段需要64位即8個字節的空間。那么可以推算整個選項字段最多描述(40-2)/8=4個丟失的報文段。

  時間戳選項(Timestamps):可以用來計算RTT(往返時間),發送方發送TCP報文時,把當前的時間值放入時間戳字段,接收方收到后發送確認報文時,把這個時間戳字段的值復制到確認報文中,當發送方收到確認報文后即可計算出RTT。也可以用來防止回繞序號PAWS,也可以說可以用來區分相同序列號的不同報文。因為序列號用32為表示,每2^32個序列號就會產生回繞,那么使用時間戳字段就很容易區分相同序列號的不同報文。

  NOP(NO-Operation):它要求選項部分中的每種選項長度必須是4字節的倍數,不足的則用NOP填充。同時也可以用來分割不同的選項字段。如窗口擴大選項和SACK之間用NOP隔開。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM