路径 MTU 发现(Path MTU Discovery,PMTUD)是一个网络机制,用于确定从源设备到目的设备的整个路径上的最小 MTU 值。该机制帮助网络协议调整数据包大小,以避免分片,从而提高网络通信的效率和可靠性。
MTU(Maximum Transmission Unit,最大传输单元)指的是网络设备在一次传输中能处理的最大数据包大小。如果 Linux 设备试图发送大于网关 MTU(即 1500 字节)的数据包,那么网关需要对这些数据包进行分片。分片通常会导致性能下降,并在某些情况下因为分片不当而造成丢包。
路径 MTU 发现是通过以下步骤实现的:
发送初始数据包:起始设备尝试发送较大的数据包,例如沿用本地网络接口的默认 MTU 值。
IP 头部中的 DF 标志:在发送的数据包中设置“不分片”(Don’t Fragment, DF)标志。这个标志告诉中间路由器不能对数据包进行分片,如果数据包太大而无法传输,通过较小 MTU 的链路,只能丢弃。
ICMP 不可达消息:如果数据包无法通过某个网络节点,中间节点会丢弃该数据包并返回一个 ICMP(Internet Control Message Protocol)“需要分片但设置了 DF 标志”的不可达消息,同时告诉源设备此节点的 MTU 限制。
调整发送数据包大小:源设备根据接收到的 ICMP 消息调整数据包大小,使之适应报告的最小 MTU,并重新传输数据。
通过这个动态调整过程,路径 MTU 发现可以确保数据包的传输不需要分片,减少分片对网络性能的负面影响。这种机制在 IPv4 和 IPv6 中被广泛使用。然而,ICMP 消息有时候可能会被防火墙或其他安全设备阻挡,导致 PMTUD 失效。在这种情况下,必须通过其他手段(如手动配置)来管理 MTU。