如果IPv4有问题并且我想从std :: istream中提取IP和ICMP头,首先我得到最初的20个字节,然后检查IPv4头中提供的头长度是否大于20个字节以便提取任何选项 . 下一个字节是ICMP数据包 . 使用IPv4标头内携带的标头长度值,我可以看到IP标头的预期大小 .
但是如何获得IPv6标头的确切大小? IPv6标头内部有一个有效负载值,包括标头扩展的大小以及更高级别的数据,如ICMP . 我需要知道IPv6头的大小,包括头扩展但没有更高级别的数据,以便知道ICMPv6头在std :: istream中的起始位置 .
谢谢!
1 回答
IPv6标头的大小固定为40个字节 - 尽管如您所知,可能存在遵循初始IPv6标头的扩展,这些扩展不是't part of the transport layer datagram. To determine whether the IPv6 header is followed by header extensions, check the ' next header'字段 . 存储在此字段中的值将告诉您下一个标头是传输级别标头(IE TCP / UDP标头),IP级别标头扩展(IE ICMP)还是介于两者之间的任何内容 . This list给出下一个 Headers 字段的所有可能值的列表 .
一旦确定了下一个头的类型,就可以相应地处理它 - 所有扩展头的第一个字节应该是“下一个头”字段,这样它们就可以链接在一起,如果扩展头是可变长度的,第二个字节应该是'hdr ext field',它可以用来确定它的大小 .