IPv6 链路本地地址格式

Posted

技术标签:

【中文标题】IPv6 链路本地地址格式【英文标题】:IPv6 link-local address format 【发布时间】:2011-08-10 09:43:46 【问题描述】:

我正在从事与网络/压缩相关的项目。其中一台机器是 Windows Vista,它已经配置了 IPv6。

当我尝试ipconfig 时,我看到一个格式如下的地址:fe80::9dc8:72fa:aacd:76e2%10

但是当我尝试使用 ping fe80::9dc8:72fa:aacd:76e2%10 从另一台机器上 ping 这台机器时,我收到以下错误:

Ping request could not find host fe80::9dc8:72fa:e327:76e2%10.Please check the name and try again.

任何想法/cmets 都非常有帮助。

【问题讨论】:

我以前从未在 ipv6 地址中看到过%10 %10 是链接本地地址的一部分。 所以你认为,fe80::9dc8:72fa:aacd:76e2 是真正的 ipv6 地址? %10 是范围 ID。这取决于 发送 机器的链接本地范围。 【参考方案1】:

您无法使用经典 ping 实用程序 ping ipv6 地址,只能使用 ipv4 地址。 linux 有一个名为ping6 的命令行工具来ping ipv6 地址,windows 可能有类似的东西。一项小研究告诉我,Windows 使用ping -6 ping ipv6 地址。

【讨论】:

我尝试 ping -6 fe80:0000:0000:0000:9dc8:72fa:e327:76e2 我得到以下错误 ::: Unable to initialize Windows Sockets interface, error code 10047. @pdk:所以?它起作用了吗?有错误吗?正如我在第一条评论和其他 cmets 中提到的,请尝试不使用 %10。 (不过,我想知道你没有在最后的评论中提到) @knittl:我收到了这个错误(没有 %)。 “无法初始化 Windows Sockets 接口,错误代码 10047。”关于这个错误的任何提示? pdk,我发现了这个article in the mkb——不确定这是否有帮助 这个答案是不正确的,因为 Windows ping 实用程序将在没有 -6 标志的情况下 ping IPv6 地址(如果主机名解析为,则此 强制 使用 IPv6例如 IPv4 和 IPv6 地址),但正确的是有一个单独的用于 Linux 的 ping6 实用程序。【参考方案2】:

地址后面的%10称为scope zone。当您使用link-local IPv6 地址时,需要范围区域,以便系统知道将数据包发送到哪个接口。

在 Windows 上,如果您发出 netsh interface ipv6 show addresses 命令,您将看到分配给系统的地址及其区域 ID。请注意,区域 ID 与接口索引匹配。例如:

Interface 22: VirtualBox Host-Only Network

Addr Type  DAD State   Valid Life Pref. Life Address
---------  ----------- ---------- ---------- ------------------------
Other      Preferred     infinite   infinite fe80::15c3:6bea:aaac:a015%22

此地址的范围为%22,因为它位于索引为22 的接口上。同样,在 Linux 上,您可能会看到一个链接本地地址,例如 fe80::15c3:6bea:aaac:a016%eth0。区域 ID 的格式对于每台运行 IPv6 的机器都是唯一的,这就是为什么如果您尝试从其他系统 ping 可能会有所不同。

例如,如果您有:

System A (Windows): fe80::15c3:6bea:aaac:a015%22
System B (Linux):   fe80::15c3:6bea:aaac:a016%eth0

...如果你想从 Windows 机器 ping Linux 机器,你不能做ping fe80::15c3:6bea:aaac:a016%eth0。但是你可以ping fe80::15c3:6bea:aaac:a016%22。这就是问题。以这种方式链接本地地址可能会很棘手。

尝试指定正确的区域 ID。也就是说,当您执行ping fe80::9dc8:72fa:aacd:76e2%10 时,首先在您正在ping 来自 的机器上执行netsh interface ipv6 show addresses,然后将%10 更改为您想要使用的任何接口的接口索引源系统。

如果您 ping 的机器是 Linux,则必须执行 ping6 -I eth0 fe80::9dc8:72fa:aacd:76e2(假设另一个系统在 eth0),因为 Linux 命令行实用程序不支持% 指定区域的方式(我最后一次检查,无论如何)。

理想情况下,您应该在网络上设置支持 IPv6 的路由器来进行路由器通告,这样您就可以使用stateless address auto-configuration (SLAAC) 并获得global unicast 地址。那么这将不是问题。

【讨论】:

【参考方案3】:

% 后面的数字是接口名称。如果你打开你的网络接口的状态->详细信息,你会看到ipv6链接本地地址,地址末尾有%xx,这是接口的索引,以防你想找到索引对于某些应用程序。系统信息或 ipconfig 可能只会给你不同的索引号,至少在我的 Windows 7 Pro 上是这样,这非常令人困惑。您从操作系统获得的描述也可能是错误的。

【讨论】:

以上是关于IPv6 链路本地地址格式的主要内容,如果未能解决你的问题,请参考以下文章

IPv6当中的本地链路地址和本地站点地址有啥区别?

IPV6 简单总结

IPV6的链路本地地址和站点本地地址的区别

ipv6链路本地地址ping不通

本地链路地址

ipv6本地链路地址后面的百分号%加数字到底是什么意思?