路径 MTU 发现是什么?为什么 ICMP 被屏蔽会导致 PMTU 黑洞?
简化版
路径 MTU 发现,PMTUD,用于发现从源到目的路径上能通过的最大包大小,避免 IP 分片或减少分片。
IPv4 中发送端可以设置 DF 标志。如果中间链路 MTU 更小,路由器不能分片,就丢包并返回 ICMP Fragmentation Needed。发送端据此降低包大小。
如果这些 ICMP 报文被防火墙屏蔽,发送端不知道该变小,继续发大包,表现为连接能建立但大数据传输卡住,这就是 PMTU 黑洞。
详细版
典型流程:
发送端发 1500 字节包,DF=1
中间链路 MTU=1400
路由器丢包
路由器返回 ICMP: fragmentation needed, MTU=1400
发送端降低包大小
PMTU 黑洞:
大包被丢弃
ICMP 被过滤
发送端不知道原因
持续重传大包
排查时常见现象是 ping 小包通,大包不通;TCP 握手成功,TLS 或 HTTP 大响应卡住。
完整版教学
1. 先说明为什么要发现路径 MTU
每条链路都有 MTU。
以太网常见 MTU 是 1500 字节。
但路径中可能经过隧道、VPN、PPPoE、云网络封装,实际可用 MTU 变小。
如果发送的 IP 包超过某段链路 MTU,就需要分片或丢弃。
PMTUD 的目标是找到整条路径上不需要分片也能通过的最大包大小。
2. IPv4 PMTUD 基本流程
发送端设置 DF 标志。
DF = Don't Fragment
如果中间路由器发现下一跳 MTU 不够,又不能分片,就丢弃该包。
然后返回 ICMP:
Destination Unreachable: Fragmentation Needed
其中可能包含下一跳 MTU。
发送端收到后调小包大小。
3. IPv6 中的差异
IPv6 路由器不会像 IPv4 那样对转发中的包做分片。
分片由源端处理。
如果包太大,中间设备返回 ICMPv6 Packet Too Big。
因此 IPv6 更依赖正确的路径 MTU 发现。
随意屏蔽 ICMPv6 会导致很多 IPv6 基础功能异常。
4. PMTU 黑洞是什么
PMTU 黑洞发生在:
大包过不去 + ICMP 错误回不来
发送端不知道中间链路 MTU 太小。
它会继续发送大包并等待重传。
用户看到的是“部分请求正常,传大文件或 HTTPS 页面卡住”。
这类故障很迷惑,因为小包测试常常是通的。
5. 常见触发场景
| 场景 | 为什么容易出问题 |
|---|---|
| VPN | 隧道封装减少有效 MTU |
| GRE/IPsec | 额外头部占用空间 |
| 云 VPC 隧道 | 叠加网络封装 |
| 防火墙过度拦 ICMP | PMTUD 反馈丢失 |
| PPPoE | MTU 常小于 1500 |
这些场景里,MTU 和 MSS 配置要一起看。
6. 排查和缓解
排查可以用指定大小 ping。
ping -f -l 1472 example.com
不同系统参数不同,但思路是发带 DF 的大包测试。
缓解方式包括:
- 放行必要 ICMP/ICMPv6 错误报文。
- 调整接口 MTU。
- TCP MSS Clamping。
- 避免无意义封锁所有 ICMP。
- 对隧道链路做 MTU 规划。
其中 MSS Clamping 常用于网关上调整 TCP MSS,避免 TCP 发送过大的段。
7. 常见误区与追问
- 误区:ICMP 都不安全,应该全部禁掉。 PMTUD、ping、错误反馈等都依赖 ICMP,粗暴屏蔽会引发故障。
- 误区:ping 通就说明 MTU 没问题。 小包 ping 通不代表大包能过。
- 误区:PMTU 黑洞只影响 UDP。 TCP 大包传输、TLS 握手和 HTTP 响应都可能受影响。
- 追问:为什么 TCP 握手成功但页面加载卡住? 握手包很小,大响应包可能超过路径 MTU 并被黑洞丢弃。
- 追问:MSS Clamping 解决什么? 通过降低 TCP MSS 避免发送过大的 IP 包。
- 追问:IPv6 为什么更不能乱屏蔽 ICMPv6? NDP 和 Packet Too Big 等基础能力依赖 ICMPv6。
8. 加强记忆
PMTUD 记成“沿途问路:最大包能有多大”。
PMTU 黑洞就是“路上说过不去的回信被拦了,发送端还在硬塞大包”。