2010-06-28 312 views
2

区域索引如何与sockaddr_in6结构中的scope_id相关联?IPv6区域索引和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,它似乎是小端顺序......这不可能是正确的吗?

回答

1

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

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

区域在本地范围内指定特定的有效接口。

范围指数是从接口索引不同,使得以指定我使用一个结构如下的接口:

struct interface_req_t { 
     uint32_t        ir_interface; 
     uint32_t        ir_scope_id; 
}; 

每个平台是独特到它如何解释的值,与具有几重解释视窗接口枚举取决于域。 Windows实施的不利之处在于,当您热交换适配器时,索引可能会更改。在Unix上,您可能会看到接口名称%qe0,%eth0等,可以在需要时将其解析为数字形式,例如。 if_nametoindex()。 Windows Vista添加了一个兼容的API。

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

Windows SCOPE_ID显示了也包含在IPv4多播中的设计,即分割地址的管理域。这些都是纯粹的可选项,并且经常被忽略。

+0

干杯......很好的答案,但我失去了一件事。您的interface_req_t太大,无法放入scope_id字段中... – Goz 2010-07-06 11:38:03

+0

我使用该结构来指定API的接口,在调用中,我可以使用getifaddrs()/ GetAdapterAddresses()来查找匹配的接口#/ scope# 。 – 2010-07-07 02:57:39