获取IPv6标头的确切大小,包括扩展标头

时间:2013-02-07 22:23:11

标签: networking ipv6 ipv4 istream icmp

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

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

谢谢!

1 个答案:

答案 0 :(得分:12)

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

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