路径MTU发现

目录

路径MTU发现

[IPv4 PMTUD 工作流程(RFC 1191)](#IPv4 PMTUD 工作流程(RFC 1191))

[IPv6 PMTUD 特点(RFC 8201)](#IPv6 PMTUD 特点(RFC 8201))

补充

常见问题与优化

[PMTUD vs 手动分片](#PMTUD vs 手动分片)

[PTB 报文](#PTB 报文)

作用

[PTB 携带关键信息](#PTB 携带关键信息)

[和 IPv4 对应报文区分](#和 IPv4 对应报文区分)

常见故障

[IPv4:两种处理大包方式(手动分片 / PMTUD 动态探测)](#IPv4:两种处理大包方式(手动分片 / PMTUD 动态探测))

[模式 1:DF=0(可分片,传统手动分片逻辑)](#模式 1:DF=0(可分片,传统手动分片逻辑))

[模式 2:DF=1(禁止分片,配合 PMTUD 动态探测,现代 TCP 默认开启)](#模式 2:DF=1(禁止分片,配合 PMTUD 动态探测,现代 TCP 默认开启))

[IPv6:彻底取消路由器分片,只能靠 PMTUD+PTB 报文](#IPv6:彻底取消路由器分片,只能靠 PMTUD+PTB 报文)


路径MTU发现

路径 MTU 发现(PMTUD) 是 TCP/IP 协议栈的核心机制,用于动态探测源到目标路径上的最小 MTU(Path MTU),避免数据包在中间路由器被分片或丢弃,提升传输效率

  • MTU(最大传输单元) :单条链路上可传输的最大 IP 数据包长度(不含二层帧头),以太网默认 1500 字节
  • PMTU(路径 MTU) :源到目标整条路径中,最小的链路 MTU,决定了整条路径能传输的最大无分片数据包大小。
  • PMTUD :通过IP 头部 DF 位ICMP 错误报文,动态发现 PMTU 的机制

IPv4 PMTUD 工作流程(RFC 1191)

  • 初始假设 :源主机以出接口 MTU (如 1500)作为初始 PMTU,发送数据包时设置 IP 头部 DF=1(不分片)
  • 中间节点检测 :若数据包大小 > 某路由器出接口 MTU,且 DF=1,路由器丢弃数据包 ,并返回ICMP 目的不可达 报文,代码为 "需要分片但 DF 置位",同时携带该路由器出接口的 MTU 值
  • 源端调整 :源收到 ICMP 报文后,将 PMTU 更新为该更小的 MTU,并按新尺寸重传数据
  • 收敛完成:重复上述过程,直到数据包可无分片到达目标,此时的 PMTU 即为路径最小 MTU

IPv6 PMTUD 特点(RFC 8201)

  • 中间路由器禁止分片:IPv6 仅允许源端分片,中间路由器不处理分片
  • 专用 ICMPv6 报文 :超 MTU 时返回 ICMPv6 Packet Too Big(PTB) 报文,明确携带受限链路的 MTU 值
  • 机制更可靠 :无 IPv4 中 "ICMP 被过滤" 导致的黑洞问题,是 IPv6 的必选机制


补充

DF 位(Don't Fragment) :IP 头部标志位,DF=1 禁止中间路由器分片,是 PMTUD 的触发开关

ICMPv4/ICMPv6 报文

  • IPv4:ICMP Type=3, Code=4(需要分片且 DF 置位)
  • IPv6:ICMPv6 Type=2(Packet Too Big)

PMTU 缓存与老化:源主机缓存每条路径的 PMTU,默认老化时间(如 10 分钟),超时后重新探测

与 TCP MSS 的关系 :TCP 会基于 PMTU 计算 MSS = PMTU - 40(IP+TCP 头部),确保 TCP 段不超 PMTU,避免分片Cisco



常见问题与优化

PMTU 黑洞(最常见故障)

  • 原因:防火墙 / 路由器过滤 ICMP 不可达报文 ,源收不到反馈,持续发送大包导致持续丢包
  • 解决:
    • 放行 ICMP Type=3 Code=4(IPv4)/ Type=2(IPv6)
    • 启用 PLPMTUD(数据包层 PMTU 发现),通过应用层探测替代 ICMP,更鲁棒

性能影响

  • 探测阶段会产生少量丢包与重传,但长期避免分片,整体提升吞吐量

配置建议

  • 服务器 / 路由器默认启用 PMTUD
  • 关键链路统一 MTU(如 1500),减少 PMTU 波动
PMTUD vs 手动分片
对比项 PMTUD(自动) 手动设置小 MTU
效率 动态适配,最大化包长 固定小包,带宽利用率低
适应性 路径变化自动调整 路径变化需手动改配置
复杂度 协议自动处理 运维成本高
适用场景 互联网、复杂广域网 简单局域网、已知固定 MTU

PMTUD 是避免 IP 分片、优化传输性能 的核心机制,通过DF 位 + ICMP 反馈动态找到路径最小 MTU

IPv4 依赖 ICMP 易遇黑洞,IPv6 通过专用 PTB 报文更可靠,现代网络(如数据中心、云)均需正确配置与放行相关 ICMP,以保障传输效率


PTB 报文

Packet Too Big,ICMPv6 专用报文,类型值 Type=2

作用

IPv6 规定:中间路由器不能对数据包分片,只有源主机能分片

当收到的 IPv6 数据包长度超过路由器出接口 MTU,且无法分片时:

路由器丢弃报文,回复一条 PTB 报文给源主机

PTB 携带关键信息

报文内部会写明当前链路允许的最大 MTU 值,源主机收到后,自动降低发包长度,匹配这条路径 MTU(PMTUD 机制)

和 IPv4 对应报文区分
  • IPv4:MTU 超限、DF 置位时,返回 ICMPv4 Type3 Code4(需要分片但不分片)
  • IPv6:统一使用 ICMPv6 Type2 PTB 报文,是 IPv6 路径 MTU 发现的核心反馈报文
常见故障

防火墙拦截 ICMPv6 PTB 报文后,源主机收不到 MTU 提醒,持续发送大包,出现网页打不开、文件传输卡顿等 PMTU 黑洞问题



  • MTU:一条链路二层能承载的最大 IP 包,以太网默认 1500 字节。
  • IP 分片:一个大包超过出口 MTU,路由器把大包拆成多个小包,到目的地再重组

IPv4:两种处理大包方式(手动分片 / PMTUD 动态探测)

IPv4 路由器天生支持分片,分两种模式,由 IP 头部 DF 标志位控制:

模式 1:DF=0(可分片,传统手动分片逻辑)

DF=0 = 允许路由器分片 流程:

  1. 源主机发 1600 字节 IP 包,出接口 MTU=1500;
  2. 中间路由器发现包太大,直接把 1600 拆成两片分片;
  3. 分片逐个转发到目标主机;
  4. 目标主机把所有分片重组还原原始数据包。

缺点: 分片消耗路由器 CPU;某一片丢失整个包都要重传,效率差。

模式 2:DF=1(禁止分片,配合 PMTUD 动态探测,现代 TCP 默认开启)

DF=1 = 不许中间路由器分片,这就是 PMTUD 的基础 完整 PMTUD 流程:

  1. 主机默认按本地 MTU=1500 发包,IP 头 DF=1;
  2. 某条链路 MTU 只有 1400,大包过不去;
  3. 路由器不能分片 ,直接丢包,返回 ICMPv4 Type3 Code4(需要分片但 DF 置位),附带这条链路 MTU=1400(路由器直接丢弃数据包,返回一条 ICMPv4 (Type3 Code4) 报文,告诉源:这条链路最大只能传 X 字节)
  4. 源主机收到这个 ICMP 报文,动态更新路径 MTU 为 1400(源主机收到 ICMP 反馈,动态降低发包尺寸,用更小 MTU 重新发送)
  5. 之后全部用 1400 长度发包,不再触发丢包,全程不分片( 后续所有流量都用这个探测出来的最小 MTU 发送,全程不用路由器分片**)**

这里的 "动态" 就是:靠 ICMP 反馈自动探测整条路径最小 MTU,不用路由器分片

PMTUD 是动态探测最优包长,从源头避免分片,代替路由器手动分片

IPv6:彻底取消路由器分片,只能靠 PMTUD+PTB 报文

IPv6 硬性规则:中间路由器绝不允许分片,只有源主机能分片。

  1. 主机先发大包,超过链路 MTU;
  2. 路由器丢弃数据包,回复 ICMPv6 PTB (Type=2) 报文,告知当前链路 MTU;
  3. 源主机收到 PTB,自动缩小发包长度,适配路径 MTU;
  4. 全程不存在路由器分片,完全依赖 PTB 做动态 PMTUD
  • IPv4 DF=0 大包→路由器手动分片转发,静态拆分,无探测机制(静态被动拆分)
  • IPv4 DF=1(PMTUD) 大包被丢弃,ICMP 反馈 MTU,主机动态调整包长,全程不分片(DF=1 + ICMP 反馈 → PMTUD 动态探测,源头控制包大小,杜绝分片)
  • IPv6 无路由器分片,依靠 PTB 报文动态探测 MTU,强制 PMTUD
相关推荐
Tian_Hang2 小时前
Eclipse Ditto 物模型相关代码
java·运维·服务器·ide·eureka·eclipse
假如梵高是飞行员2 小时前
WSL2 从 img 镜像文件启动特定 Linux 发行版完整指南
linux·windows·wsl
tachibana24 小时前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
瓶中怪4 小时前
ROS2 机器人软件系统
linux·c++·python·ubuntu·vmware·ros2·机器人软件开发
iangyu4 小时前
linux配置时间同步
linux·运维·服务器
天空'之城4 小时前
Linux 系统编程 04:进程基础
linux·开发语言·进程基础
从零开始的代码生活_4 小时前
NAT、代理服务与内网穿透详解
linux·服务器·网络·c++·http·智能路由器
云栖梦泽在4 小时前
Claude Code / Codex 使用卡顿怎么办?AI 编程 Agent 连接失败与网络排查思路
网络·人工智能·网络协议·chatgpt·性能优化
灯厂码农4 小时前
C语言内存管理——内存对齐与共用体union
linux·服务器·c语言