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

IPv6 link-local 和 site-local 地址称为作用域地址。 Windows 套接字 (Winsock) API 支持 sockaddr_in6 结构中的 sin6_scope_id 成员,以用于限定范围的地址。 对于 (fe80::/10 前缀) 的 IPv6 链接本地地址,sockaddr_in6 结构中的sin6_scope_id成员是接口编号。 对于 (fec0::/10 前缀) 的 IPv6 站点本地地址,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 show interface

在具有 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 的链接。

当本地计算机具有多个网络适配器时,会出现不明确性。 例如,上面的 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