gpt4 book ai didi

c - 如何区分扩展头和上层头

转载 作者:行者123 更新时间:2023-12-02 09:21:29 25 4
gpt4 key购买 nike

我正在尝试解析通过原始套接字接收到的 IPv6 数据包并确定它是否是ICMPv6。我可以处理以太网IPv6 header ,但还有可选的扩展 header 。如果 IPv6 header 的 Next Header 字段不是 ICMPv6,我必须迭代可能位于前面的任何扩展。

迭代本身不是问题,因为每个扩展 header 都带有其长度。但是,我找不到区分可能遵循的扩展 header 和其他上层协议(protocol)(例如 TCPUDP)的好方法。我可以检查 Next Header 是否是已知的扩展 header 之一(在这种情况下我可以迭代),或者 Next Header 是否是上层协议(protocol)(在这种情况下)我必须停下来,不会有任何ICMP..)。

在这两种方法中,我都依赖于一些自建的常量列表,我正在检查Next Header,并且该列表将来可能会发生变化。难道没有更好的方法来判断我何时位于扩展 header 的末尾并且后面没有上层 header (或什么也没有)吗?

最佳答案

每个扩展 header 都有自己的 Next Header 字段作为其第一个八位字节,其含义与固定 IPv6 header 的相应字段相同(但相对位置不同)。您可以将它们与扩展 header 的长度字段一起使用来逐步浏览扩展 header ,直到找到传输层 header 。维基百科covers this一些细节。


更新:

关于您修改后的问题,不,没有标准函数或算法来区分指定扩展 header 和指定协议(protocol) header 的 header 代码,除了简单地知道哪个是哪个。它们是从相同的代码空间分配的,没有特殊的内部结构。

然而,只有 256 个可能的值,因此知道哪些是哪些是可行的。但请注意:近一半的可用代码当前尚未分配,但将来可能会分配给扩展 header 类型或协议(protocol)类型。除非代码用尽,否则您的软件将需要识别三个类别:

  • 扩展 header ,
  • 协议(protocol) header ,以及
  • 未知

此外,对于实现这样的测试,我建议创建和使用查找表,而不是构建复杂的条件表达式。大致如下:

enum header_type { HDR_PROTOCOL, HDR_EXTENSION, HDR_UNKNOWN };

const enum header_type header_types[256] = {
[0x00] = HDR_EXTENSION, // IPv6 hop-by-hop option
[0x01] = HDR_PROTOCOL, // ICMP
// ... both extension and protocol headers in this range ...
[0x8e] = HDR_PROTOCOL, // robust header compression
[0x8f] = HDR_UNKNOWN, // unassigned
// ... more unassigned ...
[0xfd] = HDR_UNKNOWN, // for experimentation
[0xfe] = HDR_UNKNOWN, // for experimentation
[0xff] = HDR_UNKNOWN, // reserved
};

您可以用它来回答多种问题,而且效率很高。初始化程序中的显式指示符并不是严格必要的,但我认为它们是一个好主意:它们将帮助您验证和维护表。

关于c - 如何区分扩展头和上层头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com