TCP報頭——TCP options

TCP頭部的最後一個選項字段(options)是可變長的可選信息。這部分最多包含40字節,因爲TCP頭部最長是60字節(其中還包含前面討論的20字節的固定部分)。典型的TCP頭部選項結構如圖所示。

TCP報頭——TCP options
選項的第一個字段kind說明選項的類型
有的TCP選項沒有後面兩個字段,僅包含1字節的kind字段
第二個字段length(如果有的話)指定該選項的總長度
該長度包括kind字段和length字段佔據的2字節
第三個字段info(如果有的話)是選項的具體信息
常見的TCP選項有7種,如圖所示

TCP報頭——TCP options
1、kind=0,選項表結束(EOP)選項
一個報文段僅用一次。放在末尾用於填充,用途是說明:首部已經沒有更多的消息,應用數據在下一個32位字開始處

2、kind=1,空操作(NOP)選項
沒有特殊含義,一般用於將TCP選項的總長度填充爲4字節的整數倍

3、kind=2,最大報文段長度(MSS)選項
TCP連接初始化時,通信雙方使用該選項來協商最大報文段長度。TCP模塊通常將MSS設置爲(MTU-40)字節(減掉的這40字節包括20字節的TCP頭部和20字節的IP頭部)。這樣攜帶TCP報文段的IP數據報的長度就不會超過MTU(假設TCP頭部和IP頭部都不包含選項字段,並且這也是一般情況),從而避免本機發生IP分片。對以太網而言,MSS值是1460(1500-40)字節。

4、kind=3,窗口擴大因子選項
TCP連接初始化時,通信雙方使用該選項來協商接收窗口的擴大因子。在TCP的頭部中,接收窗口大小是用16位表示的,故最大爲65535字節,但實際上TCP模塊允許的接收窗口大小遠不止這個數(爲了提高TCP通信的吞吐量)。窗口擴大因子解決了這個問題。
假設TCP頭部中的接收通告窗口大小是N,窗口擴大因子(移位數)是M,那麼TCP報文段的實際接收通告窗口大小是N*2M,或者說N左移M位。注意,M的取值範圍是0~14。我們可以通過修改 /proc/sys/net/ipv4/tcp_window_scaling 內核變量來啓用或關閉窗口擴大因子選項。
和MSS選項一樣,窗口擴大因子選項只能出現在同步報文段中,否則將被忽略。但同步報文段本身不執行窗口擴大操作,即同步報文段頭部的接收窗口大小就是該TCP報文段的實際接收窗口大小。當連接建立好之後,每個數據傳輸方向的窗口擴大因子就固定不變了。

5、kind=4,選擇性確認(Selective Acknowledgment,SACK)選項
TCP通信時,如果某個TCP報文段丟失,則TCP會重傳最後被確認的TCP報文段後續的所有報文段,這樣原先已經正確傳輸的TCP報文段也可能重複發送,從而降低了TCP性能。SACK技術正是爲改善這種情況而產生的,它使TCP只重新發送丟失的TCP報文段,而不用發送所有未被確認的TCP報文段。選擇性確認選項用在連接初始化時,表示是否支持SACK技術。我們可以通過修改 /proc/sys/net/ipv4/tcp_sack 內核變量來啓用或關閉選擇性確認選項。

6、kind=5,SACK實際工作的選項
該選項的參數告訴發送方本端已經收到並緩存的不連續的數據塊,從而讓發送端可以據此檢查並重發丟失的數據塊。每個塊邊沿(edge of block)參數包含一個4字節的序號。其中塊左邊沿表示不連續塊的第一個數據的序號,而塊右邊沿則表示不連續塊的最後一個數據的序號的下一個序號。這樣一對參數(塊左邊沿和塊右邊沿)之間的數據是沒有收到的。因爲一個塊信息佔用8字節,所以TCP頭部選項中實際上最多可以包含4個這樣的不連續數據塊(考慮選項類型和長度佔用的2字節)。

7、kind=8,時間戳選項。
該選項提供了較爲準確的計算通信雙方之間的迴路時間(Round Trip Time,RTT)的方法,從而爲TCP流量控制提供重要信息。我們可以通過修改 /proc/sys/net/ipv4/tcp_timestamps 內核變量來啓用或關閉時間戳選項。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章