From: http://blog.chinaunix.net/u2/85848/showart_2142218.html
MTU
: Maxitum Transmission
Unit 傳輸單元最大值
MSS
: Maxitum Segment Size
最大分段大小
PPPoE
: PPP Over
Ethernet(在乙太網路上承載PPP協議)
[分析過程]
先說說這MTU傳輸單元最大值,這個傳輸單元最大值實際上和鏈路層協議有著密切的關係,讓我們先仔細回憶一下EthernetII幀的結構
DMAC(目的mac)+SMAC(源mac)+Type(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)。
PPPoE
所謂PPPoE
就是在乙太網路上面跑PPP協議,有人奇怪了,PPP協議和Ethernet不都是鏈路層協議嗎?怎麼一個鏈路層跑到另外一個鏈路層上面去了,難道升級成網
絡層協議了不成。其實這是個誤區:就是某層協議只能承載更上一層協議。
為什麼會產生這種奇怪的需求呢?這是因為隨著寬頻接入(這種寬頻接入一般為Cable
Modem或者xDSL或者乙太網路的接入)由於乙太網路缺乏認證計費機制而傳統電訊廠商是通過PPP協議來對撥號等接入服務進行認證計費的,所以就出了這麼一
個怪胎:PPPoE。
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值。
我們回過頭來看前言裡面的那個問題,我們試想一下,如果我們在中間路由器上把每次TCP串連的最大MSS進行調整這樣使得通過PPPoE鏈路的
最大MSS值加上資料包頭包尾不會超過PPPoE的MTU大小1492這樣就不會造成無法通訊的問題.所以上面的問題可以通過ip tcp
adjust-mss 1452來解決。
當然問題也可以通過修改PC機的MTU來解決。