ICMP Packet Too Big 在 IPv6 中如何处理?

网络工程 IPv6 碎片化 icmpv6
2022-02-20 11:01:04

我试图理解数据包分段在 IPv6 中的工作方式。

据我了解,IPv6 路由器从不对数据包进行分段:在收到大小大于下一个网络的 MTU 的数据包时,IPv6 路由器将丢弃它,将 ICMPv6 Packet Too Big 消息发送回源主机。

考虑到这一点,我想了解以下内容:

  1. ICMP 消息由源主机上的 IP 协议实现处理是否正确?
  2. Packet Too Big 消息具体是如何处理的?
  3. 协议规范中定义了对 PTB 消息做出反应的正确方法还是由实现来决定?
  4. 处理是否会因负载是 TCP 还是 UDP 而有所不同?
  5. 分段/PTB/Path MTU Discovery 是完全在 IP 层处理,还是需要上层协议参与?
  6. 如果 ICMP 流量在路由器和源之间的某处被过滤,而 PTB 从未被接收到怎么办?

最后我想知道的是,作为应用程序开发人员并使用 TCP/UDP 工作,IP 分片是否是我需要关心的事情。

1个回答

使用 IPv6,路由器不会对数据包进行分段。端节点可能。

路径 MTU 发现 (PMTUD) 对于 IPv6 是强制性的,因此所有路径节点和端节点在实际数据开始流动之前就路径 MTU 达成一致。仅当要传输超过路径 MTU 的数据报时才需要分段 - 这完全取决于源节点。

ICMP 用于发现路径 MTU。首先,源节点假定路径 MTU 等于其在出口接口上的本地 MTU。如果这超过了一个跃点的 MTU,则该跃点会返回一个太大的 ICMPv6 数据包以及它自己的 MTU。ICMP 消息包含来自原始数据包的足够详细信息,以供源节点匹配连接。然后源节点再次尝试使用那个较低的 MTU(可能会发现一个更晚的,甚至更小的 MTU 跃点)。

一些传输层协议主动使用 PMTUD 来调整其消息的大小。例如 TCP 使用它来发现它的最大段大小 MSS。有些没有,所以应用程序(层)需要小心。

如果中间节点丢弃所有 ICMP 消息,它们会破坏 PMTUD。一些堆栈试图解决这个问题,但大多数都没有,导致已建立的套接字挂起。

作为开发人员,您应该了解RFC 4821