转: 一文搞懂什么是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个字节通信