以太網最大報文長度1500,為何要超它?
既然Ethernet的最大報文長度是1500,我們有什么理由發送大的報文呢?大的報文會導致ip分段。
理想與現實的差距,網絡世界亦是如此。
無論是家庭局域網,還是互聯網,網絡接口絕大多數使用Ethernet接口,Ethernet接口標準的MTU= 1500 Bytes。這是Ethernet接口對于承載的上層貨物制定的硬性限制。
什么是上層貨物?
Ether-Type字段之后,FCS之前的數據字節,就是上層貨物。這個貨物可以為IP、ARP、IPv6等等。意味著,IP報文、ARP報文、IPv6報文最大尺寸為1500字節。通常稱它們為Packet。
1500字節包含Ethernet Header、Ethernet Tailer嗎?
不包括。當來自上層的貨物(Packet),被Ethernet接口自動添加了Ethernet Header、Ethernet Tailer,就不叫Packet,而是叫Frame。
最長的Ethernet Frame是多少?
Frame = Header + Packet + Tailer
= Destination+Source +Ether-Type+Packet+FCS
= 6 + 6 +2 + 1500 +4
= 1518
所以,Ethernet最長幀長度為1518字節,而不是1500字節。
每臺計算機都通過MTU=1500來限制上層貨物的大小。假設有一個IP Packet,報文長度為1500字節,正在離開家庭局域網某一臺電腦,經過電腦Ethernet口時,一切正常,順利通過。
然后IP Packet繼續上行,到達家庭局域網的出口處,也就是光貓的WAN接口,出了一點小狀況。之所以出狀況,是因為光貓是PPPoE撥號客戶端,IP Packet外層需要先被PPPoE包裹(Encapsulation),然后才能被Ethernet包裹。這兩層的包裹關系可以看下方示意:
Frame = Header + PPPoE + IP Packet+ Tailer
= 14 + 8 + 1500+ 4
= 1526
從Ethernet接口的眼光看來,來自上層的貨物不再是1500字節長的IP Packet,而是1508字節的PPPoE + IP Packet。
光貓的WAN口MTU = 1500,由于包裹的大小1508 > 1500 MTU,那么光貓需要將這個大包裹進行拆分成≤1500才能放行。
IP包裹的拆分,會大大影響光貓或其他網絡設備的數據吞吐性能,所以網絡設計時會想盡一切方法予以避免。那么在真實網絡里是如何避免IP包裹的拆分(分片)的?
手段千奇百怪,爭奇斗艷,但是不外乎兩種手段:
- 內卷
- 外卷
什么是內卷?
就是想盡一切辦法限制IP Packet的源頭(IP報文誕生地)的大小,通常小于標準MTU 1500字節。充分考慮IP報文端到端可能會添加形形色色的外層包裝,IP報文被添加了層層附加報文頭,在到達目的地的時候,依然≤1500字節,是不是一個好主意呢?
是的,這是現網中最完美的解決方案。還是以上文的例子為例,如果數據的源頭IP報文大小不是1500,而是1492,那么在光貓的WAN口,即使添加8個PPPoE字節頭,報文也不過1500字節長,依然可以順利通過。說的容易,如何實現呢?
TCP層面的限制
通過將MSS變小,從而間接將IP報文變小。
大家訪問知乎服務器,知乎服務器為了限制客戶端發出IP報文為1492,只需要在三次握手時使用MSS Option,將MSS 設置為1452即可。這種方法固然好,但是只能抵消因為添加PPPoE頭(8個字節)而增加的長度。
但是,如果在客戶端與服務器之間,還有公司的VPN存在,如何處理?
可以在VPN網關上,使用中間人技術(TCP Adjust-MSS),偷偷修改客戶端與服務器的TCP MSS,將其變得足夠小,可以充分抵消由于添加PPPoE、VPN而增加的報文頭。通常將MSS修改成1380可以應對絕大多數的網絡場景。
能不能將MSS修改成1000或更小?
當然可以,但是報文小會影響傳輸效率,所以1380是一個不錯的選擇。當然在復雜環境中,1380依然還是太大,可以繼續下調100字節到1280字節。
UDP層面的限制(應用層面的限制)
UDP是無狀態的,所以無法限制。為了限制數據源頭的IP報文大小,通常是在限制跑在UDP上的應用層的數據報文的大小。比如所有發出應用層報文限制在1380,少的120字節可以有效抵消互聯網附加的報文頭。
認證服務器Radius,是一個基于UDP的應用。為了避免報文被分片,有一些廠商將數據源頭限制在1180字節,少的320字節可以完全應對最嚴峻的網絡環境。
讀者是否覺得1180太保守?
廠商吃了太多關于MTU、IP報文分片的苦頭,經過多年的網絡實踐,將其定為1180。盡管保守,但是卻非常可靠。
一次網絡調試,其他廠商的Radius都出問題,唯獨這個保守的廠商沒有出問題。后來經過排錯,發現網絡端到端有效MTU不是1500,而是1450,而且不管DF是1還是0,只要超出1450統統無法通行。這家保守的廠商最后勝出!
IP層面的限制
通常IP層面不做限制,保持標準MTU = 1500。完全依賴于TCP、應用層面的限制。
但是,如果各位電腦上遠程使用VPN,本地VPN接口MTU通常為1380甚至更小,這是IP層面的限制。談完內卷,再談談外卷。
外卷
網絡設備將MTU上調到大于1500,充分考慮到網絡可能附加的報文頭。
依然以第一個例子為例,如果光貓的WAN接口MTU = 1508而不是1500,既然添加了8個字節的PPPoE報文頭,是不是也無需拆分IP報文?
是的。
假設IP報文順利離開光貓WAN口,進入運營商交換機,交換機上行Tunk口MTU = 1508夠用嗎?
不夠,因為報文又被添加了一層或者兩層802.1Q,用于承載VLAN信息。怎么辦?
很好辦,只要將Trunk口的MTU上調為1516甚至更大,完全Cover由于增添報文頭而帶來報文長度的增加。
一句話概述,就是網絡設備將MTU大大調大,用于容納由于添加報文頭而增加的長度,避免由于報文頭增加而引起的IP報文分片。
最后,IP報文越長傳輸效率越高,IP報文最長為65536字節。為何Ethernet接口不能將MTU設置為65536字節,而是限制在1500字節?
這是一個歷史遺留問題。Ethernet發送方與接收方時鐘需要同步,發送長幀意味著更長的發送時長。接收方很難保持與發送方的時鐘同步,時鐘偏移變大,出錯的概率就會上升。為了限制錯誤率,將幀的長度做了上文的限制。
90年代數字信號處理器DSP技術進步,鎖相環技術進步,帶來Ethernet傳輸技術進步。即使發10000字節長幀,雙方依然可以保持時鐘同步,出錯概率依然很小。當前的路由器、交換機支持MTU到9800字節、甚至更大。
在數據中心的網絡里,為了提高數據的傳輸效率,通常采用外卷法,交換機MTU設置為9800甚至更大,當服務器與服務器之間使用9100字節進行通信時,無需任何IP分片,IP報文暢通無阻,將數據傳輸的效率最大化!