在 OSX 上具有“嵌入式”范围的 IPv6 链接本地地址
Posted
技术标签:
【中文标题】在 OSX 上具有“嵌入式”范围的 IPv6 链接本地地址【英文标题】:IPv6 link-local address with 'embedded' scope on OSX 【发布时间】:2011-08-18 19:17:19 【问题描述】:我编写了一些简单的代码,使用 ioctl SIOCGIFCONF 来查询系统上的所有网络接口,并使用 inet_ntop 返回找到的地址的文本表示。奇怪的是,当发现链接本地 IPv6 地址时,OSX 版本的代码似乎将范围嵌入到地址中。
在自动配置接口后,这是来自 OSX 上 /sbin/ifconfig 的一行(:
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
和 ioctl SIOCGIFCONF 返回的 IP 地址:
IPv6 地址:fe80:5::217:f2ff:fe0b:5273
看起来作用域 (5) 的值是在 fe80 之后立即插入的。
Linux 上的相同代码返回 ipv6 地址,没有任何额外数据。
我想到了两个问题: 1)这样写一个ipv6地址合法吗? 2) OSX 行为是否记录在任何地方?
请参考!
【问题讨论】:
在大多数平台上inet_ntop
和inet_pton
不支持IPv6 区域,您只能使用getnameinfo
和getaddrinfo
。
谢谢,史蒂夫,不知道。我的问题仍然存在:IPv6 地址应该有区域信息吗? RFC4291 第 2.2 章中未提及。地址的文本表示
仅链接本地范围地址,即 fe80:: 前缀。
【参考方案1】:
我不确定您的第二个问题,但至于您的第一个问题,是的,通常会看到像这样写的范围很大的 IPv6 地址(例如链接本地地址),但绝对不是跨平台一致。原因是没有它,链接本地地址将是不明确的。
我对@987654321@ 的回答可能会有所帮助。
编辑:我刚刚意识到这个问题的微妙之处。 BSD IPv6 堆栈在内部将接口索引存储在链路本地 IPv6 地址的第 2 个 16 位字中。这应该永远在电线上消失。这实际上违反了 RFC,because link-local addresses are defined to have 0
bits in this area。 (顺便说一下,为什么他们可以在这里存储额外的信息)我相信这是一个错误,范围应该以其他方式真正传达给系统的其余部分。因此,您可能应该检查一下并手动将其剥离。
编辑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
请注意第 500 行上的 /* XXX */
。;-) 我的猜测是,这是一种临时解决方法/hack,可以在不重写部分路由代码的情况下让路由正常工作。使用链路本地地址,您需要根据源接口和目标接口做出路由决策。通过将if_index
放在地址中的那个位置,他们可能只对 128 位地址进行最长前缀匹配,而不是依赖某种元数据。
【讨论】:
谢谢,迈克。范围似乎是路由所必需的,但实际上并不是地址的一部分,但没有它,地址就不是很有用。 @Spaceghost,是的,完全正确。向您指出的一件事也可能对您有所帮助,在您的问题中,您说这是“在自动配置接口之后”的输出。这并不完全正确。当您谈论 IPv6 中的“自动配置”地址时,您通常指的是global unicast address automatically configured by means of a router advertisement。规范要求链接本地地址,但并不真正符合“自动配置”的条件。以上是关于在 OSX 上具有“嵌入式”范围的 IPv6 链接本地地址的主要内容,如果未能解决你的问题,请参考以下文章
Youtube 自动播放无法在具有嵌入式 HTML5 播放器的移动设备上运行