透過 Teredo 接收請求的流量
許多應用程式,例如 Microsoft Internet Explorer 和 Microsoft Outlook 只會起始與網際網路的連線。 針對這些應用程式, Teredo 可以在沒有其他 IPv6 介面的情況下,透過 IPv6 提供順暢的連線能力。 此外,透過舊版 Microsoft Windows XP Service Pack 2 (SP2) 和 Windows Server 2003 平臺上的 Teredo 介面,可以接收請求的流量。
下列檔說明這些應用程式如何達到連線能力,以及使用 Teredo 的情況。
取得目的地位址
應用程式會嘗試使用各種方法取得目的地位址,例如網域名稱系統 (DNS) 或對等名稱解析通訊協定 (PNRP) 。 應用程式可以使用這些方法來取得多個 IPv4 和 IPv6 IP 位址。 用來取得 IP 位址的一般 API 包括 Windows XP API GetHostByName 和新的 Windows Vista API GetAddrInfo。 例如,使用 GetAddrInfo API 並將 ai_family 參數設定為 AF_INET6 ,因為 addrinfo/protocol 提示可讓使用者特別查詢 IPv6 位址的 DNS 伺服器。 具有類型DNS_TYPE_AAAA的 DnsQuery API 也可以用來查詢 AAAA 記錄的 DNS 伺服器。
建立連線
使用 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 目的地位址建立連線。
也可以讓起始網際網路連線以接收未經要求流量的應用程式。 如需詳細資訊,請參閱 透過 Teredo 接收未經請求的流量。
使用 WSAConnectByName API
藉由呼叫 WSAConnectByName API,應用程式可以連線到目的地名稱,而不是指定確切的 IP 位址。 Windows Vista 堆疊偏好 IPv6 而非 IPv4,因此會先對 IPv6 位址進行任何連線嘗試。
呼叫 WSAConnectByName API 會依下列順序排序取得的所有目的地 IP 位址:
- 原生 IPv6 位址
- 6to4 IP 位址
- IPv4 位址
- Teredo 位址
在內部排序目的地位址之後,會根據目的地位址的本機主機上可用的最佳路由,嘗試與目的地的連線。 如排序位址的順序所指出,如果目的地名稱解析為 IPv4 和 Teredo 位址,則會使用 IPv4 位址來建立連線。
WSAConnectByName API 可在內部運作,以找出位址之間的最佳相符專案。 此嘗試是以本機主機和目的地位址上可用的路由為基礎。
由於網際網路上目前沒有 Teredo 轉譯,原生 IPv6 位址的連線不太可能透過 Teredo 介面成功。 如果呼叫 WSAConnectByName,當 Teredo 是唯一可用的 IPv6 介面時,Windows Vista 將不會發出 AAAA 查詢。 這可確保原生 IPv6 位址不會取得為目的地,而且會嘗試透過 IPv4 進行連線,而此連線具有最高的成功機率。 為了在 Teredo 是唯一支援 IPv6 的介面時取得 IPv6 位址,應用程式必須明確使用 AAAA 記錄的 DnsQuery API。