3

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

平台之间的功能似乎有所不同,我很想知道它们之间的关系。例如,Windows 有一个SCOPE_ID 结构(以及一个 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 ,它似乎是 little-endian 顺序......这不可能吧?

4

1 回答 1

1

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

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

Zone是在本地范围内指定一个特定的有效接口。

范围索引与接口索引不同,因此要指定接口,我使用如下结构:

struct interface_req_t {
        uint32_t                                ir_interface;
        uint32_t                                ir_scope_id;
};

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

只有本地范围可以通过它的地址前缀 fe80::/10 来识别。

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

于 2010-07-06T10:14:39.630 回答