【发布时间】:2017-07-06 07:08:10
【问题描述】:
我正在尝试解析通过原始套接字接收的 IPv6 数据包并确定它是否是 ICMPv6。我可以处理 Ethernet 和 IPv6 标头,但是还有可选的扩展标头。如果 IPv6 标头的 Next Header 字段不是 ICMPv6,我必须遍历可能之前的任何扩展。
迭代本身不是问题,因为每个扩展头都有自己的长度。但是,我找不到一个很好的方法来区分可能遵循的扩展标头和其他上层协议,例如 TCP 和 UDP。我可以检查Next Header 是否是已知的扩展标头之一(在这种情况下我可以迭代)或者Next Header 是否是上层协议(在这种情况下我必须停止,不会有任何 ICMP..)。
在这两种方法中,我都依赖于一些我正在检查Next Header 的自建常量列表,并且该列表将来可能会改变。难道没有更好的方法来判断我何时处于扩展标头的末尾并且上层标头(或什么都没有)跟随?
【问题讨论】:
-
不幸的是,无法确定未知的下一个标头值的含义。您必须依赖代码中的表。
标签: c sockets filter ipv6 icmp