MTU探测
MTU探测
https://zhuanlan.zhihu.com/p/1939977507236450569
PMTUD 是一种用于确定从源主机到目标主机的整个网络路径上 MTU(Maximum Transmission Unit,最大传输单元)大小的机制。它的主要目的是避免 IP 分片,因为分片会消耗额外的计算资源并可能增加丢包的风险。
核心思想:
PMTUD 利用 ICMP(Internet Control Message Protocol)的“Fragmentation Needed and DF set”(需要分片但 DF 位已设置)消息来工作。源主机发送一个设置了“Don’t Fragment”(DF)标志位的数据包,如果路径上的某个路由器发现这个数据包太大而无法转发,并且 DF 位被设置,它就不能进行分片,而是丢弃该数据包并向源主机发送一个 ICMP 错误消息,告知源主机路径 MTU 的信息。
详细过程:
-
初始化:
- 源主机(Host A)想要向目标主机(Host B)发送一个较大的 IP 数据包。
- Host A 会维护一个“路径 MTU 缓存”,记录它所知道的到不同目标的路径 MTU。如果缓存中没有相关信息,它会使用本地接口的 MTU 作为初始估计值(通常是发送接口的 MTU,例如以太网的 1500 字节)。
- Host A 构造一个 IP 数据包,其大小不超过当前估计的路径 MTU,并且设置 DF(Don’t Fragment)标志位。
-
发送与尝试转发:
- Host A 将这个设置了 DF 位的数据包发送到网络。
- 数据包在网络中经过一个个路由器(Router 1, Router 2, …)。
-
遇到 MTU 限制:
- 假设在路径上有一个路由器(例如 Router X),它的出站接口的 MTU 小于 Host A 发送的数据包大小。
- Router X 收到这个数据包后,发现它需要转发,但是数据包的大小超过了它出站接口的 MTU。
- 由于数据包的 DF 位被设置,Router X 不允许 对这个数据包进行分片。
-
ICMP 错误消息生成与发送:
- Router X 丢弃 这个过大的数据包。
- Router X 生成一个 ICMP Type 3 (Destination Unreachable) Code 4 (Fragmentation Needed and DF set) 的错误消息。
- 这个 ICMP 消息中通常会包含:
- Next-Hop MTU 字段(RFC 1191 推荐):指示 Router X 出站接口的 MTU 值。这是最直接的信息。
- 原始 IP 头部 和 原始数据包的前 8 字节:用于帮助源主机识别是哪个连接的数据包被丢弃了。
- Router X 将这个 ICMP 错误消息发送回 源主机 Host A。
-
源主机接收与处理 ICMP 消息:
- Host A 收到这个 ICMP “Fragmentation Needed and DF set” 消息。
- Host A 检查消息中的信息,确认它对应于之前发送的哪个数据包(通过 IP 头和前 8 字节数据)。
- Host A 从 ICMP 消息中获取 Next-Hop MTU 值(如果可用),或者根据 ICMP 消息本身的大小推断出一个合适的、较小的 MTU 值。
- Host A 更新其路径 MTU 缓存,将到目标 Host B 的路径 MTU 设置为这个新发现的、更小的值。
-
调整与重传:
- Host A 上的上层协议(如 TCP)或应用程序会注意到原始数据包未能送达(例如,TCP 会因为超时或缺少 ACK 而重传)。
- 当 Host A 再次尝试发送数据到 Host B 时,它会查询更新后的路径 MTU 缓存。
- Host A 现在构造的数据包大小将不超过新发现的、较小的路径 MTU,并且通常仍然会设置 DF 位。
- 这个较小的数据包可以成功通过 Router X,继续向 Host B 传输。
-
重复过程(如有必要):
- 如果路径上还有其他 MTU 更小的链路,上述过程(丢包 -> ICMP -> 调整 MTU -> 重传)可能会重复发生,直到找到整条路径上的最小 MTU,或者数据包小到可以无阻碍地通过所有链路。
关键点总结:
- DF 位是关键: 只有当数据包设置了 DF 位时,PMTUD 机制才能被触发。
- ICMP 是核心: ICMP “Fragmentation Needed and DF set” 消息是 PMTUD 的反馈机制。
- 源端调整: 是源主机负责根据收到的 ICMP 消息调整其发送的包大小。
- 缓存机制: 操作系统通常会缓存发现的路径 MTU 信息,以提高效率,避免对每个连接都重复进行发现过程。
- 潜在问题:
- ICMP 被过滤: 如果路径上的防火墙或安全策略阻止了 ICMP Type 3 Code 4 消息,源主机将无法收到反馈,可能导致数据包持续发送失败或被迫使用非常小的默认 MTU,影响性能。
- 黑洞路由: 如果数据包因过大被丢弃,但 ICMP 消息也被阻止,就会形成“黑洞”,数据包无声无息地消失。
应用场景:
- TCP: 大多数现代 TCP 实现都集成了 PMTUD,自动调整其最大报文段大小 (MSS)。
- UDP/应用层: 应用程序或使用 UDP 的协议可能需要自己处理 PMTUD 或处理因 MTU 问题导致的丢包。
PMTUD 是一个自动化的、高效的机制,用于优化网络传输,但它依赖于网络中 ICMP 消息的正常传递。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Roger-Lv's space!
评论