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.
保留 Reserved
占 0.75 個字節 (6 位)。
保留為今后使用,但目前應置為 0。
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隔開。
