IPv6链路本地地址格式

时间:2011-04-21 15:13:36

标签: windows networking tcp ipv6 ping

我正在开展与网络/压缩相关的项目。其中一台机器是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.

任何想法/评论都非常有用。

3 个答案:

答案 0 :(得分:25)

地址后的%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地址。那么这不会是一个问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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