首页/网络/协议速查/路径 MTU 发现(PMTUD)

路径 MTU 发现(PMTUD)

发送方置 DF 逐步探测整条路径的最小 MTU:收到 ICMP「需要分片」就下调;IPv6 完全依赖这个机制。

协议速查网络更新于 2026-10-13

路径 MTU 发现是什么

PMTUD 让发送方自动找出整条路径上最小的 MTU:先把报文按出接口 MTU 发出去并置 DF 位禁止分片,途中某跳发现放不下就回一条 ICMP「需要分片」(IPv4 类型 3 代码 4),发送方据此下调并重试。IPv6 完全依赖这个机制,路由器不再做分片,只会回「包太大」(类型 2)。

基本信息

工作机制置 DF 发送,收到 ICMP 需要分片后下调 MTU
依赖报文IPv4 类型 3 代码 4;IPv6 类型 2 包太大
失败后果MTU 黑洞:大包被静默丢弃,小包正常
兜底手段net.ipv4.tcp_mtu_probing 自动探测,或中间设备做 MSS clamp
查看接口 MTUip link show,注意隧道与 veth 接口的实际值
相关参数net.ipv4.ip_no_pmtu_disc,0 表示启用 PMTUD

典型使用场景

  • 建立 GRE、IPsec、VXLAN 隧道后,验证内层可用 MTU 并调整两端配置
  • 排查「小包能通、大包超时」类故障,逐级试出实际可通尺寸
  • PPPoE 环境下确认 MTU 是否为 1492 而非 1500
  • 云环境跨可用区或跨账号通信出现丢包,确认中间设备的 ICMP 策略
  • 为不能修改的应用开启 mtu_probing 做兜底
  • 定位 IPv6 环境下的连接挂起,检查是否只回包太大而未真正下调

最小示例

最小示例
ping -M do -s 1472 8.8.8.8        # 1472+28=1500,通说明路径 MTU 至少 1500
ping -M do -s 1452 8.8.8.8        # 1452+28=1480,逐级试出最大可通尺寸
ip link show eth0 | grep mtu      # 查看本地接口 MTU
sysctl net.ipv4.tcp_mtu_probing   # 0 关闭,1 仅在检测到黑洞时探测,2 始终探测
sysctl -w net.ipv4.tcp_mtu_probing=1

失败原因对照

环节可疑点确认方法
隧道GRE / IPsec 外层封装占用 MTU对比隧道两端接口 MTU 设置
PPPoE实际 MTU 为 1492 而配置仍是 1500用 DF 置位大包逐级测试
中间防火墙禁用了 ICMP 差错报文抓包看是否有类型 3 代码 4 返回
云网络VPC 网关或安全组行为差异查厂商文档或提工单确认
终端主机应用忽略 ICMP 导致缓存过期观察 mtu_probing 是否生效
PMTUD 严重依赖 ICMP。把 ICMP 差错报文一并封死,是「网站部分能开、部分卡死」这类疑难故障的常见根因。

易错点

  • 禁 ICMP 的防火墙会杀死 PMTUD:表现为能 ping 小包但 TLS 握手卡住(证书报文较大),必须放行差错报文或配置 MSS clamp
  • 以为调小本机 MTU 就够:只有两端都调整、且中间设备不再回更小的 MTU 才稳定,单向调小常造成方向性故障
  • 忽略隧道封装开销:外层头越大内层可用 MTU 越小,直接沿用 1500 必然丢大包
  • 依赖 MSS clamp 处理所有流量:它只对 TCP 有效,UDP 与 QUIC 仍会被黑洞吞掉,根治要修 PMTU 或放开 ICMP

数据来源与参考

  • RFC 1191(IPv4 PMTUD)
  • RFC 8201(IPv6 PMTUD)

相关工具

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