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的詳細介紹參見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值。