MTU
这是一篇关于MTU的介绍文章,MTU是MAC层中数据包的最大值,下面通过这几个部分来介绍:
理论部分:
1、MTU(Maximum Transmission Unit)如何定义:
- 指的是通信协议中的某一层上面所能通过的最大数据包大小
- 这里指mac层上面能通过的IP分组的最大值;我们知道,在tcp层传输数据的时候,在未指定上层使用http协议时,可以发送任何大小的数据。数据到了ip层时,需要加上ip头然后传递到mac层去加mac头,那在这个传递的过程中,包是不是越大越好,会做什么处理?
答案是分片:举个例子:现在以太网的MTU为1500B,假设现从tcp层向ip层传输长度为3008B的数据报文,则该报文添加了io头后为3028B,3028B>1500B,大于以太网一帧能承载的最大数据包(除了mac头),会做如下处理:
分片:ip净载荷:MTU-IP头:1500-20=1480;
3008B 需要分为3片,3008=1480,1480,48
总结:MTU就是MAC承载的载荷的最大值
2、MTU会影响什么:
- 数据包太大->分片重组->网络性能变差
- 数据包太小->一次能传输的数据小->网速差
- 路径最大单元:在一条传输路径上能顺利传递的包是该路径上所有设备的MTU的最小值(RFC1191)
3、如何知道这个值呢?
路径最大传输单元发现方法(RFC1191)
- 越来越多设备的MTU不统一等,和封杀ICMP导致越来越不好去得到这个值。
- MTU设置太大会怎样?交换机可嫩直接丢掉这个包不回应或者路由器回复它的最大值和错误信息:
ping -c 3 -s 1474 -M do 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 1474(1502) bytes of data.
ping: local error: Message too long, mtu=1500
提示错误即消息太大且未设置分片
4 MTU大小的来源:
ref https://www.zhihu.com/question/31460305/answer/183766816
以太网传输帧的最小值:
- 最早的以太网工作方式:载波多路复用/冲突检测(CSMA/D),因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。
- 假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs。在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为576个bits,从而让最极端的碰撞都能够被检测到。这个576bit换算一下就是72个字节,去掉8个字节的前导符和帧开始符,所以以太网帧的最小长度为64字节。
为什么标准以太网帧长度上限为1518字节?
- IP头total length为两个byte,理论上IP packet可以有65535 byte,加上Ethernet Frame头和尾,可以有65535 +14 + 4 = 65553 byte。如果在10Mbps以太网上,将会占用共享链路长达50ms,这将严重影响其它主机的通信,特别是对延迟敏感的应用是无法接受的。
- 由于线路质量差而引起的丢包,发生在大包的概率也比小包概率大得多,所以大包在丢包率较高的线路上不是一个好的选择。但是如果选择一个比较小的长度,传输效率又不高,拿TCP应用来说,如果选择以太网长度为218byte,TCP payload = 218 - Ethernet Header - IP Header - TCP Header = 218 - 18 - 20 - 20 = 160 byte那有效传输效率= 160 / 218 = 73%而如果以太网长度为1518,那有效传输效率= 1460 / 1518 = 96%通过比较,选择较大的帧长度,有效传输效率更高,而更大的帧长度同时也会造成上述的问题.
- 于是最终选择一个折衷的长度:1518 byte ! 对应的IP packet 就是 1500 byte,这就是最大传输单元MTU的由来。
其他疑问:
- 最早的以太网是通过Hub或集线器来工作的,在任意时刻只能有一台主机发送,这种共享方式发送效率很低,而现代高速交换机则让每个连接交换机的主机工作在独占模式,带宽独享,可以同时收发,而且现在早已不是早期的10Mbps的带宽,而是1000M、10000M,即使发送大包也不会影响别的主机,影响的只是交换机的接收和发送队列,既然发送大包效率要比小包效率搞,而且特定的应用也有发大包的需求,比如NFS文件系统,那为什么不把接口MTU提高一些,再高一些呢?
- 这是一个好主意,于是网卡、交换机、路由器网络接口可以实现更大的MTU,可以达到> 9000字节的大小,我们称这种远大于标准以太帧尺寸的帧为巨型帧Jumbo Frame 。于是网络接口提供可以修改MTU的配置命令,比如缺省为1500,可以修改为1508以支持QinQ,或者1512以支持802.1q Mpls label,这样既可以支持终端用户标准1500 字节IP packet,又可以避免分片。
- 有一点需要说明,二层交换机的接口,我们可以看成一块普通的网卡,网卡工作在数据链路层,所以分片不是它的职责,如果一个帧需要从交换机一个接口发送出去,而帧的长度>接口MTU,怎么办?
丢弃!会发什么消息告诉源主机吧?不会的,默默地丢,当作什么都没有发生,这种情况最难以排查,如果traceroute可以看到端对端使通的,而发送数据就是会失败。 - 所以切记,一台交换机要保证接口MTU的一致性。如果在一个VLAN上、或整个交换机都采用同样的MTU,就不会发生上述情况。而如果入接口是9000字节,而出接口是1500,就会发生上述问题。如果一条物理链路的两端MTU不一致,则会发生什么情况,比如一侧是1500,一侧是9000,1500一侧发出来的数据肯定没有问题,但是如果从9000侧发给1500呢?数据也背默默地丢了。为什么呢?
- 我们来谈另外一个很少提及的词汇:MRU,最大接收单元。我们一直谈的最大传输单元MTU是关于出方向的流量处理,而MRU恰恰相反,是关于入方向的流量处理。一般情况下MTU = MRU,但比如9000侧的数据到达1500,由于9000 > MRU,所以直接默默丢弃。所以在配置链路时,要确保两侧的设备MTU要匹配,无论各家厂商对MTU理解如何、实现如何,一定要保证两端匹配,即各自允许在以太网线上发送、接收的数据流,以太网帧的最大长度一样
实践部分:
如何设置MTU:
ifconfig eth0 mtu 1460
如何查看mtu:
netstat -i