目录
路径MTU发现
IPv4 PMTUD 工作流程(RFC 1191)
IPv6 PMTUD 特点(RFC 8201)
补充
常见问题与优化
PMTUD vs 手动分片
PTB 报文
作用
PTB 携带关键信息
和 IPv4 对应报文区分
常见故障
IPv4:两种处理大包方式(手动分片 / PMTUD 动态探测)
模式 1:DF=0(可分片,传统手动分片逻辑)
模式 2:DF=1(禁止分片,配合 PMTUD 动态探测,现代 TCP 默认开启)
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 = 允许路由器分片 流程:
- 源主机发 1600 字节 IP 包,出接口 MTU=1500;
- 中间路由器发现包太大,直接把 1600 拆成两片分片;
- 分片逐个转发到目标主机;
- 目标主机把所有分片重组还原原始数据包。
缺点: 分片消耗路由器 CPU;某一片丢失整个包都要重传,效率差。
模式 2:DF=1(禁止分片,配合 PMTUD 动态探测,现代 TCP 默认开启)
DF=1 = 不许中间路由器分片,这就是 PMTUD 的基础 完整 PMTUD 流程:
- 主机默认按本地 MTU=1500 发包,IP 头 DF=1;
- 某条链路 MTU 只有 1400,大包过不去;
- 路由器不能分片,直接丢包,返回 ICMPv4 Type3 Code4(需要分片但 DF 置位),附带这条链路 MTU=1400(路由器直接丢弃数据包,返回一条 ICMPv4 (Type3 Code4) 报文,告诉源:这条链路最大只能传 X 字节)
- 源主机收到这个 ICMP 报文,动态更新路径 MTU 为 1400(源主机收到 ICMP 反馈,动态降低发包尺寸,用更小 MTU 重新发送)
- 之后全部用 1400 长度发包,不再触发丢包,全程不分片(后续所有流量都用这个探测出来的最小 MTU 发送,全程不用路由器分片)
这里的 “动态” 就是:靠 ICMP 反馈自动探测整条路径最小 MTU,不用路由器分片
PMTUD 是动态探测最优包长,从源头避免分片,代替路由器手动分片
IPv6:彻底取消路由器分片,只能靠 PMTUD+PTB 报文
IPv6 硬性规则:中间路由器绝不允许分片,只有源主机能分片。
- 主机先发大包,超过链路 MTU;
- 路由器丢弃数据包,回复ICMPv6 PTB (Type=2) 报文,告知当前链路 MTU;
- 源主机收到 PTB,自动缩小发包长度,适配路径 MTU;
- 全程不存在路由器分片,完全依赖 PTB 做动态 PMTUD
- IPv4 DF=0 大包→路由器手动分片转发,静态拆分,无探测机制(静态被动拆分)
- IPv4 DF=1(PMTUD) 大包被丢弃,ICMP 反馈 MTU,主机动态调整包长,全程不分片(DF=1 + ICMP 反馈 → PMTUD 动态探测,源头控制包大小,杜绝分片)
- IPv6 无路由器分片,依靠 PTB 报文动态探测 MTU,强制 PMTUD