天天看點

RouterOS基礎知識普及貼關于 MSS 和MTU

[背景知識] 

MTU: Maxitum Transmission Unit 最大傳輸單元 


MSS: Maxitum Segment Size 最大分段大小
(偶是直譯,翻譯的不好,不要打 

俺PP) 



PPPoE: PPP Over Ethernet(在以太網
上承載PPP協定) 



[分析過程] 

先說說這MTU最大傳輸單元,這個最大傳輸單元實際上和鍊路層協定有着密切 

的關系,讓我們先仔細回憶一下EthernetII幀的結構 

DMAC+SMAC+Type+Data+CRC
 


由于以太網傳輸電氣方面的限制,每個以太網幀都有最小的大小64bytes 

最大不能超過1518bytes,對于小于或者大于這個限制的以太網幀我們都可以 

視之為錯誤的資料幀,一般的以太網轉發裝置會丢棄這些資料幀。 

(注:小于64Bytes的資料幀一般是由于以太網沖突産生的“碎片”或者線路幹擾 

或者壞的以太網接口産生的,對于大于1518Bytes的資料幀我們一般把它叫做 

Giant幀,這種一般是由于線路幹擾或者壞的以太網口産生) 



由于以太網EthernetII最大的資料幀是1518Bytes這樣,刨去以太網幀的幀頭 

(DMAC目的MAC位址48bit=6Bytes+SMAC源MAC位址48bit=6Bytes+Type域 

2bytes)14Bytes和幀尾CRC校驗部分4Bytes(這個部門有時候大家也把它叫做 

FCS),那麼剩下承載上層協定的地方也就是Data域最大就隻能有1500Bytes 

這個值我們就把它稱之為MTU。這個就是網絡層
協定非常關心的地方,因為網絡 

層協定比如IP協定會根據這個值來決定是否把上層傳下來的資料進行分片。就好 

比一個盒子沒法裝下一大塊面包,我們需要把面包切成片,裝在多個盒子裡面一 

樣的道理。 



當兩台遠端PC互聯的時候,它們的資料需要穿過很多的路由器
和各種各樣的網絡 

媒介
才能到達對端,網絡中不同媒介的MTU各不相同

,就好比一長段的水管,由 

不同粗細的水管組成(MTU不同 :))通過這段水管最大水量就要由中間最細的水管決定。 



對于網絡層的上層協定而言(我們以TCP/IP協定族為例)它們對水管粗細不在意 

它們認為這個是網絡層的事情。

網絡層IP協定會檢查每個從上層協定下來的資料 

包的大小,并根據本機MTU的大小決定是否作“分片”處理。分片最大的壞處就是 

降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,是以在網絡層更高 

一層(就是傳輸層)的實作中往往會對此加以注意!

有些高層因為某些原因就會 

要求我這個面包不能切片,我要完整地面包,是以會在IP資料包標頭裡面加上一 

個标簽:DF(Donot Fragment)。這樣當這個IP資料包在一大段網絡(水管裡 

面)傳輸的時候,如果遇到MTU小于IP資料包的情況,轉發裝置就會根據要求 

丢棄這個資料包。然後傳回一個錯誤資訊給發送者。這樣往往會造成某些通訊上 

的問題,不過幸運的是大部分網絡鍊路都是MTU1500或者大于1500。 



對于UDP協定而言,這個協定本身是無連接配接的協定,對資料包的到達順序以及是 

否正确到達不甚關心,是以一般UDP應用對分片沒有特殊要求。 



對于TCP協定而言就不一樣了,這個協定是面向連接配接的協定,對于TCP協定而言 

它非常在意資料包的到達順序以及是否傳輸中有錯誤發生。是以有些TCP應用對 

分片有要求---不能分片(DF)。 



花開兩朵,各表一枝,說完MTU的故事我們該講講今天的第二個豬腳---PPPoE 

所謂PPPoE就是在以太網上面跑PPP協定,有人奇怪了,PPP協定和Ethernet不 

都是鍊路層協定嗎?怎麼一個鍊路層跑到另外一個鍊路層上面去了,難道更新 

成網絡層協定了不成。其實這是個誤區:就是某層協定隻能承載更上一層協定。 

為什麼會産生這種奇怪的需求呢?這是因為随着寬帶接入(這種寬帶接入一般 

為Cable Modem或者xDSL或者以太網的接入)由于以太網缺乏認證計費機制 

而傳統營運商是通過PPP協定來對撥号等接入服務進行認證計費的,是以就 

出了這麼一個怪胎:PPPoE。(有關PPPoE的詳細介紹參見V大以及本站其他成 

員的一些介紹文章,我就不啰裡啰唆的了) 



PPPoE帶來了好處,也帶來了一些壞處,比如:二次封裝耗費資源,降低了傳輸 

效能等等,這些壞處俺也不多說了,最大的壞處就是PPPoE導緻MTU變小了 

以太網的MTU是1500,再減去PPP的標頭包尾的開銷(8Bytes),就變成 

1492。 




如果兩台主機之間的某段網絡使用了PPPoE那麼就會導緻某些不能分片的應用 

無法通訊。 



這個時候就需要我們調整一下主機的MTU
,通過降低主機的MTU,這樣我們 

就能夠順利地進行通訊了。
 



當然對于TCP應用而言還有另外的解決方案。 

馬上請出今天第三位豬腳:MSS。 

MSS最大傳輸大小的縮寫,是TCP協定裡面的一個概念。 

MSS就是TCP資料包每次能夠傳輸的最大資料分段
。為了達到最佳的傳輸效能 

TCP協定在建立連接配接的時候通常要協商雙方的MSS值,這個值TCP協定在實作的 

時候往往用MTU值代替
(需要減去IP資料包標頭的大小20Bytes和TCP資料段的 

標頭20Bytes)是以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小 

值确定為這次連接配接的最大MSS值
。 



介紹完這三位豬腳s 

我們回過頭來看前言裡面的那個問題,我們試想一下,如果我們在中間路由器上 

把每次TCP連接配接的最大MSS進行調整這樣使得通過PPPoE鍊路的最大MSS值加上 

資料標頭包尾不會超過PPPoE的MTU大小1492這樣就不會造成無法通訊的問題 



是以上面的問題可以通過ip tcp adjust-mss 1452來解決。 



當然問題也可以通過修改PC機的MTU來解決。       

繼續閱讀