1. 概述
本文主要分析网络通信中MTU,IP MTU和MSS的概念以及它们之间的关系。
这三个概念对于网络通信来说非常重要,常常很多网页打不开等问题都是这几个参数没配置好导致的。
2. 数据链路层 MTU
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议在某一层上面所能通过的最大数据报大小(以字节为单位),它通常与链路层协议有密切的关系。
EthernetII 帧结构如图 2.1所示。
图 2.1 EthernetII帧结构由于以太网传输电气方面的限制,每个以太网帧最小64字节,最大不能超过1518字节,对于小于或者大于这个限制的以太网帧,以太网都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。
注:小于64字节的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518字节的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生。
由于以太网EthernetII最大的数据帧是1518字节,除去以太网帧的帧头(DMAC目的MAC地址6Bytes+SMAC源MAC地址6Bytes+Type域2Bytes)14字节和帧尾CRC校验部分4Bytes(这个部分有时人们也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500字节,这个值就称之为MTU。
这个MTU是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,就需要把面包切成片,装在多个盒子里面一样的道理。
当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同)通过这段水管最大水量就要由中间最细的水管决定。
3. 网络层 IP MTU
对于网络层的上层协议而言(以TCP/IP协议族为例),网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。
分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(传输层)的实现中往往会对此加以注意!
有些高层因为某些原因就会要求本层这个面包不能切片,需要完整的“面包”,所以会在IP数据包包头里面加上一个标签:DF(Do not Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包,然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路MTU都是等于1500或者小于1500。
对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生,所以有些TCP应用对分片有要求——不能分片(DF)。
路径 MTU(PMTU)
一种动态发现因特网上任意一条路径的最大传输单元(MTU)的技术。
它对这条路径上由路由器产生的ICMP消息作了小的修改。
如果在路径上的路由器没有作出修改,有作出修改,这种技术就不能发现正确的路径MTU,但是这种技术选出的MTU将和使用其它方法选出的MTU同样准确,甚至在许多情况下更加精确。
RFC1191描述了PMTU的发现机制,即确定路径MTU的方法。
ICMP的不可到达错误采用的就是这种方法, traceroute程序也是用这种方法来确定到达目的节点的PMT的。
4. MSS
MSS是最大传输大小的缩写,它是TCP协议里面的一个概念。
如下图 4.1 所示。
图 4.1 TCP头部注:URG等参数指的是ACK、 URG 、PSH 、SIN 、FIN、 RST 等参数。
在TCP报文中MSS的位置就在选项的位置。
根据RFC1323和RFC793规定,选项中内容有很多种,MSS是其中的一种,用kind=2表示;kind=1表示无操作,kind=4、5、6、7称为选择ACK及回显选项,但是由于回显选项已经被时间戳选项取代,同时,目前定义的选择ACK选项仍未定论,也没有包括在RFC1323中,所以具体代表什么含义还无定论。
在实际网络数据传输中,要求MSS+20TCP包头+20IP包头不大于MTU。
MSS在TCP报文中是可选项,不是必选项,换句话说,MSS是可协商项,而且在协商过后,该选项内容可以改变,也可以没有;
在协商MSS时,一般是建立TCP连结的两端发送SYN标志报文时互相通报,然后选取最小MSS作为双方的约定。
如果双方都不通报或有一方不通报,MSS就是TCP数据包每次能够传输的最大数据分段。
为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20字节和TCP数据段的包头20字节),所以往往MSS为1460。
通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
5. 区别及联系
从上文叙述可知:MTU是一个二层的概念,以太网最大的MTU就是1500(它是不包含二层头部的,加上头部应该为1518字节),当然这里说的是很常规的情况,也有些server,比如Server 2008,发出的就是jumbo frame了,这里只讨论常规情况。
IP MTU是一个三层概念,它包含了三层头部及所有载荷,根据下层为上层服务的,上层基于下层才能做进一步的扩展的原则,尽管IP MTU的变化范围很大(68-65535),但也不得不照顾以太网MTU的限制,说白了就是IP对以太网的妥协。
MSS是TCP里面的一个概念,它是TCP数据包每次能够传输的最大数据分段,不包含包头部分,它与IP MTU满足如下关系:
IP MTU= MSS + 20字节(IP包头)+ 20字节(TCP包头)。
当然,如果传输的时候还承载有其他协议,还要加些包头在前面,简言之,MTU就是总的最后发出去的报文大小,MSS就是需要发出去的数据大小。
比如PPPoE,就是在以太网上承载PPP协议(点到点连接协议),它包括6字节的PPPoE头部和2字节的PPP协议ID号,此时,由于以太网的MTU值为1500,所以上层PPP负载数据不能超过1492字节,也就是相当于在PPPOE环境下的MTU是1492字节,MSS是1452字节。
6. MTU问题解决方法
通常情况下,MTU不匹配会表现为两种故障情况:
1. ping大包时不通;
2. 无法访问某些站点。
在这种情况下,通常有两种解决方法:
1. 修改用户端MTU值(不推荐使用);
2. 修改传输路由所有设备MTU值,确保路径MTU值大于用户发送的IP报文的长度,以保证用户报文不会因为超过设备的MTU值被丢弃。
主要要考虑下面几种情况:
1. 对于纯IP网络,要保证:路径MTU值>最大用户报文长度;
2. 对于纯MPLS网络(没有VPN业务),要保证路径MTU值>最大用户报文+一层标签长度(4);
3. 对于三层VPN业务,要保证:路径MTU值>最大用户报文+两层标签长度(8);
3. 对于二层VPN业务,要保证:路由MTU值>最大用户报文长度+两处标签长度(8)+二层帧头长度(18)。
值得注意的是:fast ethernet接口不能调整MTU,所以说在有些设备中,使用MTU命令不能解决问题的。
此外,更改MTU后,如果IGP是OSPF的话,不同的MTU可能会造成OSPF停留在INIT状态,此时需要将两端的MTU调整一致。
7.参考
MTU、IP MTU 和 MSS 参数详解
https://blog.csdn.net/ScilogyHunter/article/details/109647658
车小胖谈网络:MTU 与 MSS
https://zhuanlan.zhihu.com/p/21268782
MTU,MSS和TSO
https://www.yuanguohuo.com/2019/08/20/network-mtu-mss
传输层篇,MTU和MSS
https://mp.weixin.qq.com/s/ZMV2izeYkBIqjPhsv_-wdw
解决 GRE 和 IPsec 中的 IPv4 分段、MTU、MSS 和 PMTUD 问题
https://www.cisco.com/c/zh_cn/support/docs/ip/generic-routing-encapsulation-gre/25885-pmtud-ipfrag.html
网友评论