TCP頭部的最后一個選項字段(options)是可變長的可選信息。這部分最多包含40字節,因為TCP頭部最長是60字節(其中還包含前面討論的20字節的固定部分)。典型的TCP頭部選項結構如圖所示。
- 選項的第一個字段kind說明選項的類型
有的TCP選項沒有后面兩個字段,僅包含1字節的kind字段 - 第二個字段length(如果有的話)指定該選項的總長度
該長度包括kind字段和length字段占據的2字節 - 第三個字段info(如果有的話)是選項的具體信息
常見的TCP選項有7種,如圖所示
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 內核變量來啟用或關閉時間戳選項。
喜歡這篇文章?歡迎打賞~~