IPv6 标头中带有扩展的 ICMPv6 校验和计算

问题描述 投票:0回答:1

我正在尝试计算 ICMPv6 校验和,但当 IPv6 标头包含扩展名时,我得到错误的校验和。当 IPv6 标头不包含扩展名时,我得到正确的校验和值。

为了计算 ICMPv6 校验和,我首先按以下顺序构造 IPv6 伪标头:

IPv6 源地址、IPv6 目标地址、std::uint32_t 类型的 IPv6 有效负载长度(尽管它存储为 std::uint16_t 类型)、三个零和 IPv6 下一个标头(对于 ICMPv6 协议,我总是将其设置为 0x3a ).

对于 ICMPv6 标头,我按此顺序采用以下内容:类型、代码和有效负载/数据。

为了计算校验和,我将 IPv6 伪标头添加到 ICMPv6 标头中,并计算校验和。当 IPv6 标头不包含扩展时,此实现会生成正确的校验和。但是,当 IPv6 标头包含扩展时,例如 IPv6 扩展的路由标头,它会产生错误的校验和。正如您所知,我在校验和计算中根本没有考虑扩展名。

知道我做错了什么吗?

TIA。

protocols checksum network-traffic icmpv6
1个回答
0
投票

我解决了。

回答我自己。如果 IPv6 标头中存在路由标头扩展,则 IPv6 目标地址将是扩展列表中的最终地址。此外,我们从有效负载长度中减去 IPv6 标头和下一层之间的任何扩展标头的长度。对于 ICMPv6,IPv6 下一个标头始终设置为 0x3a。

© www.soinside.com 2019 - 2024. All rights reserved.