首页/网络/网络排障速查/PMTUD 黑洞:大包丢失的经典故障
连通性与链路检测54 条

PMTUD 黑洞:大包丢失的经典故障

路径上有设备丢弃『需要分片』的包却不回 ICMP 通告时,PMTUD 失效:表现为小包全通、大包(如 HTTPS 首选大包/文件上传)卡死。

网络排障速查网络更新于 2026-10-13

PMTUD 与黑洞的产生

路径 MTU 发现(PMTUD)靠一个约定运转:路由器遇到「不分片」但超过下一跳 MTU 的包时,丢弃并回一个 ICMP 差错报文,告知发送方该用多小的 MTU。若路径上某个防火墙或安全设备丢弃了这类 ICMP 差错报文,发送方永远收不到通知,就会一直重发同样大的包,形成所谓黑洞。表现出来就是小包通畅、大包静默丢失。

典型现象

网页首页能打开但表单提交或文件上传卡死、SSH 登录成功但一执行大输出就僵住、数据库查询小结果正常而大结果超时——这些都是典型的 MTU 症状。判别方式很直接:同一目标用小包与大包分别测试,小包稳定、大包失败,且抓包能看到重传,就可以基本确认。

基本信息

适用平台Linux / Windows / 网络设备(跨平台通用问题)
关键开关net.ipv4.tcp_mtu_probing(0 关闭,1 始终,2 仅黑洞时开启)
常见诱因隧道与 VPN 封装、GRE/IPsec、云网络覆盖层
根治手段中间设备启用 MSS 钳制并正确回送 ICMP 差错

识别与缓解

识别与缓解
ping -M do -s 1472 10.0.0.5       # 大包失败,说明路径 MTU 不足
ping -c3 -s 100 10.0.0.5          # 小包正常,形成对照
sudo ip link set dev eth0 mtu 1400  # 临时缓解:把本机 MTU 下调
sysctl net.ipv4.tcp_mtu_probing    # 查看黑洞探测开关当前值
sysctl -w net.ipv4.tcp_mtu_probing=2   # 临时开启:仅在疑似黑洞时探测
sudo tcpdump -nn -i eth0 'host 10.0.0.5 and tcp' -c 30   # 观察是否反复重传同一大包

现象与对应判断

现象可能原因核对方式
能建连但传大文件失败路径 MTU 小于本机 MTU禁用分片的大包测试
抓包看到反复重传同一个大包ICMP 差错被中间设备丢弃两端同时抓包对照
隧道内业务卡顿封装开销使有效 MTU 变小ping 定位隧道内可用包长
调小本机 MTU 后恢复确认是 MTU 问题把 MTU 改回复现对比

典型使用场景

  • VPN 打通后内网应用偶发卡死:优先怀疑隧道封装导致的 MTU 不足
  • 云上跨可用区访问异常:云网络覆盖层通常比物理链路 MTU 更小
  • 容器跨节点通信异常:Overlay 网络封装带来额外的头部开销
  • 安全设备改造后业务异常:新设备丢弃 ICMP 差错报文会直接造成黑洞
  • 应用升级后出现上传超时:先排除 MTU,再查应用侧超时配置
缓解顺序建议是先在本机下调 MTU 验证结论,再在网关或防火墙上启用 MSS 钳制根治;只在本机降 MTU 无法解决其他主机的同类问题,也无法处理双向路径差异。
tcp_mtu_probing 只是本机侧的补救手段,无法修复中间设备丢弃 ICMP 差错这一根源;开启后传输层会尝试更小的包,代价是连接前期性能下降。

易错点

  • TCP 建连成功就认为 MTU 没问题:控制包小、数据包大,问题往往在传输阶段才暴露
  • 只在本机降 MTU,忽略去程与回程路径可能不同,双向都要验证
  • 把中间设备丢弃 ICMP 差错当成「无所谓的安全加固」,直接制造了 PMTUD 黑洞
  • 在隧道场景沿用物理口的 1500,没有扣除封装头部,业务大包必然被丢弃

数据来源与参考

  • RFC 1191:Path MTU Discovery
  • RFC 8899:Packetization Layer PMTU Discovery

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌