什么是 MTU(最大传输单元)?如果数据包超过 MTU 会发生什么?
MTU 是 Maximum Transmission Unit(最大传输单元)的缩写。
简单来说,它是网络设备(如网卡、路由器、交换机)在一次传输中能够处理的最大数据包大小(以字节为单位)。
1. 什么是 MTU?
你可以把网络连接想象成一条隧道,把数据包想象成通过隧道的卡车。MTU 就是隧道允许通过的卡车的最大长度/载重。
- 标准值: 在最常见的以太网(Ethernet)中,标准的 MTU 值通常是 1500 字节。
- 包含内容: 这个 1500 字节通常指的是 IP 报头 + TCP/UDP 报头 + 有效载荷(数据)。它不包括以太网帧本身的物理层头部(Frame Header)和尾部(FCS)。
- 特殊情况:
- PPPoE (ADSL拨号): 通常为 1492 字节(因为 PPPoE 头部占用了 8 字节)。
- Jumbo Frames (巨型帧): 在某些高性能数据中心网络中,MTU 可以设置为 9000 字节,以提高传输效率。
2. 如果数据包超过 MTU 会发生什么?
当一个设备尝试发送一个大于网络路径上某节点 MTU 的数据包时,会发生以下两种情况之一,具体取决于数据包的设置(主要是 IPv4 报头中的 DF 位,即 Don't Fragment 不分片标志):
情况 A:允许分片 (Fragmentation)
如果数据包没有设置“不分片”(DF = 0),路由器会将这个大数据包“切碎”成几个更小的片段,使其能够通过该链路。
- 拆分: 路由器将大数据包拆分成多个小于或等于 MTU 的小数据包(分片)。
- 标记: 每个分片都会被标记,以便接收端知道它们属于同一个原始数据包。
- 重组: 这些分片独立传输,最终由接收端的主机(而不是中间的路由器)负责将它们重新组装成原始数据包。
- 缺点:
- 增加路由器负担: 分片需要消耗路由器的 CPU 资源。
- 效率降低: 每个分片都需要复制一份 IP 报头,增加了额外开销。
- 丢包风险剧增: 如果其中任何一个分片在传输中丢失,接收端就无法重组,导致整个原始数据包作废,发送端必须重传整个大数据包(而不是仅重传丢失的那个分片)。
情况 B:不允许分片 (Drop & ICMP)
这是现代网络(尤其是 TCP 连接)中最常见的情况。如果数据包设置了“不分片”标志(DF = 1),或者是在 IPv6 网络中(IPv6 路由器不允许分片):
- 丢弃: 路由器发现包太大且不能分片,直接丢弃该数据包。
- 报错: 路由器向发送端发送一个 ICMP 消息(Type 3, Code 4),内容是:“Destination Unreachable: Fragmentation Needed and DF Set”(无法到达目的地:需要分片但设置了不分片位)。
- 调整 (PMTUD): 发送端收到这个 ICMP 消息后,知道刚才的包太大了,于是会根据消息中建议的 MTU 值,缩小数据包大小并重新发送。
- 这被称为“路径 MTU 发现”(Path MTU Discovery, PMTUD)。 它的目的是自动找到发送端到接收端整条路径上最小的那个 MTU 值,从而避免分片带来的性能损耗。
3. 总结与比喻
- MTU = 隧道的高度限制。
- 数据包 = 卡车。
如果卡车(数据包)比隧道(MTU)高:
- 分片(Fragmentation): 把卡车里的货物卸下来,分装到几辆小车里运过去,到了目的地再重新装回大车。这很麻烦,且容易出错(如果一辆小车丢了,整车货都废了)。
- 丢包(Drop): 隧道管理员把卡车拦下,不让过,并告诉司机:“车太高了,换辆小点的车再来!”(这就是 PMTUD 的过程)。
为什么这很重要?
- MTU 太大: 如果超过路径限制且被防火墙拦截了 ICMP 报错,会导致“黑洞”现象(网页打不开,或者加载一半卡住),因为发送端不知道包被丢了,一直在重传大包。
- MTU 太小: 虽然能通,但传输效率低。就像用摩托车搬家,虽然能钻过任何隧道,但要跑很多趟,大部分时间都花在路上(报头开销)而不是运货(有效数据)上。