MTU、Path MTU 与网络分片排障
什么是MTU(Maximum Transmission Unit)?
最大传输单元 MTU(Maximum Transmission Unit)表示某个网络接口或链路能够承载的最大三层数据包大小,单位为字节。以太网常见 IP MTU 为 1500,但 PPPoE、隧道、VPN 和叠加网络会因为额外封装而降低可用 MTU。报文超过路径可承载值时,可能被分片或丢弃,并触发路径 MTU 发现。
为什么需要MTU?
网络中通常以数据包为单位进行信息传递,那么,一次传送多大的包合适、多大的包最高效就成为一个核心问题之一。如果包大小设置的很大,意味着报文中的有效数据也更多,通信效率更高,但传送一个数据包的延迟也越大,数据包中bit位发生错误的概率也越大。并且如果这个报文丢掉了,重传的代价也很大。如果包大小设置的过小,则意味传输相同的数据量,设备需要处理更多的报文,这样会极大的考验设备的线速转发能力。通过设置MTU来调节网络上数据包的大小,让不同的网络找到最适宜的MTU从而提高转发效率,这就是MTU的作用。
MTU 与链路承载能力密切相关,但排障时通常讨论的是接口 IP MTU 和整条路径的 Path MTU,不能简单理解成“只属于数据链路层”。不同介质和封装有不同的可用值:
网络默认MTU值
为什么以太网MTU通常被设置为1500?
RFC标准定义以太网的默认MTU值为1500。那么这1500的取值是怎么来的呢?
早期的以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,所以规定了以太帧长度最小为64字节,最大为1518字节。最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节,虽然技术不断发展,但协议一直没有更改。
以太网最大的数据帧是1518字节,这样刨去帧头14字节和帧尾CRC校验部分4字节,那么剩下承载上层IP报文的地方最大就只有1500字节,这个值就是以太网的默认MTU值。这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。
MTU示意图
实际上,不同的厂商,甚至同一厂商的不同产品型号对MTU的定义也不尽相同,通常分为以下几种:
- MTU用以指示整个IP报文的最大长度(IP头+三层Payload),MTU是一个三层的定义,即MTU = IP MTU。例如在Huawei NetEngine系列路由、CloudEngine系列交换机上,MTU是三层的定义,指IP MTU。
- MTU的值等于IP报文与以太帧头的总和,即MTU = IP MTU + 14字节。例如在Cisco部分设备上,MTU是指IP MTU + 以太帧头。
- MTU的值等于IP报文与以太帧头、CRC部分的总和,即MTU = IP MTU + 18字节。例如在Juniper部分设备上,MTU是指IP MTU + 以太帧头 + CRC部分。
在实际设置MTU值时,需要特别关注各厂商、产品对于MTU的定义。
超过MTU的报文如何进行分片?
以太网缺省MTU=1500字节,这是以太网接口对IP层的约束,如果IP层有<=1500字节需要发送,只需要一个IP包就可以完成发送任务;如果IP层有>1500字节数据需要发送,需要分片才能完成发送。
以主机发送一个数据载荷长度为2000字节的报文为例说明其分片的过程(假设出接口的MTU值为1500)。在网络层会对报文进行封装,其结构组成:IP头部20字节+数据载荷长度2000字节,报文封装后,整个报文长度为2020字节。在出接口进行转发的时候,发现IP报文的长度超过了MTU的值1500,因此要进行分片处理,详情见下图。
IP分片示意图
第一片报文,IP报文头固定20字节,数据载荷可以封装1480字节(MTU值1500字节-IP报文头20字节,数据载荷长度须是8的倍数);
第二片报文,复制第一片的IP头,IP报文头固定20字节,数据载荷为剩余的520字节(总数据载荷长度2000字节减去第一片中已封装的1480字节)。如果最后一片报文的长度不足46字节,会自动填充至46字节。
所有分片报文在发送至目的主机后,在目的主机进行分片重组,恢复为原报文。在进行重组时,通过IP标志位中的MF用来分辨这是不是最后一个分片,片偏移用来分辨这个分片相对原数据报的位置。通过这几个字段,可以准确的完成数据报的重组操作。
Jumbo帧与MTU
以太网经过几十年的发展,速度已经从最初的10M被提升到了上百G,速度提高了上万倍。在这样高速度的传输数据中,如果还是延续经典以太网的最大帧长不超过1518 字节的限制,那么在每秒中传输的数据包的个数将很大。由于每个数据包都需要网络设备来进行处理,由此带来的额外开销也将很大,而且这个开销随着网络速度的提高而愈加明显。
于是一些厂商提出了巨型帧(Jumbo Frame)的概念,把以太网的最大帧长扩展到了9K,相当于增强版的MTU,区别在于:
- Jumbo帧是在数据链路层进行处理的。MTU涉及的分片通常是在网络层进行。
- Jumbo帧长包括二层以太帧头及CRC部分。MTU一般不包括这部分,指的是三层IP报文部分的长度。在网络应用中,MTU最大值受限于Jumbo帧的最小值,MTU值至少要比Jumbo帧小18字节
加大帧长的好处在于,减少了网络中数据包的个数,减轻了网络设备处理包头的额外开销。大量减少的帧数目也带来了性能的提高。Jumbo帧是一种厂商标准的超长帧格式,目前还没有获得IEEE标准委员会的认可,但是大多数的设备厂商都已经开始支持。
TCP MSS与MTU
TCP MSS(Maximum Segment Size)是指TCP协议所允许的从对方收到的最大报文长度,即TCP数据包每次能够传输的最大数据分段,只包含TCP Payload,不包含TCP Header和TCP Option。MSS是TCP用来限制application层最大的发送字节数。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往根据MTU值来计算(需要减去IP包头20字节和TCP包头20字节),所以通常MSS为1460=1500(MTU)- 20(IP Header) -20 (TCP Header)。
TCP MSS与MTU示意图
Path MTU与MTU
顾名思义,Path MTU就是指传输路径的MTU,无需分片就能穿过某路径的数据包最大长度。在从发送端到接收端的传输路径上,如果网元的MTU设置不一致,则决定该路径可用MTU的,其实是整条路径上的最小MTU值。以Path MTU作为IP包长发送数据,既高效又能避免分片。
Path MTU示意图
RFC 1191(IPv4)和RFC 1981(IPv6)定义了动态探测Path MTU值的技术,用于确定两个IP主机之间的Path MTU。首先源节点假设Path MTU就是其出接口的MTU,发出一个试探性的报文,并设置改报文不允许被分片。当转发路径上存在一个小于当前假设的Path MTU时,转发设备就会向源节点发送回应报文,并且携带自己的MTU值,此后源节点将Path MTU的假设值更改为新收到的MTU值继续发送报文。如此反复,直到报文到达目的地之后,源节点就能知道到达目的地的Path MTU了。
Path MTU探测
IPv4 和 IPv6 都有路径 MTU 发现机制,但它依赖端点及网络设备正确处理 ICMP。实际网络中 PMTUD 可能因为以下原因失效:
- 某些运营商或网站考虑网络安全或其他需要,把ICMP探测报文过滤掉了。
- Path MTU需要主机和互联网上的各种网络设备(交换机、路由器、防火墙等)的配合,但有些网络设备不遵从RFC 1191协议。
如何设置MTU
在网络中,由于不同厂商,甚至同一厂商不同型号的设备,对MTU的定义和MTU分片机制不尽相同,常出现MTU引起的网络问题,例如协议对接不成功、部分网站或链接打不开、游戏卡顿等。因此对MTU进行合理的规格、部署至关重要。
其最基本的原则:对接的两个三层设备以太网接口MTU配置需要保持一致。
两端MTU保持一致
同时还需要考虑多种场景下各种封装标签对报文大小的影响,例如封装MPLS标签,每层标签会增加4字节,增加MPLS标签后,报文长度也可能超过链路层允许发送的范围,导致报文无法转发。
骨干网、城域网络、接入网络MTU的配置建议
为保证骨干网络、城域网络、接入网络的完美工作,MTU的数值一定要远大于以太网标准的基本要求1500字节。通常现有的大型路由器、交换机设备,都可以支持到9000以上的大数据报文,但缺省配置各厂商并不相同,很多厂商设备的缺省MTU配置仍然是1500字节。并且因为网络中很可能运行OSPF、ISIS等需要协商MTU的路由协议,所以互相对接的不同厂商的设备的MTU也要调整为相同。
因此,应依据业务、封装和运营商规范确定端到端 MTU,并保证同一二层域、路由邻接和隧道路径配置一致,而不是简单追求“越大越好”。
数据中心等局域网络MTU的配置建议
在目前大规模建设的数据中心等网络中,通常没有对MTU进行统一调整。随着新技术的应用,MTU的问题会逐步暴露出来。比如为进行大二层扩展进行的各类隧道技术的使用,VPLS、VXLAN等。这些技术无一例外的都使用了额外的封装,形成了超大报文,例如VXLAN会在原始报文基础上增加50字节。如不统一进行MTU的规划,会导致传输效率低下,或者业务中断。
因此,在数据中心网络建设中,应建立统一 MTU 规范,给 VXLAN、GRE、IPsec 等封装预留开销,并通过端到端测试确认物理网络与 Overlay 都能承载目标报文。
IPv4、IPv6 与分片差异
- IPv4 路由器可以对允许分片的报文进行分片;设置 DF 后,路径设备应返回 ICMP“需要分片”信息。
- IPv6 路由器不在转发途中分片,报文过大时返回 ICMPv6 Packet Too Big,由源主机调整大小。
- 不应为“安全”而一刀切屏蔽 ICMP/ICMPv6,否则容易形成 MTU 黑洞:小包正常,大包、HTTPS 握手或文件传输卡住。
- PLPMTUD 可以通过传输层探测缓解部分 ICMP 被过滤的问题,但不能代替正确的网络配置。
常见封装开销参考
| 场景 | 对可用 MTU 的影响 |
|---|---|
| 普通以太网 | 常见 IP MTU 1500 |
| PPPoE | 常见 IP MTU 1492 |
| 单层 802.1Q VLAN | 设备通常支持带标签帧,但需核对端口最大帧长 |
| GRE/IPsec | 取决于外层 IP、加密算法、NAT-T 等,不能只记固定数值 |
| VXLAN | 常见额外开销约 50 字节,IPv6 Underlay 或其他封装会继续增加 |
排查步骤
- 画出真实路径,记录端点、交换机、路由器、防火墙、VPN 和隧道接口 MTU。
- Linux 使用
tracepath <目标>观察估算 PMTU;Windows 使用ping -f -l <载荷> <目标>,Linux IPv4 使用ping -M do -s <载荷> <目标>。 - 计算 ICMP 测试载荷时扣除 IP 与 ICMP 头;IPv4 常扣 28 字节,IPv6 常扣 48 字节。
- 抓包检查 ICMP Fragmentation Needed 或 ICMPv6 Packet Too Big 是否正常返回。
- 修正端到端 MTU 后再调整 TCP MSS;MSS Clamping 是兼容手段,不应掩盖错误的链路规划。






