通过 Teredo 接收请求的流量
许多应用程序(如 Microsoft Internet Explorer 和 Microsoft Outlook)仅启动与 Internet 的连接。 对于这些应用程序, Teredo 可以在没有其他 IPv6 接口的情况下通过 IPv6 提供无缝连接。 此外,可以在具有 Service Pack 2 的早期 Microsoft Windows XP (SP2) 和 Windows Server 2003 平台上通过 Teredo 接口接收请求的流量。
以下文档介绍了这些应用程序如何实现连接,以及使用 Teredo 的情况。
获取目标地址
应用程序尝试使用各种方法(例如域名系统 (DNS) 或对等名称解析协议 (PNRP) )获取目标地址。 应用程序可以使用这些方法获取多个 IPv4 和 IPv6 IP 地址。 用于获取 IP 地址的典型 API 包括 Windows XP API GetHostByName 和新的 Windows Vista API GetAddrInfo。 例如,使用将 ai_family 参数设置为 AF_INET6 的 GetAddrInfo API,因为 addrinfo/protocol 提示允许用户专门查询 DNS 服务器中的 IPv6 地址。 类型为 DNS_TYPE_AAAA 的 DnsQuery API 还可用于查询 DNS 服务器中的 AAAA 记录。
建立连接
使用 Teredo 建立的连接被描述为“无缝”,因为它的处理方式与任何其他 IPv6 连接一样。 应用程序的编程无需特别考虑,就能够利用 Teredo 接口。 在 Teredo 接口之间建立连接时,不需要中继路由器(典型的 6to4 和其他本机接口)。 但是,Teredo 被设计为 IPv6 连接的最后手段转换技术。
注意
如果提供的主机名仅解析为 IPv4 地址,则不使用 Teredo。
当应用程序尝试使用 IPv6 地址连接到目标时,将发生以下情况:
应用程序通过调用 GetAdaptersAddresses API 获取 IPv6 地址列表。 Windows Vista 堆栈根据 RFC 3484 中指定的排序顺序返回所有接口的列表。 因此,IPv6 和 6to4 IPv6 接口将列在 Teredo 接口之前。 但是,当本机 IPv6 或 6to4 连接不可用时,Teredo 将是列出的唯一支持 IPv6 的接口。
请务必记住,应用程序可以使用 Windows Vista 堆栈提供的任何接口,但返回的接口列表的顺序通常会导致 Teredo 上次尝试。
在 Windows Vista 尝试通过 Teredo 接口进行连接之前,操作系统会确保 IPv6 地址已稳定。 这是针对传出连接自动完成的,这不是应用程序的关键考虑因素。 如果需要应用程序来保证地址稳定性,则可以调用 NotifyStableUnicastIpAddressTable API 以确保 Teredo 地址稳定。
Teredo 接口将尝试连接到目标处的另一个 Teredo 接口。 如果 Teredo 接口不存在,则通过特定于主机的中继与本机或 6to4 目标地址建立连接。
启动与 Internet 的连接的应用程序也可能接收未经请求的流量。 有关详细信息,请参阅 通过 Teredo 接收未经请求的流量。
使用 WSAConnectByName API
通过调用 WSAConnectByName API,应用程序可以连接到目标名称,而不是指定确切的 IP 地址。 Windows Vista 堆栈首选 IPv6 而不是 IPv4,因此,将首先对 IPv6 地址进行任何连接尝试。
调用 WSAConnectByName API 将按以下顺序对获取的所有目标 IP 地址进行排序:
- 本机 IPv6 地址
- 6to4 IP 地址
- IPv4 地址
- Teredo 地址
在内部对目标地址进行排序后,将根据目标地址的本地主机上可用的最佳路由尝试与目标的连接。 如已排序地址的顺序所示,如果目标名称解析为 IPv4 和 Teredo 地址,则 IPv4 地址将用于建立连接。
WSAConnectByName API 在内部工作,以查找地址之间的最佳匹配项。 此尝试基于本地主机和目标地址上可用的路由。
由于 Internet 上当前没有 Teredo 中继,因此不太可能通过 Teredo 接口成功连接到本机 IPv6 地址。 如果调用 WSAConnectByName,则当 Teredo 是唯一支持 IPv6 的接口可用时,Windows Vista 将不会发出 AAAA 查询。 这可确保不会将本机 IPv6 地址作为目标获取,并且通过 IPv4 尝试连接,而 IPv4 的成功几率最高。 为了在 Teredo 是唯一支持 IPv6 的接口时获取 IPv6 地址,应用程序必须将 DnsQuery API 显式用于 AAAA 记录。