区域索引与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/