在 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_ntopinet_pton 不支持IPv6 区域,您只能使用getnameinfogetaddrinfo 谢谢,史蒂夫,不知道。我的问题仍然存在:IPv6 地址应该有区域信息吗? RFC4291 第 2.2 章中未提及。地址的文本表示 仅链接本地范围地址,即 fe80:: 前缀。 【参考方案1】:

我不确定您的第二个问题,但至于您的第一个问题,是的,通常会看到像这样写的范围很大的 IPv6 地址(例如链接本地地址),但绝对不是跨平台一致。原因是没有它,链接本地地址将是不明确的。

我对@9​​87654321@ 的回答可能会有所帮助。


编辑:我刚刚意识到这个问题的微妙之处。 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 链接本地地址的主要内容,如果未能解决你的问题,请参考以下文章

OSX10.12搭建IPv6本地环境测试APP

Youtube 自动播放无法在具有嵌入式 HTML5 播放器的移动设备上运行

如何测试APP是否兼容IPv6

在 unix (linux/osx) 中创建的符号链接是不是仍然可以在 Windows 中工作?

在启用了IPV6的机器上获取客户端ipv4地址

如何在 osx 上使用 waf 链接 opengl 和 glut?