pmtu的逻辑
PMTU(Path MTU,路径最大传输单元)是网络通信中一个非常核心的概念。简单来说,它的作用是动态探测并确定从源端到目的端整条传输路径上,所能支持的最大数据包大小。
为了让你透彻理解,我将从核心背景、工作原理、关键机制以及实际意义四个维度为你展开说明:
1. 为什么需要 PMTU?(核心背景)
在网络中,数据包从源主机到目的主机通常要经过多个路由器。不同的链路技术(如以太网、Wi-Fi、PPP、隧道封装等)支持的最大帧大小(MTU)是不同的。
- 整条路径的 MTU 取决于其中最小的一环(木桶效应)。
- 如果发送方发送的数据包大于路径中某个路由器的 MTU,且该数据包的 DF(Don't Fragment,禁止分片) 位被置为 1,路由器就会丢弃该包,并返回一个 ICMP "Fragmentation Needed" 消息。
PMTU 的目的:就是让发送方尽早知道这个“最小 MTU”是多少,从而直接发送合适大小的包,避免在传输过程中被丢弃或产生不必要的分片。
2. PMTU 的核心逻辑:PMTUD
PMTU 的发现过程被称为 PMTUD (Path MTU Discovery)。其逻辑流程如下:
- 初始假设:发送方通常假设路径 MTU 等于本地接口的 MTU(例如 1500 字节)。
- 发送探测:发送方发送一个设置了 DF 位 的数据包,大小等于当前假设的 MTU。
- 触发报错:如果路径中某个路由器发现
包大小 > 接口MTU且DF=1:- 路由器丢弃该数据包。
- 路由器向源 IP 发送 ICMP Type 3, Code 4 (Fragmentation Needed) 消息。
- ICMP 消息中会携带该路由器的 Next-Hop MTU(下一跳 MTU)。
- 调整大小:源主机收到 ICMP 后,将路径 MTU 更新为 ICMP 中报告的值,并降低后续数据包的大小。
- 循环探测:如果后续包顺利到达,发送方可能会尝试稍微增大包大小(取决于实现),或者保持当前值,直到再次遇到 ICMP 报错或连接结束。
3. 关键细节与常见坑
在理解 PMTU 逻辑时,以下几个技术细节至关重要:
A. DF 位 (Don't Fragment)
这是 PMTUD 的开关。
- DF=1:启用 PMTUD。包太大就丢弃并报错。
- DF=0:允许路由器分片。路由器会把大包切成小块转发。这会导致性能下降(因为接收方需要重组,且只要丢一个碎片,整个包都要重传)。
- 现代 TCP/IP 栈默认对 TCP 流量设置 DF=1。
B. ICMP 黑洞 (ICMP Black Hole)
这是 PMTUD 最常见的故障场景。
- 现象:很多防火墙或安全策略会丢弃所有入站的 ICMP 消息。
- 表现:网页打不开、SSH 连得上但卡死、大文件传不过去,但 Ping 小包头正常。
C. 封装开销 (Encapsulation Overhead)
PMTU 必须考虑协议头的开销。
- 例如:物理 MTU 是 1500,但如果你用了 IPsec 或 GRE 隧道,包头会增加 50~60 字节。
- 如果 PMTUD 没正确减去这部分开销,或者中间设备没正确处理,就会导致“有效载荷”溢出,引发分片或丢包。
D. TCP MSS vs. PMTU
- MSS (Maximum Segment Size) 是 TCP 层面的概念,通常在三次握手时协商。
- 关系:
MSS = PMTU - IP头 - TCP头。 - 如果 PMTUD 发现路径 MTU 变小,TCP 栈会相应降低 MSS,或者在后续包中减少 Payload 大小。
4. 总结:PMTU 的逻辑闭环
你可以把 PMTU 的逻辑想象成**“开车过限高杆”**:
- 你开着一辆大卡车(大包,DF=1)出发。
- 遇到限高杆(路由器 MTU 限制)。
实际运维建议
如果你在排查网络问题,怀疑是 PMTU 导致的:
- 测试命令:
- Linux:
ping -M do -s 1472 <目标IP>(1472 + 28字节头 = 1500) - Windows:
ping -f -l 1472 <目标IP> - 如果 Ping 不通但小包通,大概率是 PMTU/ICMP 问题。
- Linux:
- 解决方案:
- 开启防火墙的 ICMP Type 3 Code 4 放行。
- 在接口上配置 TCP MSS Clamping(强制钳制 MSS),例如
ip tcp adjust-mss 1360,绕过 PMTUD 的探测过程,直接告诉对方“别发大包”。 - 检查隧道/VPN 的 MTU 设置,确保
Tunnel MTU = Physical MTU - Overhead。
希望这个展开说明能帮你建立起对 PMTU 的立体认知!如果有具体的场景或报错,欢迎继续提问。
浙公网安备 33010602011771号