文章目录
- 1 基本概念
- 2 为什么MTU是1500
- 3 有效载荷最大是1500吗
- 4 Linux下如何修改MTU
参考资料:
1. RFC894
2. 什么是MTU(Maximum Transmission Unit)?
1 基本概念
Maximum Transmission Unit,缩写MTU,即最大传输单元。即发送端一次能够发送报文的最大字节数。
网络中的数据传递以数据包为单位进行的,如果一个数据包过大,表示通信效率更高,但是数据包大延迟就大,数据异常的概率就大,数据丢失时重传的损耗也就更大;如果数据包过小,同样的数据量需要发送很多包,那么通信效率就会很小。因此会默认定一个最大MTU,可以提高通信效率,一般默认是1500。
MTU是数据链路层的概念,网络中一些常见链路层协议MTU的缺省数值如下:
FDDI协议:4352字节
以太网(Ethernet)协议:1500字节
PPPoE(ADSL)协议:1492字节
X.25协议(Dial Up/Modem):576字节
Point-to-Point:4470字节
2 为什么MTU是1500
早期的以太网规定以太帧的大小范围为:64 ~ 1518,以太帧头14字节,CRC数据4字节,去掉这16个字节,以太帧的范围为46~1500。
以太帧的范围为46~1500,如果数据大小小于46字节,那么就会在数据后面进行填充到最小值46个字节。
3 有效载荷最大是1500吗
那么问题来了,这个1500是有效载荷的最大数据吗?
开发者在传输有效数据时候,网络栈会根据开发者使用的网络协议从上往下进行层层封装,当达到数据链路层时候,最大的字节数为1500字节。
以UDP通信为例,在传输层会加上8字节的UDP头,在网络层会加上20字节的IP头,然后在网络接口层,则会加上以太帧头和CRC总共18字节,达到最大值1518字节。在这种情形下最大的有效载荷是1500-UDP头(8字节)-IP头(20字节)= 1472字节,即UDP通信场景下,一包数据的最大有效载荷为1472个字节。
上面说的发送单个包的最大有效载荷大小,是应用层的有效载荷只够只发送一个数据包的情况。实际上如果应用层发送的有效载荷超过一个数据包,那么单个包的有效最大载荷应该是1500-IP头(20字节)= 1480字节。假如我们要发送2952字节的有效数据,那么在传输层加上8字节的UDP头,大小为2960字节。在网络层加上20字节IP头,大小为2980字节,进行转发时候,发现IP报文长度超过了1500,就会分片处理。会分为两个包:
- 第一个包:IP头(20字节)+1480有效数据。其中,这1480数据实际上是8字节UDP头+1472有效数据;
- 第二个包:复制第一个包的IP头20字节+剩余的有效载荷,即实际载荷2952-第一包发送的有效载荷1472=1480字节。
在TCP通信中,会在建立连接时协商最大数据分段长度MSS,通常MSS为1500(MTU)- 20(IP头) -20 (TCP头)=1460字节。
TCP通信和UDP通信的分片不一样,UDP是在IP层,即网络层进行分片,如果分多包的话,后面的包是没有UDP头的,而TCP是在传输层层进行分段,每个包都是有TCP头的。
假如有效载荷为2000个字节,MSS为1460字节,那么在传输层会分为两包:
- 第一包:TCP头(20字节)+1460有效数据;
- 第二包:TCP头(20字节)+ 剩余的有效数据540字节(2000-1460=540)。
然后这两包数据在网络层在加上20字节的IP头。
4 Linux下如何修改MTU
在Linux下可以使用ifconfig指令来修改mtu的大小,如修改网卡wifi0的MTU为1000:
ifconfig wifi0 mtu 1000 up