IPv6链接本地地址格式

我正在研究一个与networking/压缩相关的项目。 其中一台机器是Windows Vista,已经configuration了IPv6。

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

但是,当我尝试从ping fe80::9dc8:72fa:aacd:76e2%10另一台机器时,出现以下错误:

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

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

地址之后的%10称为作用域 。 当您使用链路本地 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 ,首先要执行netsh interface ipv6 show addresses正在ping的机器上的netsh interface ipv6 show addresses ,然后将%10更改为所需接口的接口索引在源系统上使用。

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

理想情况下,您应该在您的网络上设置支持IPv6的路由器来执行路由器通告,以便您可以使用无状态地址自动配置(SLAAC)并获取全球单播地址。 那么这不会是一个问题。

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