IPv6 扩展标头和 UDP/TCP/ICMPv6 校验和

网络工程 IPv6 校验和
2022-03-05 01:45:48

如果存在扩展标头,IPv6 数据包(UDP、TCP、ICMPv6 等)的校验和是否应该更改?例如,没有 Hop-By-Hop 扩展标头的 UDP 数据包与添加了 Hop-By-Hop 扩展标头的相同 UDP 数据包的校验和是否不同?

这是我的问题:

+---+       +---+       +---+
| A | ----> | B | ----> | C |
+---+       +---+       +---+

我有 3 台设备:

  • A 正在向 C 发送 UDP 数据包。UDP 数据包不包含 Hop-By-Hop 扩展头。
  • B 收到 A 的 UDP 数据包,添加一个 Hop-By-Hop 扩展头,并将修改后的数据包转发给 C。
  • 由于校验和无效,C 拒绝该数据包。

我困惑的根源来自 UDP、TCP 和 ICMPv6 的 Wikipedia 页面,其中指出校验和是使用伪标头计算的,其中下一个标头字段设置为协议:UDP 为 17,TCP 为 6,TCP 为 58 ICMPv6。

我对上面的解释是,伪报头不依赖于数据包的下一个报头字段。因此,设备 C 不正确地计算校验和。

2个回答

如果我正确理解您的问题,您想问以下问题:

用于 TCP 校验和计算的“伪标头”中的“下一个标头”字段是否与 IPv6 标头中的“下一个标头”字段相同?

这意味着 TCP 校验和取决于扩展标头,因为如果没有扩展标头,用于 TCP 的校验和计算的值将是 6,如果有分片标头,则为 44...

还是它与描述第 4 层协议的“下一个标头”值相同(例如 TCP 为 6)?

这意味着 TCP 校验和不依赖于扩展头。

RFC 8200(参见 Ron Maupin 的回答)指出:

伪报头中的 Next Header 值标识上层协议(例如,TCP 为 6,UDP 为 17)。如果有扩展标头,它将与 IPv6 标头中的 Next Header 值不同...

这意味着用于 TCP 校验和计算的“伪标头”的内容不依赖于扩展标头。因此,TCP 校验和本身也不依赖于扩展头。

如果存在扩展标头,IPv6 数据包(UDP、TCP、ICMPv6 等)的校验和是否应该更改?

IPv6 数据包没有校验和。这是对 IPv6 所做的改进之一,因此源和目标之间的路由器不需要计算校验和来查看数据包头是否损坏,也不需要在减少跳数字段时重新计算校验和。

如果您指的是传输协议数据报,那只是 IPv6 数据包的有效负载,而 IPv6 真的不知道其有效负载中的内容。传输协议将构建校验和,它基于包含 IPv6 源地址和目标地址的伪标头。这与扩展标头无关。

B 收到 A 的 UDP 数据包,添加一个 Hop-By-Hop 扩展头,并将修改后的数据包转发给 C。

中间路由器不添加扩展头,事实上,必须忽略扩展头,除了逐跳扩展头。所有其他扩展标头都用于目标主机。不允许中间节点 (B) 插入扩展标头。请参阅RFC 8200,互联网协议,版本 6 (IPv6) 规范

扩展报头(Hop-by-Hop Options 报头除外)不会被数据包传递路径上的任何节点处理、插入或删除,直到数据包到达该节点(或每个节点集,在多播)在 IPv6 报头的目标地址字段中标识。

Hop-by-Hop Options 标头不会被插入或删除,但可以由数据包传递路径上的任何节点检查或处理,直到数据包到达节点(或每个节点集,在多播的情况下)在 IPv6 标头的目标地址字段中标识。

您的主机 B 似乎插入了扩展标头(违反了 IPv6 标准),并未更新 IPv6 标头中的有效负载长度。有效载荷长度字段是数据包有效载荷的大小,包括扩展头。这真的会弄乱 TCP 伪标头长度字段,这可能是校验和错误的根源:

其他协议(例如 TCP)不携带自己的长度信息,在这种情况下,伪标头中使用的 长度是 IPv6 标头中的有效负载长度减去 IPv6 标头和上层之间存在的任何扩展标头的长度层头。

在任何情况下,主机 B 都不应修改 IPv6 数据包中的任何内容,除了减少 IPv6 数据包头中的跳数限制字段。你所说的它正在做的事情违反了 IPv6 标准,你不应该期望它能够正常工作。