1. 程式人生 > >TCP應用之TCP-MSS(Kind: Maximu segment size)可選欄位的實際應用之觸發TCP分片代替IP分片

TCP應用之TCP-MSS(Kind: Maximu segment size)可選欄位的實際應用之觸發TCP分片代替IP分片

前面講解過了TCP報文頭的各個欄位的含義,有興趣的童鞋可以檢視之前的部落格文件:

今天說一下TCP可選欄位中TCP-MSS(Kind: Maximu segment size)欄位的作用以及小編實際應用的場景:

當OPT的kind標記為2代表此OPT欄位是設定TCP最大報文段長度選項。一般在TCP連線初始化時(連結的雙方發SYN握手報文時),通訊雙方使用該選項來協商最大報文段長度(Max Segment Size,MSS)。

如上圖所示,此opt選項欄位總共佔四個位元組,第一個位元組是此OPT欄位的含義,第二個位元組代表此OPT欄位總共所佔的長度(就此欄位來說為4)最後兩個位元組代表此OPT選項含義的值:即TCP-MSS的值。

TCP模組通常將MSS設定為MTU(當前IP網路最大傳輸單元)-40位元組,減掉的這40位元組包括20位元組的TCP固定頭部長度和20位元組的IP固定頭部長度。這樣傳輸的TCP報文段的IP資料報的長度就不會超過MTU(假設TCP頭部和IP頭部都不包含選項欄位,並且這也是一般情況),從而避免超過IP報文的MTU造成IP分片發生。對乙太網而言,MSS值是1460(1500-40)位元組。

同樣的,當傳送的TCP報文大於TCP連結建立時通訊雙發協商好的MSS值時,會觸發TCP協議層面的分片。

IP分片場景:

當待傳送的IP資料包的長度大於當前網路中設定IP的MTU(IP報文最大傳輸單元)時,會有如下兩個處理結果:

1:當IP頭部的標誌位(Flags)的DF欄位為1(不允許IP分片)時,此報文會因長度過長而且不允許分片導致處理失敗丟包。還有就是,網路拓撲環境是複雜的,報文到達通訊的對端過程中,中間鏈路的情況不得而知,可能有更多的路由交換裝置,如果報文在源頭髮出時,符合要求發了出去,也可能因為中間路由交換裝置的MTU小於IP資料包的長度,又因為不能分片,而導致丟包的產生。

2:當IP頭部的標誌位(Flags)的DF欄位為0(允許IP分片)時,此報文會因長度過長而且允許分片而進行IP分片的報文傳送處理,允許IP分片是一種報文長度過大的解決方案,但是IP分片也有自身的問題,一般不建議使用IP分片。

為什麼要減少IP分片,以下博文做了簡單簡介,大家可以參考以下:

由於種種原因吧,為了更好進行通訊,減少不必要的報文丟失,以及IP重組問題,一般建議使用TCP分片而不建議使用IP分片。

怎麼減少IP分片,換用TCP分片?

在網路模型上看傳輸層協議TCP是在網路層協議IP之上的,不論上層的TCP報文是否進行分片,IP報文都會根據自己的分片原則進行報文分片,即:IP資料包的長度不能超過介面的MTU, 也就要求IP頭+TCP頭+TCP資料部分的總長度不能超過介面的MTU。假設IP頭、TCP頭裡沒有可選資料僅有固定的資料長度分別是20位元組,那麼TCP的資料長度就不能超過(MTU減40個位元組的資料)長度。乙太網一般的MTU值為1500即TCP一般協商的TCP-MSS的值為1460,這樣避免IP分片的產生。

現實網路拓撲環境是複雜的,即使IP報文一開始在源出口成功的不經分片傳送出去,在通訊的中間鏈路路由交換裝置上,如果介面的MTU值小於傳輸的IP資料包的長度還是會觸發IP分片,造成IP分片的種種問題。此時就要要求TCP連結在建立之初協商TCP-MSS時,通訊雙方傳送SYN報文中攜帶的TCP-MSS值足夠的小。對於TCP層來說TCP協議的規範是通過SYN報文裡面的TCP-MSS欄位的值進行通訊雙方通訊最大長度的協商。但是通訊雙方的行為是不可控的,我們無法控制雙發協商TCP-MSS的大小。

此時我們該怎樣處理?

提供處理問題的一種思路:可以在TCP捂手協商的過程之中,在SYN報文到達對端的TCP層之前,手動改變報文頭MSS可選欄位的大小 ,換成我們自己設定的值,通過改變源報文頭的方法控制TCP-MSS值的大小,以此來控制TCP報文最大的傳輸長度,迫使報文過長時進行TCP分片,而不進行IP分片,此時MSS的值是自己控制的,就可以根據網路情況,靈活更改。

具體怎麼樣實現更改MSS值的辦法,大家可以根據自身的情況進行設計。