MTU與MSS值到底設置為多少?
MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小
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帶來了好處,也帶來了一些壞處,比如:二次封裝耗費資源,降低了傳輸效能等等,這些壞處俺也不多說了,最大的壞處就是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來解決。
不改MSS會如何?有可能會出現部分網站打不開,例如陶寶,在線銀行什么的。或者開網頁慢,都可能和MSS有關系的。
修改辦法(2927版本)
IP==>>Firwwall==>>Mangle==>>點+號==>>
General頁
Chain:forward
Protocol:tcp
Advanced頁
Tcpflags選SYN
Action頁
action:Change mss
new tcpmss:1472
關于MSS數值的多少,以及取值辦法~
在Windows環境下,ping 目標網站 -f -l 1500 然后看能否PING通,如果PING不通,就以4為單位往下減,目標網站可以是
你想訪問,但訪問不了,也可以是其他一些網站,這個要求不多。。
比如我PING 百度
ping www.baidu.com -f -l 1500
得到以下提示:
C:\>ping www.baidu.com -f -l 1500
Pinging www.a.shifen.com [202.108.22.5] with 1500 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Ping statistics for 202.108.22.5:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
這就說明,1500這個MSS數值不可取,需要往下了換,那么就以4位單位往下減,減到通為止,就是1500-4=???自己去算了。我這里是1472才通的,所以我改的就是1472
C:\>ping www.baidu.com -f -l 1472
Pinging www.a.shifen.com [202.108.22.5] with 1472 bytes of data:
Reply from 202.108.22.5: bytes=1472 time=29ms TTL=53
Reply from 202.108.22.5: bytes=1472 time=29ms TTL=53
Reply from 202.108.22.5: bytes=1472 time=29ms TTL=53
Reply from 202.108.22.5: bytes=1472 time=29ms TTL=53
Ping statistics for 202.108.22.5:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 29ms, Maximum = 29ms, Average = 29ms
這就是通了,基于給地網絡狀況不同,所以MSS也不僅相同,大家要自己測試,多做試驗。
轉自
http://www.clxp.net.cn/article.asp?id=253