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 的信息。

详细过程:

  1. 初始化:

    • 源主机(Host A)想要向目标主机(Host B)发送一个较大的 IP 数据包。
    • Host A 会维护一个“路径 MTU 缓存”,记录它所知道的到不同目标的路径 MTU。如果缓存中没有相关信息,它会使用本地接口的 MTU 作为初始估计值(通常是发送接口的 MTU,例如以太网的 1500 字节)。
    • Host A 构造一个 IP 数据包,其大小不超过当前估计的路径 MTU,并且设置 DF(Don’t Fragment)标志位
  2. 发送与尝试转发:

    • Host A 将这个设置了 DF 位的数据包发送到网络。
    • 数据包在网络中经过一个个路由器(Router 1, Router 2, …)。
  3. 遇到 MTU 限制:

    • 假设在路径上有一个路由器(例如 Router X),它的出站接口的 MTU 小于 Host A 发送的数据包大小。
    • Router X 收到这个数据包后,发现它需要转发,但是数据包的大小超过了它出站接口的 MTU。
    • 由于数据包的 DF 位被设置,Router X 不允许 对这个数据包进行分片。
  4. 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
  5. 源主机接收与处理 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 设置为这个新发现的、更小的值。
  6. 调整与重传:

    • Host A 上的上层协议(如 TCP)或应用程序会注意到原始数据包未能送达(例如,TCP 会因为超时或缺少 ACK 而重传)。
    • 当 Host A 再次尝试发送数据到 Host B 时,它会查询更新后的路径 MTU 缓存。
    • Host A 现在构造的数据包大小将不超过新发现的、较小的路径 MTU,并且通常仍然会设置 DF 位。
    • 这个较小的数据包可以成功通过 Router X,继续向 Host B 传输。
  7. 重复过程(如有必要):

    • 如果路径上还有其他 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 消息的正常传递。