- 文档首页
私有网络
用户指南
网卡
巨型帧与MTU
管理路径MTU发现
管理路径MTU发现
PMTUD(Path Maximum Transmission Unit Discovery)是通过在 IP 包中设置 DF 标志,结合 ICMP 协议反馈的路径 MTU 信息,动态探测源主机至目的主机传输路径中最小 MTU 的技术。
源主机在发送数据包时,设置DF=1。如果路径上有 MTU 更小的设备,该设备会丢弃该包并返回一个 ICMP 错误,源主机记录该MTU值,并调整数据包大小,直到目的主机收到数据包。步骤如下:
- 设置 DF 标志位:源主机在发送数据包时,会在 IP 头部中将 DF (Don't Fragment) 标志位设置为 1,表示不允许网络路径中的设备对该数据包分片。
说明
IPv6 报文头部中没有 DF 标志位,不支持分片。
- 如果路径上所有设备 MTU 都大于或等于数据包尺寸,数据包将顺利到达目的主机。
- 如果某个设备发现数据包尺寸大于自己的 MTU,并且 DF=1,则设备会丢弃这个数据包。
- ICMP 错误信息:该设备丢包后,向源主机发送一个 ICMP错误消息。
- IPv4:向源主机发送 ICMP Type 3, Code 4(Fragmentation Needed and DF set),消息中携带该设备的 MTU 值。
- IPv6:向源主机发送 ICMPv6 Type 2(Packet Too Big),消息中携带该设备的 MTU 值。
- 源主机调整:源主机收到 ICMP 错误信息后,会执行以下操作:
- 从 ICMP 消息中解析出其中包含的 MTU 值。
- 在其路由表或连接缓存中,记录下到该目的地址的MTU。
- 使用这个新的、更小的 MTU 值重新打包并发送之前失败的数据。
- PMTU 非永久有效。Linux 系统路由缓存默认老化时间为 600 秒,老化后需重新探测。链路存在小 MTU 时,建议定时探测或调整老化时间。
- 该过程重复进行,直到找到足够小的 MTU,使数据包无需分片即可到达目的地。
在传输路径上所有设备均开启PMTUD的情况下,源主机向目的主机发送数据包,若途中某个设备(如路由器)的MTU小于数据包,则它会将数据进行分片,并返回一个ICMP消息(其中包含了它的MTU)给源主机,源主机的应用程序可据此进行适配,主动调整数据包大小,避免传输过程中因被分片而影响网络性能。了解更多 请确保传输路径上所有设备均放通PMTUD的ICMP消息,如源/目的主机的安全组、网络ACL、防火墙等。
以CentOS 7.9为例,操作步骤如下:
- sysctl net.ipv4.ip_no_pmtu_disc
- 若返回值为0,则表示PMTUD已开启,若返回值为1,则表示PMTUD已关闭。
- sysctl -w net.ipv4.ip_no_pmtu_disc=0
- sysctl -w net.ipv4.ip_no_pmtu_disc=1
以CentOS 7.9为例,操作步骤如下:
- 执行以下命令,探测源主机到目的主机的最小MTU值。
- ping -c 1 -M do -s [包大小] 目的地址
- -s [包大小] :发送的探测包大小。测试1500字节MTU(1472包大小 + 20字节IP头 + 8字节ICMP头)。
- 示例:ping -c 1 -M do -s 1472 192.168.1.66
- 若成功ping通,则调整探测包大小,若返回ICMP错误信息,则得到PMTU。
最近更新时间:2026.10.12 14:53:24