OSX上具有'嵌入'范围的IPv6链接本地地址
我已经编写了一些简单的代码,它使用ioctl SIOCGIFCONF查询系统上的所有网络接口,并使用inet_ntop返回找到的地址的文本表示。奇怪的是,当发现链接本地IPv6地址时,代码的OSX版本似乎将范围嵌入到地址中。OSX上具有'嵌入'范围的IPv6链接本地地址
这里是从线/ sbin目录/使用ifconfig在OSX自动配置接口(后:
的IPv6地址:FE80:5 :: 217
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 00:17:f2:0b:52:73
inet6 fe80::217:f2ff:fe0b:5273%en1 prefixlen 64 scopeid 0x5
和IP地址的IOCTL SIOCGIFCONF返回的:f2ff:fe0b:5273
它看起来像(5)的FE80后立即插入范围的值
Linux上的相同的代码返回的IPv6地址没有任何额外的数据。
发生了两个问题: 1)写这样的ipv6地址是否合法? 2)OSX行为是否记录在任何地方?
参考请!
我不确定你的第二个问题,但至于你的第一个问题,是的,通常看到这样写的IPv6地址范围很大(如本地链接地址),但它是绝对的跨平台不一致。原因是因为链接本地地址没有它就会变得模糊不清。
我对this other question的回答可能会有所帮助。
编辑:我刚刚意识到这个问题的微妙之处。 BSD IPv6堆栈在内部将接口索引存储在链路本地IPv6地址的第二个16位字中。这应该从来没有走出去的电线。这实际上是RFC违规,。 (顺便说一句,为什么他们可以在这里存储额外的信息)我相信这是一个错误,范围应该以其他方式传达给系统的其他部分。所以你应该检查一下并用手去除它。
编辑2:我去挖出place in the kernel source where they set this value:
466 static int
467 in6_ifattach_linklocal(
468 struct ifnet *ifp,
469 struct ifnet *altifp, /* secondary EUI64 source */
470 struct in6_aliasreq *ifra_passed)
471 {
...
494 ifra.ifra_addr.sin6_family = AF_INET6;
495 ifra.ifra_addr.sin6_len = sizeof(struct sockaddr_in6);
496 ifra.ifra_addr.sin6_addr.s6_addr16[0] = htons(0xfe80);
497 #if SCOPEDROUTING
498 ifra.ifra_addr.sin6_addr.s6_addr16[1] = 0
499 #else
500 ifra.ifra_addr.sin6_addr.s6_addr16[1] = htons(ifp->if_index); /* XXX */
501 #endif
注意/* XXX */
上线500 ;-)我的猜测是,这是某种暂时的解决办法的/黑客使路由正确工作而不重写部分路由代码。对于链路本地地址,您需要根据源和目标接口进行路由决策。通过将if_index
放在地址中的那个位置,他们可能仅仅在128位地址上进行最长的前缀匹配,而不是依赖某种元数据。
谢谢,迈克。看起来范围是路由所必需的,但不是地址的一部分,但没有地址,地址不是很有用。 – Spaceghost 2011-05-05 13:40:41
@Spaceghost,确实如此。有一件事也许可以帮助您指出,在您的问题中,您说这是在“自动配置接口后”的输出。这不完全正确。当你谈论IPv6中的“自动配置”地址时,通常意味着一个[通过路由器通告自动配置的全局单播地址](http://tools.ietf.org/html/rfc4862)。规范要求链接本地地址,但并不真正称为“自动配置”。 – mpontillo 2011-05-05 21:52:35
在大多数平台上,'inet_ntop'和'inet_pton'不支持IPv6区域,只能使用'getnameinfo'和'getaddrinfo'。 – 2011-05-05 17:17:32
谢谢,史蒂夫,不知道。我的问题仍然是:如果IPv6地址有区域信息?在RFC4291第2.2章中未提及。地址的文本表示 – Spaceghost 2011-05-05 18:59:11
仅链路本地范围地址,即fe80 ::前缀。 – 2011-05-05 19:57:44