TCP 協議中MSS的理解

在介紹MSS之前我們必須要理解下面的幾個重要的概念。
MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小
PPPoE: PPP Over Ethernet(在以太網上承載PPP協議),就是因爲這個協議的出現我們纔有必要修改我們的MSS或者是MTU值。
MTU最大傳輸單元,這個最大傳輸單元實際上和鏈路層協議有着密切的關係,EthernetII幀的結構DMAC+SMAC+Type+Data+CRC
           由於以太網傳輸電氣方面的限制,每個以太網幀都有最小的大小64bytes最大不能超過1518bytes,對於小於或者大於這個限制的以太網幀我們都可以視之爲錯誤的數據幀,一般的以太網轉發設備會丟棄這些數據幀。
由 於以太網EthernetII最大的數據幀是1518Bytes這樣,刨去以太網幀的幀頭(DMAC目的MAC地址 48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分 4Bytes(這個部分有時候也把它叫做FCS),那麼剩下承載上層協議的地方也就是Data域最大就只能有1500Bytes,這個值我們就把它稱之爲 MTU。這個就是網絡層協議非常關心的地方,因爲網絡層協議比如IP協議會根據這個值來決定是否把上層傳下來的數據進行分片。

        當兩臺遠程PC互聯的時候,它們的數據需要穿過很多的路由器和各種各樣的網絡媒介才能到達對端,網絡中不同媒介的MTU各不相同。我們可以看下面的簡單的組網圖。
PC1(192.168.0.1)―――Router――――Internet―――-www server(238.136.1.1)
         建立tcp連接的兩端在三次握手時會協商tcp mss大小,具體如下:
        pc1 發出syn報文,其中option選項填充的mss字段一般爲1460,同樣www server收到syn報文後,會發送syn+ack報文應答,option選項填充的mss字段也爲1460;協商雙方會比較syn和syn+ack報 文中mss字段大小,選擇較小的mss作爲發送tcp分片的大小。通過比較,協商雙方的tcp mss都是1460。

       對於網絡層的上層協議而言(我們以TCP/IP協議族爲例)網絡層IP協議會檢查每個從上層協議下來的數據包的大小,並根據本機MTU的大小決定是否作 “分片”處理。分片最大的壞處就是降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,所以在網絡層更高一層(就是傳輸層)的實現中往往會對此加以注 意!所以會在IP數據包包頭裏面加上一個標籤:DF(Donot Fragment)。這樣當這個IP數據包通過多個路由其進行網絡傳輸的時候,如果遇到MTU小於IP數據包的情況,轉發設備就會根據要求丟棄這個數據 包。然後返回一個錯誤信息給發送者。這樣往往會造成某些通訊上的問題,不過幸運的是大部分網絡鏈路都是MTU1500或者大於1500。
        對於UDP協議而言,這個協議本身是無連接的協議,對數據包的到達順序以及是否正確到達不甚關心,所以一般UDP應用對分片沒有特殊要求。
    對於TCP協議而言就不一樣了,這個協議是面向連接的協議,對於TCP協議而言它非常在意數據包的到達順序以及是否傳輸中有錯誤發生。所以有些TCP應用 對分片有要求---不能分片(DF)。PPPoE所謂PPPoE就是在以太網上面跑PPP協議,就是在我們傳輸的鏈路層協議上添加一層PPPOE的報頭。 這樣相當於整個數據包的變大了。
      爲什麼會產生這種奇怪的需求呢?這是因爲隨着寬帶接入(這種寬帶接入一般爲Cable Modem或者xDSL或者以太網的接入)由於以太網缺乏認證計費機制而傳統運營商是通過PPP協議來對撥號等接入服務進行認證計費的,PPPoE帶來了 好處,也帶來了一些壞處,比如:二次封裝耗費資源,降低了傳輸效能等等,最大的壞處就是PPPoE導致MTU變小了,以太網的MTU是1500,再減去 PPP的包頭包尾的開銷(8Bytes),就變成1492。
      如果兩臺主機之間的某段網絡使用了PPPoE那麼就會導致某些不能分片的應用無法通訊。
這個時候就需要我們調整一下主機的MTU,通過降低主機的MTU,這樣我們就能夠順利地進行通訊了。當我們的PC鏈接服務器的時,只能PING通,卻不能通過網頁訪問時,這時我們就需要考慮MSS值的大小是否正確了,一般情況下都是由MSS值不對造成的。

        當然對於TCP應用而言還有另外的解決方案。就是在TCP 中有一個OPTIONS這裏有一個MSS的選項。MSS 就是TCP數據包每次能夠傳輸的最大數據分段。爲了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時 候往往用MTU值代替(需要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS爲1460。通訊雙方會根據雙方 提供的MSS值得最小值確定爲這次連接的最大MSS值。這是在IPV4的協議中,而在IPV6協議中一般情況下MSS的值爲1440,這是因爲,IPv6 中的IP頭的大小是40bytes,比IPV4的大20個bytes.

       我們試想一下,如果我們在中間路由器上把每次TCP連接的最大MSS進行調整這樣使得通過PPPoE鏈路的最大MSS值加上數據包頭包尾不會超過 PPPoE的MTU大小1492這樣就不會造成無法通訊的問題.所以上面的問題可以通過ip tcp adjust-mss 1452來解決。很多的路由器配置上會有這個配置選項。如果對於IPV6的話可以調整爲1432.當我們不改變中間路由器的情況下,也可以通過改變我們主 機的MTC來解決。當主機的MTU值從1500改變爲1492時,就相當於去掉了EthernetII和PPPOE頭部的長度。
       主要參考:http://www.net130.com/CMS/Pub/network/network_protocal/2005_09_22_97176.htm

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