IPv6 链接-本地地址和站点本地地址
05/31/2018
本文内容
IPv6 链接-本地地址和站点本地地址称为作用域地址。 Windows Socket (Winsock) API 支持 sockaddr _ in6结构中的 sin6 _ 范围 _ id 成员,以便与范围内的地址一起使用。 对于 IPv6 链接本地地址 (fe80::/10 前缀) , sockaddr _ in6 结构中的 sin6 _ 作用域 _ id 成员是接口号。 对于 IPv6 站点本地地址 (fec0::/10 前缀) , sockaddr _ in6 结构中的 sin6 _ 作用域 _ id 成员是一个站点标识符。
接口5上的链路本地 IPv6 地址的示例 # 如下:
fe80::208:74ff:feda:625c%5
以下命令在 Windows XP Service Pack 1 (SP1) 和更高版本上提供,以便在本地计算机上查询和配置 IPv6:
使用 Netsh.exe 命令进行的配置更改是永久性的,并且在计算机或 IPv6 协议重新启动时不会丢失。
在 Windows XP Service Pack 1 (SP1) 之前,IPv6 配置和管理使用了几个旧的命令行工具 (Net.exe、Ipv6.exe 和 Ipsec6.exe) 来配置和管理 IPv6。 使用这些较旧的工具时,IPv6 更改不是永久性的,并且会在计算机或 IPv6 协议重新启动时丢失。 这些较旧的命令行工具仅在 Windows XP 上受支持。
在带有 SP1 的 Windows XP 上,以下命令将显示本地计算机上的 IPv6 接口列表,包括接口索引、接口名称和各种其他接口属性。
netsh interface ipv6 show interface
在带有 SP1 的 Windows XP 上,以下命令将更改与接口索引相关联的站点标识符。
netsh interface ipv6 set interface siteid = value
在 Windows XP 上,以下较旧的命令还会将与站点本地地址关联的站点标识符更改为3。
ipv6 rtu fec0::/10 3
如果要发送或连接到范围内的地址,则可将 sockaddr _ in6结构中的 sin6 _ 范围 _ id 成员保留为未指定 (零) ,这表示不明确的作用域地址。 例如,以下链路本地地址是不明确的:
fe80::10
如果要绑定到指定了作用域的地址,则 sockaddr _ in6结构中的 sin6 _ 范围 _ 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 。
相关主题