MTU


轉: 一文搞懂什么是MTU - 知乎 (zhihu.com)

“以太網的鏈路層對數據幀的長度會有一個限制,其最大值默認是1500字節,鏈路層的這個特性稱為MTU,即最大傳輸單元

MTU

MTU

“Maximum Transmission Unit,最大傳輸單元,指的是數據鏈路層的最大payload,由硬件網卡設置MTU,是一個硬性限制

數據鏈路層的有效數據,最小46byte,最大一般1500byte,這里的最大就是MTU,MTU表示網絡層必須將發給網卡API的包 <= 1500byte,否則調用失敗

“MTU是鏈路層對網絡層的限制,以太網鏈路的MTU默認是1500byte,意思是以太網數據鏈路層的有效數據payload的最大字節數不能超過1500,那這1500字節包含鏈路層的頭部和尾部嗎?

當然不包含!

“問題又來了,有的以太網網卡配置了VLAN tag,通過此網卡的數據幀會攜帶VLAN tag,VLAN tag要算在鏈路層的payload里嗎?或者可以說MTU = 1500里包含802.1Q的頭部VLAN tag嗎?

包含!

當網卡配置VLAN tag時,VLAN tag + Data <= MTU,有時VLAN tag不只有一個,可能是雙標簽,那這個VLAN tag就是8個字節。這時候的MTU如果還是1500,鏈路層的payload就不可能是1500了

怎么辦?

可以把添加802.1Q的接口設置MTU=1504或1508

為什么要有MTU

以太網最初對報文長度沒有限制,網絡層最大可以接收65535個字節,但是以太網對於長報文無法可靠地傳輸,而且丟失后重傳也會占用大量的網絡資源,而將報文限制在一定的長度,以太網可以將報文大概率傳輸到目的地,於是就有了MTU

IP分片

既然鏈路層的payload有MTU限制,就意味着網絡層下發到鏈路層的數據不能超過MTU,如果超過了,就需要在網絡層分片,切成<=MTU的IP數據包

網絡層如果發現鏈路層的MTU小於IP包的大小(網絡層可以調用函數獲取鏈路層信息),也並不會立刻開始分片,還需要看IP包的是否允許分片位DF(Don't Fragment),如果允許分片,就會分成多個ID一樣的IP包

主機的網絡層可以分片,路由器的網絡層也可以分片,也就是說路由器的網絡接口也有MTU限制

就像木桶理論一樣,木桶能裝多少水取決於最短的那塊,網絡通信的路徑上決定IP包大小的,取決於源主機、目的主機、路由器中MTU最小的那個

UDP傳輸

對於UDP包,如果MTU = 1500,那么udp payload最大值是多少,才可以不用分片?

MTU(1500) = IPHeader(20) + UDPHeader(8) + Data Data = 1500 -20 - 8 = 1472

如果UDP包的Data <= 1472個字節,UDP包(UDPHeader+Data)在網絡層不用分片,直接封裝上IPHeader發往鏈路層

如果UDP包的payload > 1472,那么UDP包(UDPHeader + Data)在網絡層需要分片,如何分片?

網絡層並不會在每個分片里復制一次UDP頭,它是把完整的UDP包切開,加上IP頭發送出去,除了第一個分片有UDP頭,后面的分片都不包含UDP頭

目的主機的網絡層接收到多個UDP分片包后,網絡層必須重組才能交給上層,為什么?

因為多個分片包只有第一個是有UDP頭的,它可以根據UDP頭里的端口號通知相應的應用取走,但是后面的分片包由於沒有UDP頭,傳輸層無法把分片包交給正確的應用程序。所以UDP分片包必須在網絡層重組成一個完整的UDP包,交給傳輸層處理

網絡層根據什么重組呢?還記得上面說的,分片的時候會分成多個ID一樣的IP包嗎?

如果某些分片包沒有被目的主機的網絡層接收到,造成UDP包重組失敗,接收方會丟棄整個數據包,這是UDP不可靠傳輸的一個表現。而TCP發生組包錯誤時,該包會被重傳,保證可靠傳輸

對於UDP來說,一般選擇576個字節通信



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM