c++ - IPv6 区域索引和 scope_id

标签 c++ ipv6 scope-id

区域索引与sockaddr_in6结构中的scope_id有什么关系?

功能似乎因平台而异,我很想知道它们之间的关系。例如 Windows 有一个 SCOPE_ID structure (以及一个 32 位值)。 Mac OSX 只有 32 位值。显然 32 位值是可行的方法,但它究竟是如何布局的呢?它的前4位仍然是“级别”吗?网络字节顺序对此有何影响?

我还假设,在 Windows 下,IP 地址中给出的区域索引(例如 FF80::1%1)直接转换为上述结构的低 28 位。它在使用名称而不是数字的 Mac OSX 下如何工作(例如 FF80::1%en0)。我是否将其编码为四个 CC?同样,我似乎记得 linux 使用 4 个字符,这不可能适合 28 位。

有人可以向我解释一下这个烂摊子吗?当我完成时,我真的需要写一个关于所有这些的教程,因为网络上关于 ipv6 的信息很少。

编辑:scope_id 是网络字节顺序吗?我只是在查看从 recvfrom 返回的 scope_id,它似乎是小端顺序……这不可能是对的吧?

最佳答案

区域和范围的索引相同且经常互换,但术语本身不同。

范围用于“全局范围”、“本地范围”、“通用范围”,指的是特定 IPv6 地址的唯一性。每个接口(interface)都有一个本地范围,它对于直接的 LAN 网段是唯一的,这对于自动配置和发现本地设备很有用,比如您刚刚插入网络的打印机。全局范围的 IPv6 地址可以由 DHCP 服务器提供。

Zone是在局部范围内指定一个特定的有效接口(interface)。

范围索引不同于接口(interface)索引,因此我使用如下结构指定接口(interface):

struct interface_req_t {
        uint32_t                                ir_interface;
        uint32_t                                ir_scope_id;
};

每个平台在解释值的方式上都是独一无二的,Windows 根据域对接口(interface)枚举进行了多次重新解释。 Windows 实现的缺点是当您热插拔适配器时索引可能会改变。在 Unix 上,您往往会看到接口(interface)名称 %qe0%eth0 等,它们在需要时可以解析为数字形式,例如if_nametoindex()。 Windows Vista 添加了兼容的 API。

只能通过其地址前缀 fe80::/10 识别本地范围。

Windows SCOPE_ID 显示了 IPv4 多播中也存在的过度设计,即拆分地址的管理域。这完全是可选的,而且经常被忽略。

关于c++ - IPv6 区域索引和 scope_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3131532/

相关文章:

c - 使用 getaddrinfo 将 IPv4 地址转换为 IPv6 地址时丢失服务端口

c++ - ICMPv6 - 无法读取任何路由器通告消息

ios - IPV6 连接到 IPV4 TOS 选项

python - python ipaddress.IPv6Address 实例中的范围 ID

c++ - 使用用户输入打开 C++ .txt 文件

c++ - 将数组转换为编码字符串

c++ - stoi 函数给出错误:内存位置 0x0035E8D8 处的 std::invalid_argument。 C++

c++ - OpenCV 将子矩阵复制到图像的另一个 ROI 中