0

如果 IPv4 存在问题并且我想从 std::istream 中提取 IP 和 ICMP 标头,首先我得到最初的 20 个字节,然后检查 IPv4 标头中提供的标头长度是否大于 20 个字节,以便提取任何选项。下一个字节是 ICMP 数据包。使用 IPv4 标头中携带的标头长度值,我可以看到 IP 标头的预期大小。

但是如何获得 IPv6 标头的确切大小?IPv6 标头中有一个有效负载值,其中包括标头扩展的大小以及 ICMP 等更高级别的数据。我需要知道 IPv6 标头的大小,包括标头扩展但没有更高级别的数据,以便知道 ICMPv6 标头在 std::istream 中的哪个位置开始。

谢谢!

4

1 回答 1

12

IPv6 标头的大小固定为 40 字节 - 尽管您知道在初始 IPv6 标头之后可能有扩展,它们不是传输层数据报的一部分。要确定 IPv6 标头后面是否有标头扩展,请检查“下一个标头”字段。存储在此字段中的值将告诉您下一个标头是传输级别标头(IE TCP/UDP 标头)、IP 级别标头扩展(IE ICMP)还是介于两者之间的任何标头。此列表列出了下一个标头字段的所有可能值。

一旦确定下一个标头的类型,您就可以相应地处理它 - 所有扩展标头的第一个字节应该是“下一个标头”字段,以便它们可以链接在一起,如果扩展标头是可变长度的第二个字节应该是“hdr ext field”,可用于确定其大小。

于 2013-02-08T00:08:55.397 回答