[背景知識(shí)]
MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大?。ㄅ际侵弊g,翻譯的不好,不要打
俺PP)
PPPoE: PPP Over Ethernet(在以太網(wǎng)上承載PPP協(xié)議)
[分析過程]
先說說這MTU最大傳輸單元,這個(gè)最大傳輸單元實(shí)際上和鏈路層協(xié)議有著密切的關(guān)系,讓我們先仔細(xì)回憶一下EthernetII幀的結(jié)構(gòu)DMAC+SMAC+Type+Data+CRC
由于以太網(wǎng)傳輸電氣方面的限制,每個(gè)以太網(wǎng)幀都有最小的大小64bytes最大不能超過1518bytes,對(duì)于小于或者大于這個(gè)限制的以太網(wǎng)幀我們都可以視之為錯(cuò)誤的數(shù)據(jù)幀,一般的以太網(wǎng)轉(zhuǎn)發(fā)設(shè)備會(huì)丟棄這些數(shù)據(jù)幀。
(注:小于64Bytes的數(shù)據(jù)幀一般是由于以太網(wǎng)沖突產(chǎn)生的“碎片”或者線路干擾或者壞的以太網(wǎng)接口產(chǎn)生的,對(duì)于大于1518Bytes的數(shù)據(jù)幀我們一般把它叫做Giant幀,這種一般是由于線路干擾或者壞的以太網(wǎng)口產(chǎn)生)
由于以太網(wǎng)EthernetII最大的數(shù)據(jù)幀是1518Bytes這樣,刨去以太網(wǎng)幀的幀頭(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗(yàn)部分4Bytes(這個(gè)部門有時(shí)候大家也把它叫做FCS),那么剩下承載上層協(xié)議的地方也就是Data域最大就只能有1500Bytes這個(gè)值我們就把它稱之為MTU。這個(gè)就是網(wǎng)絡(luò)層協(xié)議非常關(guān)心的地方,因?yàn)榫W(wǎng)絡(luò)層協(xié)議比如IP協(xié)議會(huì)根據(jù)這個(gè)值來決定是否把上層傳下來的數(shù)據(jù)進(jìn)行分片。就好比一個(gè)盒子沒法裝下一大塊面包,我們需要把面包切成片,裝在多個(gè)盒子里面一樣的道理。
當(dāng)兩臺(tái)遠(yuǎn)程PC互聯(lián)的時(shí)候,它們的數(shù)據(jù)需要穿過很多的路由器和各種各樣的網(wǎng)絡(luò)媒介才能到達(dá)對(duì)端,網(wǎng)絡(luò)中不同媒介的MTU各不相同,就好比一長(zhǎng)段的水管,由不同粗細(xì)的水管組成(MTU不同 )通過這段水管最大水量就要由中間最細(xì)的水管決定。
對(duì)于網(wǎng)絡(luò)層的上層協(xié)議而言(我們以TCP/IP協(xié)議族為例)它們對(duì)水管粗細(xì)不在意它們認(rèn)為這個(gè)是網(wǎng)絡(luò)層的事情。網(wǎng)絡(luò)層IP協(xié)議會(huì)檢查每個(gè)從上層協(xié)議下來的數(shù)據(jù)包的大小,并根據(jù)本機(jī)MTU的大小決定是否作“分片”處理。分片最大的壞處就是
降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,所以在網(wǎng)絡(luò)層更高一層(就是傳輸層)的實(shí)現(xiàn)中往往會(huì)對(duì)此加以注意!有些高層因?yàn)槟承┰蚓蜁?huì)要求我這個(gè)面包不能切片,我要完整地面包,所以會(huì)在IP數(shù)據(jù)包包頭里面加上一
個(gè)標(biāo)簽:DF(Donot Fragment)。這樣當(dāng)這個(gè)IP數(shù)據(jù)包在一大段網(wǎng)絡(luò)(水管里面)傳輸?shù)臅r(shí)候,如果遇到MTU小于IP數(shù)據(jù)包的情況,轉(zhuǎn)發(fā)設(shè)備就會(huì)根據(jù)要求丟棄這個(gè)數(shù)據(jù)包。然后返回一個(gè)錯(cuò)誤信息給發(fā)送者。這樣往往會(huì)造成某些通訊上的問題,不過幸運(yùn)的是大部分網(wǎng)絡(luò)鏈路都是MTU1500或者大于1500。
對(duì)于UDP協(xié)議而言,這個(gè)協(xié)議本身是無連接的協(xié)議,對(duì)數(shù)據(jù)包的到達(dá)順序以及是否正確到達(dá)不甚關(guān)心,所以一般UDP應(yīng)用對(duì)分片沒有特殊要求。
對(duì)于TCP協(xié)議而言就不一樣了,這個(gè)協(xié)議是面向連接的協(xié)議,對(duì)于TCP協(xié)議而言它非常在意數(shù)據(jù)包的到達(dá)順序以及是否傳輸中有錯(cuò)誤發(fā)生。所以有些TCP應(yīng)用對(duì)分片有要求---不能分片(DF)。
花開兩朵,各表一枝,說完MTU的故事我們?cè)撝v講今天的第二個(gè)豬腳---PPPoE所謂PPPoE就是在以太網(wǎng)上面跑PPP協(xié)議,有人奇怪了,PPP協(xié)議和Ethernet不都是鏈路層協(xié)議嗎?怎么一個(gè)鏈路層跑到另外一個(gè)鏈路層上面去了,難道升級(jí)成網(wǎng)絡(luò)層協(xié)議了不成。其實(shí)這是個(gè)誤區(qū):就是某層協(xié)議只能承載更上一層協(xié)議。
為什么會(huì)產(chǎn)生這種奇怪的需求呢?這是因?yàn)殡S著寬帶接入(這種寬帶接入一般為Cable Modem或者xDSL或者以太網(wǎng)的接入)由于以太網(wǎng)缺乏認(rèn)證計(jì)費(fèi)機(jī)制而傳統(tǒng)運(yùn)營(yíng)商是通過PPP協(xié)議來對(duì)撥號(hào)等接入服務(wù)進(jìn)行認(rèn)證計(jì)費(fèi)的,所以就出了這么一個(gè)怪胎:PPPoE。(有關(guān)PPPoE的詳細(xì)介紹參見V大以及本站其他成員的一些介紹文章,我就不啰里啰唆的了)
PPPoE帶來了好處,也帶來了一些壞處,比如:二次封裝耗費(fèi)資源,降低了傳輸效能等等,這些壞處俺也不多說了,最大的壞處就是PPPoE導(dǎo)致MTU變小了以太網(wǎng)的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492。
如果兩臺(tái)主機(jī)之間的某段網(wǎng)絡(luò)使用了PPPoE那么就會(huì)導(dǎo)致某些不能分片的應(yīng)用無法通訊。
這個(gè)時(shí)候就需要我們調(diào)整一下主機(jī)的MTU,通過降低主機(jī)的MTU,這樣我們就能夠順利地進(jìn)行通訊了。
當(dāng)然對(duì)于TCP應(yīng)用而言還有另外的解決方案。
馬上請(qǐng)出今天第三位豬腳:MSS。
MSS最大傳輸大小的縮寫,是TCP協(xié)議里面的一個(gè)概念。
MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。為了達(dá)到最佳的傳輸效能TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,這個(gè)值TCP協(xié)議在實(shí)現(xiàn)的時(shí)候往往用MTU值代替(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes)所以往往MSS為1460。通訊雙方會(huì)根據(jù)雙方提供的MSS值得最小值確定為這次連接的最大MSS值。
介紹完這三位豬腳s
我們回過頭來看前言里面的那個(gè)問題,我們?cè)囅胍幌拢绻覀冊(cè)谥虚g路由器上把每次TCP連接的最大MSS進(jìn)行調(diào)整這樣使得通過PPPoE鏈路的最大MSS值加上數(shù)據(jù)包頭包尾不會(huì)超過PPPoE的MTU大小1492這樣就不會(huì)造成無法通訊的問題.所以上面的問題可以通過ip tcp adjust-mss 1452來解決。
當(dāng)然問題也可以通過修改PC機(jī)的MTU來解決。
眾信咨詢:互聯(lián)網(wǎng)資質(zhì)代理誠(chéng)信品牌