DTMU
Transmission&Timing&ManagementUnitforDTRUBTS--雙密度定時/傳輸和管理單元
相關內容
MTU:MaxitumTransmissionUnit最大傳輸單元
MSS:MaxitumSegmentSize最大分段大小(偶是直譯,翻譯的不好,不要打
俺PP)
PPPoE:PPPOverEthernet(在乙太網上承載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(DonotFragment)。這樣當這個IP數據包在一大段網路(水管里
面)傳輸的時候,如果遇到MTU小於IP數據包的情況,轉發設備就會根據要求
丟棄這個數據包。然後返回一個錯誤信息給傳送者。這樣往往會造成某些通訊上
的問題,不過幸運的是大部分網路鏈路都是MTU1500或者大於1500。
對於UDP協定而言,這個協定本身是無連線的協定,對數據包的到達順序以及是
否正確到達不甚關心,所以一般UDP套用對分片沒有特殊要求。
對於TCP協定而言就不一樣了,這個協定是面向連線的協定,對於TCP協定而言
它非常在意數據包的到達順序以及是否傳輸中有錯誤發生。所以有些TCP套用對
分片有要求---不能分片(DF)。
花開兩朵,各表一枝,說完MTU的故事我們該講講今天的第二個豬腳---PPPoE
所謂PPPoE就是在乙太網上面跑PPP協定,有人奇怪了,PPP協定和Ethernet不
都是鏈路層協定嗎?怎么一個鏈路層跑到另外一個鏈路層上面去了,難道升級
成網路層協定了不成。其實這是個誤區:就是某層協定只能承載更上一層協定。
為什麼會產生這種奇怪的需求呢?這是因為隨著寬頻接入(這種寬頻接入一般
為CableModem或者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值。
我們回過頭來看前言裡面的那個問題,我們試想一下,如果我們在中間路由器上
把每次TCP連線的最大MSS進行調整這樣使得通過PPPoE鏈路的最大MSS值加上
數據包頭包尾不會超過PPPoE的MTU大小1492這樣就不會造成無法通訊的問題
所以上面的問題可以通過iptcpadjust-mss1452來解決。
當然問題也可以通過修改PC機的MTU來解決。
[後記]
Cisco在IOS12.2(4)T及以後的版本支持修改MSS大小的特性
Cisco的TCPAdjustMSSFeature:
TheTCPMSSAdjustmentfeatureenablestheconfigurationofthe
maximumsegmentsize(MSS)fortransientpacketsthattraversearouter,
specificallyTCPsegmentsintheSYNbitset,whenPointtoPointProtocol
overEthernet(PPPoE)isbeingusedinthenetwork.PPPoEtruncatesthe
Ethernetmaximumtransmissionunit(MTU)1492,andiftheeffectiveMTU
onthehosts(PCs)isnotchanged,therouterinbetweenthehostandthe
servercanterminatetheTCPsessions.Theiptcpadjust-msscommand
specifiestheMSSvalueontheintermediaterouteroftheSYNpacketsto
avoidtruncation.