轉: 一文搞懂什么是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個字節通信
