IPv6 链接本地地址和站点本地地址

IPv6 链接本地地址和站点本地地址称为作用域地址。 Windows 套接字 (Winsock) API 支持 sockaddr_in6 结构中的 sin6_scope_id 成员,以便与作用域地址一起使用。 对于 IPv6 链接本地地址(fe80::/10 前缀),sockaddr_in6 结构中的 sin6_scope_id 成员是接口号。 对于 IPv6 站点本地地址(fec0::/10 前缀),sockaddr_in6 结构中的 sin6_scope_id 成员是站点标识符。

接口 #5 上链接本地 IPv6 地址的示例如下:

fe80::208:74ff:feda:625c%5

以下命令在 Windows XP 上提供 Service Pack 1(SP1)及更高版本,可在本地计算机上查询和配置 IPv6:

使用 Netsh.exe 命令所做的配置更改是永久性的,在重启计算机或 IPv6 协议时不会丢失。

在具有 Service Pack 1(SP1)的 Windows XP 之前,IPv6 配置和管理使用了多个较旧的命令行工具(Net.exe、Ipv6.exe和 Ipsec6.exe)来配置和管理 IPv6。 使用这些旧工具,IPv6 更改不是永久性的,在重启计算机或 IPv6 协议时丢失。 这些较旧的命令行工具仅在 Windows XP 上受支持。

在具有 SP1 的 Windows XP 上,以下命令将在本地计算机上显示 IPv6 接口的列表,包括接口索引、接口名称和各种其他接口属性。

netsh 接口 ipv6 显示接口

在具有 SP1 的 Windows XP 上,以下命令将更改与接口索引关联的站点标识符。

netsh 接口 ipv6 设置接口 <InterfaceIndex 或 Name> siteid=value

在 Windows XP 上,以下旧命令还将与站点本地地址关联的站点标识符更改为 3。

ipv6 rtu fec0::/10 3

如果要发送或连接到作用域地址,则可以将 sockaddr_in6 结构中的 sin6_scope_id 成员保留为未指定(零),表示不明确的作用域地址。 例如,以下链接本地地址不明确:

fe80::10

如果要绑定到作用域地址,则 sockaddr_in6 结构中的 sin6_scope_id 成员必须包含一个非零值,该值指定链接本地地址的有效接口号或站点本地地址的网站标识符。

不明确的作用域地址

如果要发送或连接到作用域地址,并且未在 sockaddr_in6 结构中指定 sin6_scope_id 成员,则作用域地址不明确。 若要解决此问题,IPv6 协议首先确定是否已将套接字绑定到源地址。 如果是这样,绑定源地址通过提供接口号或站点标识符来解析歧义。

如果要发送或连接到作用域地址,并且既未指定 sin6_scope_id 成员,也没有绑定源地址,则 IPv6 协议会检查路由表。 例如,以下命令将在本地计算机上显示 IPv6 路由表:

netsh 接口 ipv6 显示路由

No   Manual   256  fe80::/64      13  Local Area Connection
No   Manual   256  fe80::/64      14  Wireless Network Connection

这表示默认情况下,链接本地地址被视为接口 #13 和 #14 的 on-link。

当本地计算机有多个网络适配器时,会出现歧义。 例如,上述 netsh 命令指示有两个网络接口(局域网连接和无线网络连接)。 当应用程序指定目标链接本地地址(例如 fe80::10)而不指定范围 ID 时,不清楚用于发送数据包的适配器。 发送数据包时,只有链接本地单播(fe80::/64)或链接范围多播(ff00::/8)IPv6 目标地址不会有范围 ID。

邻居发现

如果尚未在 sockaddr_in6 结构中指定 sin6_scope_id 成员,未绑定源地址,并且未指定链接本地地址的路由,则 IPv6 协议将尝试邻居发现来解析目标链接本地地址。 对于要发送的给定数据包,会尝试一个接口。 尝试的第一个接口被视为首选接口。 如果邻居发现无法解析接口上的链接本地地址,则会丢弃要发送的数据包,并且系统记得目标链接本地地址无法通过该接口访问。 在下一个要在同一条件下发送的数据包上,会针对邻居发现尝试不同的接口。 此过程会持续处理每个新数据包的本地计算机上的每个接口,直到邻居发现响应目标链接本地地址或所有可能的接口都已尝试并失败。 每次尝试解决邻居失败时,都会消除该邻居的一个接口。

如果目标链接本地地址解析,则使用该接口发送当前数据包。 此接口还用于发送到同一链接本地目标地址的任何后续不明确范围的数据包。

如果邻居发现无法解析所有接口上的目标链接本地地址,则系统会尝试将数据包发送到首选接口(尝试的第一个接口)。 网络堆栈不断尝试解析首选接口上的目标链接本地地址。 在邻居发现在所有接口上失败一段时间后,网络堆栈将再次重启进程,并尝试在所有接口上解析目标链接本地地址。 目前,在所有接口上再次尝试邻居发现时,此时间间隔为 60 秒。 但是,此时间间隔可能会在 Windows 版本上更改,应用程序不应假定此时间间隔。

注意

如果应用程序在邻居发现解析链接本地地址后将相同的链接本地地址绑定到其他接口,则不会使用邻居发现返回的链接本地目标地址替代接口。

 

有关 IP 版本 6 的邻居发现的详细信息,请参阅 IETF 发布的 RFC4861

IPv6 站点前缀

Ipv6.exe

Netsh.exe

使用 IPv6