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行为是否记录在任何地方?

参考请!

+1

在大多数平台上,'inet_ntop'和'inet_pton'不支持IPv6区域,只能使用'getnameinfo'和'getaddrinfo'。 – 2011-05-05 17:17:32

+0

谢谢,史蒂夫,不知道。我的问题仍然是:如果IPv6地址有区域信息?在RFC4291第2.2章中未提及。地址的文本表示 – Spaceghost 2011-05-05 18:59:11

+0

仅链路本地范围地址,即fe80 ::前缀。 – 2011-05-05 19:57:44

我不确定你的第二个问题,但至于你的第一个问题,是的,通常看到这样写的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位地址上进行最长的前缀匹配,而不是依赖某种元数据。

+0

谢谢,迈克。看起来范围是路由所必需的,但不是地址的一部分,但没有地址,地址不是很有用。 – Spaceghost 2011-05-05 13:40:41

+0

@Spaceghost,确实如此。有一件事也许可以帮助您指出,在您的问题中,您说这是在“自动配置接口后”的输出。这不完全正确。当你谈论IPv6中的“自动配置”地址时,通常意味着一个[通过路由器通告自动配置的全局单播地址](http://tools.ietf.org/html/rfc4862)。规范要求链接本地地址,但并不真正称为“自动配置”。 – mpontillo 2011-05-05 21:52:35