Pages

Sunday, 3 February 2013

Teredo 原理概述

摘要
了解 Teredo (又成为面向 IPv6 的 IPv4 NAT穿越,是一项 IPv6 / IPv4 过渡技术,在 IPv6 / IPv4 主机位于一个或多个 IPv4 NAT 之后时,用来为单播 IPv6 连接提供地址分配和主机间自动隧道。 为了能够通过 IPv4 NAT, IPv6 数据包作为基于 IPv4 的用户数据包协议(UDP) 消息发送出去。本文向读者提供了有关 Teredo 的概述(包括 Teredo 地址以及数据包结构),并且详细解释了 Teredo 客户端的发起通信的方式、特定于 Teredo 主机的中继、仅支持 IPv6 主机使用 IPv4 Internet 的方法、 IPv6 Internet、 Teredo 服务器以及 Teredo 中继。

鸣谢
Christian Huitema, 架构设计师, Microsoft 公司
Stewart Tansley, 项目经理, Microsoft 公司
Mohit Talwar, 软件开发工程师, Microsoft 公司
Dave Thaler, 软件开发主管, Microsoft 公司

本页内容
        简介
        网络地址转换 (NAT)概述
         Teredo 构成
         Teredo 地址
         Teredo 数据包格式
         Teredo 路由
         Teredo 过程
        总结

简介
在 开始有关 Teredo 详细讨论前,我们有必要首先了解一下什么是 Teredo 以及我们为什么需要它。 Teredo 是一项地址分配和自动隧道技术,能够跨越 IPv4 Internet 实现 IPv6 单播连接。在它之前已经有了一种能够通过 IPv4 Internet 实现 IPv6 单播连接的自动隧道技术 —— 6to4 。 6to4 路由器使用一个公用的 IPv4 地址来构建 6to4 前缀,起到 IPv6 通告和促进路由器的作用。 6to4 路由器压缩和解压经过站点节点的 IPv6 数据流。
6to4 技术依靠公用 IPv4 地址的配置以及边界设备中采用的 6to4 路由功能。在许多小型办公室/家庭办公室(SOHO)配置中, IPv4 Internet 络地址转换 (NAT) 被广泛使用。如要了解更多关于网络地址转换工作的情况,请参阅文中的“网络地址转换(NAT)概述”。在大多数 NAT 配置中,提供 NAT 功能的设备并不具备成为 6to4 路由器的功能。即使 NAT 设备普遍支持 6to4 ,还是有一些配置包含多层NAT。在这些多层配置中,支持 6to4 的NAT无法成为路由器,因为它不具备一个公共的 IPv4 地址。
Teredo 通过在站点内的主机之间实现 IPv6 数据包隧道来解决现今 NAT 设备缺乏 6to4 功能以及多层 NAT 配置问题。 相反, 6to4 使用边缘设备之间的隧道。主机之间隧道给 NAT 带来了另外一个问题:IPv4 压缩的 IPv6 数据包发送时协议域的 IPv4 标头设定为41。大多数的 NAT只解析 TCP 或者 UDP 数据流,而且需要通过手动设置来实现对其它协议的解析或者安装负责处理解析的 NAT 编辑器。因为协议41的解析并不是 NAT 的通用功能,所以 IPv4 压缩的 IPv6 通信传输不能通过一般的 NAT。为了使 IPv6 数据传输能够通过单个或多层 NAT, IPv6 数据包必须压缩成 IPv4 UDP 格式的数据,包含 IPv4 和 UDP 标头各一个。UDP 数据普遍能够被 NAT 解析而且能够通过多层 NAT。
总 之, Teredo 是一项 IPv6/IPv4 转换技术,能够实现在处于单个或者多个 IPv4 NAT 后的主机之间的 IPv6 自动隧道。来自 Teredo 主机的 IPv6 数据流能够通过 NAT,因为它是以 IPv4 UDP 数据格式发送的。如果 NAT 支持 UDP 端口解析,那么它就支持 Teredo 。但是对称 NAT是一个例外,详细情况在本文的 "NAT 的种类" 中讲解。
Teredo 是作为实现 IPv6 连接最后一种转换技术而设计的,认识到这一点很重要。如果原来的 IPv6 、 6to4 或者ISATAP连接可用,那么主机就不必作为 Teredo 的客户端。现在,越来越多的 IPv4 NAT 经过了升级以便能够支持 6to4 ,而且 IPv6 连接变得越来越普遍, Teredo 将会使用得越来越少,直到最后完全被放弃。

网络地址转换 (NAT)概述
网 络地址转换 (NAT) 是指符合 RFC 1631 标准的 IPv4 路由器,它能够在发送前解析数据包 IP 地址以及 TCP/UDP 端口号。例如,设想一个由多台计算机组成的,连接到 Internet 的小型商务网。通常需要为每台连接到 Internet 的电脑从 Internet 服务提供商 (ISP) 处得到一个 IP 地址。但是通过 NAT,这个小型的商务网就可以使用私有地址 (如 RFC 1918 所述) ,然后通过 NAT 将专用地址映射到单个或者多个 IP 公用地址。
NAT 是针对以下各项要求的常见解决方案:
•        你想利用一条连接访问 Internet,而不是将多台电脑连接到 Internet 上。
•        你想使用私有地址。
•        你想在不部署代理服务器的情况下使用 Internet 资源。

网络地址转换的工作原理
当一台小型商务企业的内部网计算机用户连接到 Internet 资源时,该用户的 TCP/IP 协议产生一个 IP 数据包,该数据包包含以下值,这些值位于 IP 和 TCP 或 UDP 标头中:(粗体内容表示受 NAT 影响的项目):
•        目标 IP 地址:Internet 资源 IP 地址
•        源 IP 地址:私有 IP 地址
•        目标端口:Internet 资源 TCP 或 UDP 端口
•        源端口: 源应用程序 TCP 或 UDP 端口
请求源主机或者其它路由器将此 IP 数据包发送给 NAT, 然后由 NAT 将向外发送的数据包的地址解析如下:
•        目标IP地址:Internet 资源 IP 地址
•        源IP 地址:ISP 分配的公用地址
•        目标端口:Internet 资源 TCP 或 UDP 端口
•        源端口:重新映射的源应用程序 TCP 或 UDP 端口
NAT 将重新映射的 IP 数据包发送到 Internet 。响应计算机将向 NAT 返回一个响应。当 NAT 接收到此响应时,该数据包将包含以下地址信息:
•        目标IP 地址:ISP 分配的公用地址
•        源IP地址:Internet 资源 IP 地址
•        目标端口:重新映射的源应用程序 TCP 或 UDP 端口
•        源端口:Internet 资源的 TCP 或者 UDP 端口
当 NAT 完成映射和解析地址后,将向 Internet 客户端发送数据包,此数据包包含以下地址信息:
•        目标 IP 地址:私有 IP 地址
•        源 IP 地址:Internet 资源 IP 地址
•        目标端口:源应用程序 TCP 或者 UDP 端口
•        源端口:Internet 资源 TCP 或 UDP 端口
对于向外发送的数据包,源 IP 地址和 TCP/UDP 端口号将被映射到一个公用源 IP 地址和一个可能变化的 TCP/UDP 端口号。对于接收的数据包,目标 IP 地址和 TCP/UDP 端口号将被映射到私有 IP 地址和初始 TCP/UDP 端口号。
例 如,一个小型办公网络使用 192.168.0.0/24 作为企业内部网络私有 ID 并且其 Internet 网络服务提供商分配的单一公用IP地址为131.107.0.1。当此小型内部网中一台内部私有地址为 192.168.0.99 的客户访问 IP 地址为 157.60.0.1的网站服务器时,此用户机的 TCP/IP 协议产生一个包含以下在 IP 和 TCP 或者 UDP 标头中的数值的 IP 数据包:
•        目标IP地址:157.60.0.1
•        源IP地址: 192.168.0.99
•        目标端口:80
•        源端口:1025
请求源主机将此 IP 数据包发送给 NAT 设备,然后由 NAT 设备解析向外发送数据包的地址如下:
•        目标 IP 地址:157.60.0.1
•        源 IP 地址:131.107.0.1
•        目标端口:80
•        源端口:5000
NAT 将重新映射后的 IP 数据包发送到 Internet。网站服务器向 NAT 返回一个响应。当 NAT 接受到此响应时,数据包包含以下地址信息:
•        目标IP地址:131.107.0.1
•        源IP地址:157.50.0.1
•        目标端口:5000
•        源端口:80
当 NAT 完成地址的映射和解析后,它将此数据包发送给 Internet 客户端,数据包包含以下地址信息:
•        目标IP地址:192.168.0.99
•        源IP地址:157.60.0.1
•        目标端口:1025
•        源端口:80
图 1 展示了此例子的配置方式。

图1:NAT示例

从私用流量到公共流量的映射储存在一个 NAT 转换表中,包括两种类型的条目:
1.动态映射
在专用网络用户开始通信时产生。除非被与 NAT 转换表相对应的流量所刷新,否则动态映射在指定的时间后将从 NAT 转换表中删除。
2.静态映射
通 过手动设置,使 Internet 客户进行的通信能够映射到某个特定的私有网络地址和端口。如果想让连接在 Internet 上的计算机能够使用某个私有网络上的服务器(如网站服务器)以及应用程序(如游戏),那么静态映射是必需的。静态映射不会从 NAT 转换表中删除。
如果在 NAT 转换表中存在某个映射,那么 NAT 只是单向地从 Internet 向私有网络传送数据。这样,NAT 就为连接到私有网络部分的计算机提供了某种程度的保护。但是,如果考虑到 Internet 的安全性,NAT 就要配合全功能的防火墙一起使用。

NAT 的类型
以下各类 NAT 的定义:
•        Cone(Cone) NAT
完全 NAT 是指在 NAT 转换表中存储了内部地址和端口号与外部地址和端口号之间映射关系的一类 NAT。一旦 NAT 转换表开始工作,来自任何源地址和端口通往外部地址和端口的入站数据包都将被转换。
•        受限 NAT
受限 NAT是指在 NAT 转换表中存储了内部地址和端口号与外部地址和端口号之间的映射,无论是特定的源地址或者特定源地址与端口号。如果从某个未知外部地址或者端口到外部目标地址和端口的入站数据包与 NAT 转换表吻合,那么此数据流将被自动放弃。
•        对称 NAT
对称 NAT 是指根据外部目标地址(适用于出站数据包)将相同的内部地址和端口号映射到不同的外部地址和端口号的 NAT。
Teredo 只能工作于Cone和受限 NAT,不能工作于对称 NAT。

Teredo 构成
Teredo 结构由以下各部分组成(如图 2 所示):
•        Teredo 客户端
•        Teredo 服务器
•        Teredo 中继
•        特定于 Teredo 主机的中继


图2:Teredo 结构图

Teredo 客户端
Teredo 客户端是指支持 Teredo 隧道接口的 IPv6 / IPv4 节点,通过此隧道界面数据包可以传送给其它的 Teredo 客户端以及 IPv6 Internet上的其它节点 (通过 Teredo 中继)。 Teredo 客户端与 Teredo 服务器建立通信获得配置基于 Teredo 的 IPv6 地址用的地址前缀或者帮助建立与 IPv6 Internet上其它 Teredo 客户端和服务器之间的通信。
The Advanced Networking Pack for Windows XP 包含了一个 Teredo 客户端。

Teredo 服务器
Teredo 服务器是指连接 IPv4 Internet 与 IPv6 Internet 的 IPv6 / IPv4 节点,支持用来接受数据包的 Teredo 隧道接口。Teredo 服务器的常见作用是帮助 Teredo 客户端的地址配置以及协助在 Teredo 客户端之间或者客户端与纯 IPv6 主机之间与其他 Teredo 客户端建立通信连接。Teredo 服务器使用 UDP 3544 端口侦听 Teredo 通信。
有关 Teredo 服务器在协助建立通信连接中的作用,请参阅本文" Teredo 程序步骤"。
The Advanced Networking Pack for Windows XP 不包含 Teredo 服务器功能。 The Advanced Networking Pack for Windows XP 有助于建立通信连接, Microsoft 采用 IPv4 Internet上的 Teredo 服务器。

Teredo 中继
Teredo 中继是指能够在 IPv4 Internet 上的 Teredo 客户端之间(使用 Teredo 隧道接口)以及与纯 IPv6 主机之间传送数据包的 IPv6 / IPv4 路由器。在某些情况下,Teredo 中继和 Teredo 服务器协同工作,帮助在 Teredo 客户端之间以及与纯 IPv6 主机之间建立连接。 Teredor 中继使用 UDP 3544 端口侦听 Teredo 通信。
有关 Teredo 中继在 Teredo 客户端之间以及 Teredo 客户端与纯 IPv6 主机之间的发起和开展通信方面所具有的作用,请参阅本文中"Teredo 进程"部分 。
The Advanced Networking Pack for Windows XP 不包含 Teredo 中继功能。 Microsoft 没有打算使用任何 IPv4 Internet 上的 Teredo 中继。个人 Internet 服务提供商 (ISP) 可以使用他们自己的 Teredo 中继。在向处于 IPv6 Internet 上的 IPv6 主机发送数据包的时候,采用了The Advanced Networking Pack for Windows XP 的 Teredo 客户端将和 Teredo 中继协同工作。 Teredo 中继并不需要和特定于 Teredo 主机的中继进行通信。

特定于 Teredo 主机的中继
配 置了全球地址的 Teredo 客户端与 IPv6 主机之间的通信必须经过 Teredo 中继。这对于连接到 IPv6 Internet 的 IPv6 主机而言是必需的。但是,当 IPv6 主机既支持 IPv6 又支持 IPv4,并且同时连接到 IPv4 Internet 和 IPv6 Internet, 那么,Teredo 客户端与 IPv6 主机之间的通信就会通过 IPv4 Internet 实现,而不必经过 IPv6 Internet 和 Teredo 中继。
特 定于 Teredo 主机的中继是指同时具有 IPv4 与 IPv6 Internet连接,并且无需 Teredo 中继即可通过 IPv4 Internet 直接与 Teredo 客户端通信的 IPv6 / IPv4 节点。与 IPv4 Internet 的连接可以通过使用一个公用的 IPv4 地址或者使用一个专用 IPv4 地址和边界 NAT 来实现。与 IPv6 Internet 的连接可以通过直接连接或者当 IPv6 数据包通过 IPv4 Internet 隧道时使用诸如 6to4 这类的 IPv6 转换技术来实现。特定于 Teredo 主机的中继使用 UDP 3544 端口侦听 Teredo 通信。
采 用了 The Advanced Networking Pack for Windows XP 的 Teredo 客户端包括了特定于 Teredo 主机的中继功能。当在安装了 SP1 或者更高版本的补丁并且分配了全球地址的 Windows XP 上安装了The Advanced Networking Pack for Windows XP 后,特定于 Teredo 主机的中继功能便会自动激活。这个全球地址可以通过从本地 IPv6 路由器、ISATAP 路由器或者 6to4 路由器发送的路由器通告中获得。如果运行 Windows XP SP1 的计算机没有全球地址,那么 Teredo 客户端功能便被激活。
特 定于 Teredo 主机的中继能够使 Teredo 客户端与 6to4 主机、带有非 6to4 全球地址前缀的 IPv6 主机或者组织内部的地址中使用全球前缀的 ISATAP 以及 6over4 主机进行有效通信。但是所有的主机都必须使用 The Advanced Networking Pack for Windows XP。


Teredo 地址
Teredo 地址格式见图 3。

图3:Teredo 地址格式


Teredo 地址包含以下内容:
•        Teredo 前缀
最前面的 32 位是 Teredo 前缀,所有的 Teredo 地址的前缀都是相同的。互联网号码分配机构(IANA)还没有对该前缀进行定义,尽管该前缀 3FFE:831F::/32 已经运用于初始配置。
•        Teredo 服务器 IPv4 地址
接下来的 32 位包含 Teredo 服务器的 IPv4 的公共地址以帮助设定 Teredo 地址。更多信息请参阅本文中的 " Teredo 客户的初始配置"。
•        标志
接 下来的 16 位是为 Teredo 标志预留的。唯一定义的标志是被称作“Cone Flag”的高位。 只有当接入 Internet 的 NAT 为Cone NAT时,“Cone Flag”才可以使用。接入 Internet 的 NAT 是否是Cone NAT 在 Teredo 客户端的初始配置中设定。更多信息请参阅本文的 "Teredo 客户初始设定" 章节。
•        隐藏外部端口
接 下来的 16 位储存的是与该 Teredo 客户端所有 Teredo 通信相对应的外部 UDP 端口的隐藏模式。当 Teredo 客户端向 Teredo 服务器发送初始数据包时,NAT 会将源数据包的 UDP 端口映射到一个不同的外部 UDP 端口。Teredo 客户保留了这个端口映射以便使其留在 NAT 转换表中。因此,主机所有的 Teredo 通信均使用同一外部映射的 UDP 端口。UDP 外部端口是由 Teredo 服务器根据从 UDP 源端口导入的原始 Teredo 客户数据包决定并发回 Teredo 客户的。
外 部端口的隐藏是将外部端口与 0xFFFF 进行逻辑异或运算。例如,外部端口的隐藏文件 5000 的16位进制格式是 EC77 (5000 = 0x1388, 0x1388 XOR 0xFFFF = 0xEC77)。隐藏这个外部端口可以预防 NAT 在数据包的有效载荷内转发时对其进行转换。
•        隐藏外部地址
最 后32 位储存与 Teredo 客户端所有 Teredo 通信相对应的外部 IPv4 地址的模糊形式。就像外部端口一样,当 Teredo 客户端向其服务器发送初始数据包后,数据包的源 IP 地址被 NAT 映射到一个不同的外部公用地址。 Teredo 客户保留了这个地址映射以便使其留在 NAT 的转换表。因此,主机上所有的 Teredo 通信均使用同一外部的映射公用 IPv4 地址。外部 IPv4 地址是由 Teredo 服务器根据 Teredo 客户发送的原始数据包的源 IPv4 地址决定的,并且发回给 Teredo 客户。
外 部地址通过与 0xFFFFFFFF 进行异或运算后被隐藏。例如,公共 IPv4 地址 131.107.0.1 隐藏后其十六进制的冒号格式为 7C94:FFFE (131.107.0.1 = 0x836B0001, 0x836B0001 XOR 0xFFFFFFFF = 0x7C94FFFE)。隐藏外部地址避免了 NAT 在数据包的有效载荷内转发时将其转换。

图 4 是 2 个 Teredo 客户端与他们的地址的示例。

图4:Teredo 地址示例


对于 Teredo 客户端 A,其 Teredo 地址由以下项目组成:
•        Teredo 通信的外部地址和端口是 157.60.0.1,UDP 端口是 4096
•        Teredo 服务器的公用 IPv4 a 地址为 206.73.118.1
•        位于一个 Cone NAT 后面
所 以, 使用 Teredo 地址前缀格式:ServerAddr:Flags:ObscExtPort:ObscExtAddr, Teredo 客户端 Teredo 地址为 3FFE:831F:CE49:7601:0:DFFF:7C94:FFFE。这基于以下几点:
•        CE49:7601 是 206.73.118.1 的 16 进制冒号形式
•        8000 是完全标记设为 1 时标记域的值,表示 Teredo 客户端 A 的 NAT 是一个Cone NAT 。
•        EFFF 是 4096 (0x1000) 的隐藏形式
•        C2C3:FFFE 是 157.60.0.1的隐藏形式
对于 Teredo 客户端 B,其 Teredo 地址由以下项目组成:
•        Teredo 通信的外部地址和端口是131.107.0.1,UDP端口是8192
•        Teredo 服务器位于公用 IPv4 a 地址 206.73.118.1上
•        位于一个受限 NAT 的后面
所 以,使用 Teredo 地址前缀格式:ServerAddr:Flags:ObscExtPort:ObscExtAddr, Teredo 客户端 Teredo 地址为 3FFE:831F:CE49:7601:0:DFFF:7C94:FFFE。这基于以下几点:
•        CE49:7601 是 206.73.118.1 的 16 进制冒号形式
•        0 是完全标记设为 0 时标记域的值,表示 Teredo 客户端 B 的 NAT 是一个受限 NAT。
•        DFFF 是 8192 (0x2000) 的隐藏形式
•        7C94:FFFE 是 131.107.0.1 的隐藏形式
Teredo 地址只是分配给 Teredo 客户端。Teredo 服务器、中继、和特定于主机的中继并不分配 Teredo 地址。

Teredo 数据包格式
本章节讨论以下问题:
•        Teredo 数据包格式
•        Teredo 气泡数据包
•        Teredo 指示符

Teredo 数据包格式
Teredo 数据包格式如图5所示。

图5: Teredo 数据包格式

Teredo 数据包由以下部分构成:
•        IPv4 标头包含与自动隧道终端相对应的源 IPv4 地址和目标 IPv4 地址并且可以被NAT转换。
•        UDP 标头包含 Teredo 数据通信的源端口和目标端口,可以被 NAT 解析。
•        IPv6 标头包含源 IPv6 地址和目标 IPv6 地址,其中至少有一个是 Teredo 地址。
•        IPv6 载荷包含零个或者更多的 IPv6 扩展标头以及压缩的 IPv6 数据包的上层协议数据单位(PDU)。

Teredo 气泡数据包
Teredo 气泡数据包为建立或维持一个 NAT 映射而发送,由 IPv6 标头组成,并且不包含 IPv6 有效载荷。
图6为 Teredo 气泡数据包。

图6: Teredo 气泡数据包

在 IPv6 标头中,下一个标头的域设置为 59,表示没有有效载荷。

Teredo 指示符
Teredo 使用两种不同的指示符,它们是用来表示验证或者地址和端口信息的标头。

验证指示符
验 证指示符用来保证在 Teredo 客户端和 Teredo 服务器之间进行路由器请求和路由器通告信息的可靠性。 Teredo 客户端和 Teredo 服务器都使用在鉴定指示符中产生验证信息的密钥进行加密。验证指示符处于 UDP 标头与 IPv6 数据包之间。如果在路由器通告信息中同时出现原始和验证指示符,那么验证指示符将被放在原始指示信息前面。
验证指示符的结构如图 7 所示。

图7:验证信息结构图


验证数据包含以下各域:
•        Indicator Type(指示符的类型)
这 个长度为两个字节的值指定了指示符的类型。对于验证指示符,其值为1。 Teredo 客户端和 Teredo 服务器 能够通过 IPv6 数据包的前两个字节区分出验证信息,因为 IPv6 数据包的前四个高位字节设定为 0110 (6), 与 IPv6 标头的转换域相对应。
•        Client ID Length(客户端 ID 长度)
这个长度为 1 个字节的值指定了“客户端标识”域的长度。
•        Authentication Data Length(验证数据的长度)
这个长度为 1 字节的域指定了“验证值”域的长度。
•        Client Identification(客户端标识)
这个长度不定的域包含一个 Teredo 客户端的标识字符串。
•        Authentication Value(验证值)
这个长度不定的域包含使用共享密钥计算的此数据包的验证值。有关如何计算验证值的信息请参阅 Teredo Internet 草案的 5.2.2 章节。
•        Nonce(现在)
这个长度为 8 字节的域包含了一个任意数字,用来证明数据交流还在进行并且防止数据包重复传送攻击。
•        Confirmation(确认)
这个长度为 1 字节的域包含一个用来表明客户端是否在路由器的请求信息中使用了正确的密钥值,这个确认域设置为0。在路由器通告信息中,此确认域设置为 0 或者密钥错误时为一个非 0 值。
虽 然在路由器通告信息和路由器请求信息中也包含了验证指示符,但是在 采用了 The Advanced Networking Pack for Windows XP 的 Teredo 客户端中并不使用客户标识符或者验证值。当在没有客户端标识符或者验证值的时候,验证指示符的格式如图 8 所示。

图8:没有客户端标识符或者验证值时,验证指示符的格式

原始指示符
原 始指示符用来表示 Teredo 客户端、 Teredo 中继或者特定于 Teredo 主机的中继的 IPv4 地址和 UDP 端口。它的用途的一个例子就是,当 Teredo 服务器回应 Teredo 客户端的路由器请求信息而发出路由器通告信息。在这种情况下,原始指示数据包含了对应于 Teredo 客户端 Teredo 通信流的已经映射的 IPv4 地址和 UDP 端口号。有关更多信息,请参阅本文"Teredo 客户端初始配置"
如同验证指示符,原始指示符放在 UDP 标头与 IPv6 标头之间。它的结构如图 9 所示。

图9:原始指示符的结构

原始指示数据包含以下域:
•        指示符类型
这个长度为 2 字节的域说明了指示符的类型。对于原始指示符,其值为 0。 Teredo 客户端可以根据 IPv6 数据包的前两个字节区分出原始指示符,因为 IPv6 数据包的前两个高位字节设置为0110 (6), 与 IPv6 标头的转换域相对应。
•        隐藏原始端口号
这个两个字节的与包含一个与 Teredo 客户端、 Teredo 中继或者 特定于 Teredo 主机的中继 Teredo 通信相对应的隐藏外部端口(同 0xFFFF 异或)。 模糊原始端口的值与 0xFFFF 异或。
•        隐藏原始地址
这个长度为 4 字节的域包含与 Teredo 客户端、 Teredo 中继或者特定于 Teredo 主机的中继 Teredo 通信相对应的隐藏外部 IPv4 地址 (同 0xFFFFFFFF XORed) 。隐藏原始地址域与 0xFFFFFFFF 异或。
图 10 表示了实现了 The Advanced Networking Pack for Windows XP 的 Teredo 客户端使用的三种包含原始与验证指示符的不同数据包类型。


Teredo 路由
图 11 显示了 Teredo 数据包在 Teredo 主机, 特定于 Teredo 主机的中继和 IPv6 主机之间的传输。

图 11:Teredo 路由

在 IPv6 网上,前缀 ::/32 路由被用于将使用 Teredo 前缀定义的数据包发送到最近的 Teredo 中继上。 Teredo 服务器, Teredo 中继和 特定于 Teredo 主机的中继有一个前缀::/32 路由,此路由包含了所有用该前缀作为在链的地址,也包含用作 Teredo 隧道出口的地址。 Teredo 隧道接口是一个逻辑接口,它将自动将 IPv4 地址与 UDP 的封装成发送的数据包。 Teredo 服务器, Teredo 中继和 特定于 Teredo 主机的中继同时还有一个默认路由(::/0)指向 IPv6 网络。特别地,这个默认路由包含一个在 IPv6 网络上用一个物理接口与 IPv6 网相连的临近路由器的下个中继段的 IPv6 地址。

Teredo 客户端路由
Advanced Networking Pack for Windows XP 中的 Terodo 客户端有一个默认路由,它将使用该前缀的所有地址都视作 on-link 地址,也包含用 Teredo 隧道接口的地址。当这个默认地址使用时,下一中继段的地址被置于 IPv6 数据包中的目标地址中,同时下一中继段接口被置于 Teredo 隧道接口中。
当 Teredo 隧道接口发送数据包时,分为下面三种情况:
1.目标是位于同一个 IPv4 Internet 络上的 Teredo 客户端。
2.目标是位于另一个站点上的 Teredo 客户端。
3.目标是 IPv6 Internet 上的一个节点。

On-link Teredo 目标
对 于发往相同站点和链接中其它 Teredo 主机的数据包, Teredo 隧道接口通过交换气泡数据包来代替 Neighbor Discovery 的地址解析进程。交换气泡数据包保证了每一个 Teredo 客户端之间能够直接发送数据包。想要了解更多信息,请查阅本文 "相同链接上的 Teredo 主机之间的通信初始化" 章节。
Teredo 检查多播气泡数据的缓存,决定目标 Teredo 地址是否与同一连接上的 Teredo 客户端通信。每一个 Teredo 客户端都在 IPv4 链路上发送多点传输气泡数据包给 Teredo 服务器以显示它在链路上的存在。每个 Teredo 客户端接受到其它 Teredo 客户端的气泡数据包后,与自己的 Teredo 和 IPv4 地址一起发送给多播气泡缓存。因此,如果目标 Teredo 地址在多点传输气泡缓存中,那么目标就是一个 on-link 邻居。

站点间的 Teredo 目标
对 于发往不同节点上的另一台 Teredo 主机的数据包,如果两个 Teredo 主机都跨越 受限 NAT,Teredo 隧道接口使用气泡数据包替代“邻居发现”(Neighbor Discovery)地址解析过程。当两台 Teredo 主机都穿越受限网络地址转换时, Teredo 隧道出口用气泡数据包的交换代替发现 Neighbor Discovery 协议的地址解析过程。气泡数据包的交换在双方的 NAT 上都会生成特定地址和端口的映射。这样,两个不同点的 Teredo 客户端就可以直接发送数据包给对方。如果希望进一步了解相关信息,请参阅本文的"在不同站点的 Teredo 客户端中初始化通信"部分。

IPv6 网络目标
对 于 IPv6 Internet 的数据包, Teredo 隧道接口用 ICMPv6 Echo Request 和 Echo Reply消息来代替 Neighbor Discovery 协议的地址解析进程。当一个 ICMPv6 Echo Request 消息发送给目标后,包含有在 IPv6 网上离 IPv6 主机最近的 Teredo 中继的 IPv4 地址的 ICMP Echo Reply 消息就回复。想进一步了解,请查看本文的"从 Teredo 客户端到 特定于 Teredo 主机的中继的初始化通信" 和 "从 Teredo 客户端到 IPv6 主机的初始化通信"章节。

Teredo 过程
此部分提供了 Teredo 有关数据包交换的细节,具体如下:
•        Teredo 客户端的初始化设置
•        维护 NAT 映射
•        相同链接 Teredo 客户端之间的初始化通信
•        不同站点 Teredo 客户端之间的初始化通信
•        从 Teredo 客户端到 特定于 Teredo 主机的中继的初始化通信
•        从 特定于 Teredo 主机的中继到 Teredo 客户端的初始化通信
•        从 Teredo 客户端到 IPv6 主机的初始化通信
•        从 IPv6 主机到 Teredo 客户端的初始化通信
所有这些过程都是由 Advanced Networking Pack for Windows XP 中的 Teredo 客户端支持的;并且是自动、无需用户干涉的。唯一的例外是:Teredo 服务器的 IPv4 地址是可选配置。

Teredo 客户端的初始化设置
Teredo 客户端的初始化设置通过发送一系列路由请求消息给 Teredo 服务器确定一个 Teredo 地址,并了解客户端是通过一个Cone,受限还是在对称的 NAT。图12显示了 Teredo 客户端的初始化进程。

图12: Teredo 客户端的初始化设置

Teredo 客户端的初始化设置包括以下过程:
1.路由服务器请求信息 Router Solicitation (RS) 由 Teredo 客户端发给首选的 Teredo 服务器(Teredo 服务器1)。 Teredo 客户端从设置过“Cone”标志的当地链接地址发出 RS。
2.Teredo 服务器 1 回应一个路由器登记信息 Router Advertisement (RA)。由于 RS 已经设置了“Cone”标记, Teredo 服务器1会从一个动态的 IPv4 地址发送出 RA。Teredo 客户端收到 RA 后会得知那是一个“Cone”的网络地址转换。
3.如果没有收到 RA, Teredo 客户端就会从当地链接地址发送另一个没有设置“Cone”标志的 RS。
4.Teredo 服务器 1 回应一个 RA。因为 RA 没有设置“Cone”标志,所以服务器 1 会发送一个与 RS 目标地址通信的 IPv4 原地址。如果 Teredo 客户端收到 RA,就得出那是受限的地址转换。
5.为了确保 Teredo 客户端不是一个对称的网络地址转换,它就会发出另一个 RA 到 Teredo 服务器( Teredo 服务器 2)。
6.Teredo 伺服器 2 回应一个 RA。客户端对两个 Teredo 服务器的 RA 来源指示符中的映射地址和 UDP 端口进行比较。如果他们不同,那么NAT就是在映射相同的内部地址和端口号到不同的外部地址和端口号。 Teredo 客户端确定这个 NAT 是一个对称的 NAT,不能用 Teredo 进行通信。
由于收到 RA(先前进程的第二步或第四步), Teredo 客户端以如下方式构造地址:
•        首先 64 位包含收到的 RA 前缀信息。这 64 位由 Teredo 服务器登记的前置码,包含 Teredo 前缀(32 bits)和 Teredo 服务器的 IPv4 的地址码(32位)。
•        接下来的 16 位是 0x8000 (Cone NAT ) 或是 0x0 (受限 NAT)
•        再接下来的 16 位对从 RA 中 Origin (原始)指示符来的外部 UDP 端口号进行赋值。
•        最后 32 位放置从 RA 中 Origin 指示符来的外部 IP 地址。
实 现了 The Advanced Networking Pack for Windows XP 的 Teredo 客户端会自动尝试通过解析 name Teredo .IPv6.Microsoft.com 来测定 Teredo 服务器的 IPv4 地址。相应地,你可以用netsh interface IPv6 set Teredo servername= 命令来设置 Teredo 服务器的 IPv4 地址。

维持 NAT 映射
图13 显示了 Teredo 客户端是如何维持 Teredo 通信的 NAT 映射的。

图 13:维持 NAT 映射

Teredo 客户端会定期地(一般默认每隔 30 秒钟)发送单一的气泡数据包到 Teredo 服务器。 Teredo 服务器会在不回复的情况下丢弃该数据包。这个周期性的数据包会重新刷新 NAT 的转换表。否则,这个映射就无效并被删除。如果映射不存在,对于Cone NAT 而言,所有接收的数据流;对于受限 NAT 而言,所有从 Teredo 服务器到 Teredo 主机的数据流会地被 NAT 悄悄删除。
同一链接上的 Teredo 客户端之间的通信初始化
图 14 显示了同一链接上的 Teredo 客户端之间的通信初始化。

图 14:同一链接上的 Teredo 客户端之间的通信初始化


在同一个链接中,要从客户端 A 发送一个通信初始化数据包到客户端 B,按照下面的过程:
1.Teredo 客户端发送一个气泡数据包到 Teredo IPv4 Discovery Address,一个租用的多播地址(其真实地址由 IANA 决定)。在气泡数据包的 IPv6 头部,目标地址被置于 Teredo 客户端 B 的 Teredo 地址中。
2. 根据从收到 Teredo 客户端 A 的发出多播气泡数据包的认证信息, Teredo 客户端 B 指定 Teredo 客户端 A 和 UDP 端口 on-link 的 IPv4 地址用于 Teredo 通信,并且用于发送一个多播的气泡数据包给 Teredo 客户端A作为回应。根据从收到 Teredo 客户端 B 的发出多播气泡数据包的认证信息, Teredo 客户端 A 指定 Teredo 客户端 B 和 UDP 端口 on-link 的 IPv4 地址用于 Teredo 通信。
3.Teredo 客户端 A 发送一个通信初始化数据包给 Teredo 客户端 B。

不同站点下 Teredo 客户端之间的通信初始化
不同站点下 Teredo 客户端之间的通信初始化取决于节点之间是用Cone NAT 还是受限NAT。

Cone NAT
图15 表明当节点都位于Cone NAT 之后时, Teredo 客户端之间的通信初始化。

图15:节点都位于 Cone NAT 之后时, Teredo 客户端之间的通信初始化。

当 Teredo 客户端都在 Cone NAT 之后时,Cone NAT 允许其转换表条目开放任何源 IP 地址和 UDP 端口让 Teredo 客户端进行 Teredo 通信。因此, Teredo 客户端 A 可以在无需运用气泡数据包建立额外的 NAT 转换表条目的情况下向 Teredo 客户端 B 直接发送数据。

受限 NAT
图16 表明了当不同站点使用受限 NAT 时, Teredo 客户端之间的通信初始化。

图16:不同站点使用受限 NAT 时, Teredo 客户端之间的通信初始化

从 Teredo 客户端 A 发送通信初始化数据包到 Teredo 客户端 B,过程如下:
1.Teredo 客户端 A 直接发送气泡数据包给 Teredo 客户端 B。因为 Teredo 客户端 B 是位于受限 NAT 之后,从任意的 IPv4 源地址和 UDP 端口号来的 Teredo 通信是不允许的,除非那是一个特定源的 NAT 转换表条目。假如没有,受限 NAT 丢弃此数据包。但是,当受限 NAT 为 Teredo 客户端 A 发送气泡数据包时,它会建立一个特定源的 NAT 的转换表,使得接下来的 Teredo 客户端 B 的数据包被发送至 Teredo 客户端 A。
2.Teredo 客户端 A 通过 Teredo 服务器 2( Teredo 客户端B的 Teredo 服务器)发送数据包给 Teredo 客户端 B。在气泡数据包中的 IPv4 目标地址设置指向 Teredo 服务器 2 的 IPv4 地址,该地址由客户端 A 从客户端 B 的 Teredo 地址的第 3 和第 4 块识别。
3.Teredo 服务器处理这个数据包,为 Teredo 客户端指定 IPv6 目标地址,然后将气泡数据包转发到 Teredo 客户端 B。受限 NAT 为 Teredo 客户端 B 发送数据包,是因为存在一个特定源为从 Teredo 服务器 2 进行 Teredo 通信进行映射。
4.Teredo 客户端 B 用自己直接向 Teredo 客户端 A 发送的数据包,对从 Teredo 客户端 A 收到的数据包进行回应。因为 Teredo 客户端 A 的受限 NAT 有一个特定源的映射,为从 Teredo 客户端 B 来的 Teredo 通信服务的(就象过程1那样,通过从 Teredo 客户端 A 发送初始数据包来建立),这个数据包被发送到 Teredo 客户端 A。
5.根据来自 Teredo 客户端 B 的气泡数据包的认证信息, Teredo 客户端 A了解到特定于源特 NAT 映射存在于两个用户的 NAT 上。 Teredo 客户端 A 直接发送一个初始数据包到 Teredo 客户端 B。

Teredo 客户端到 特定于 Teredo 主机的中继的通信初始化
从 Teredo 客户端发送初始数据包到一个 特定于 Teredo 主机的中继,依赖于 Teredo 客户端是一个Cone NAT 还是一个受限NAT。

Cone NAT
图17表明当 Teredo 客户端在 Cone NAT 之后从 Teredo 客户端到主机特定中继的通信初始化。

图17: Teredo 客户端在 Cone NAT 之后从 Teredo 客户端到主机特定中继的通信初始化

从 Teredo 客户端发送通信初始化数据包到特定于 Teredo 主机的中继,进程如下:
1.Teredo 客户端 A 发送一个经过其 Teredo 服务器的 ICMPv6 Echo Request 消息
2.Teredo 服务器接收到ICMPv6的ICMPv6 Echo Request 消息,然后在 IPv6 网络上发送到 特定于 Teredo 主机的中继或者在 IPv4 Internet 上把它封装在隧道里。
3.特定于 Teredo 主机的中继用一个被送到 Teredo 客户端 A 的 Teredo 地址进行ICMPv6 Echo Reply响应。
4.在特定于 Teredo 主机的中继收到的回送答复后,Teredo 客户端就会发送一个通信初始化的数据包到 特定于 Teredo 主机的中继的 ICMPv4 地址和 UDP 端口上。
所有后续的往来于 Teredo 客户端和特定于 Teredo 主机中继的数据包将直接发送。

受限 NAT
图18 显示了当 Teredo 客户端位于受限 NAT 之后,从 Teredo 客户端发送通信初始化数据到特定于 Teredo 主机的中继的过程。

图18: Teredo 客户端位于受限 NAT 之后,从 Teredo 客户端发送通信初始化数据到 特定于 Teredo 主机的中继

从 Teredo 客户端发送通信初始化数据到特定于 Teredo 主机的中继,进程如下:
1.Teredo 客户端通过自己的 Teredo 服务器发送一个 ICMPv6 Echo Request 消息到特定于 Teredo 主机的中继。
2.Teredo 服务器收到 ICMPv6 Echo Request 消息后,在 IPv6 网上发送给 特定于 Teredo 主机的中继或者封装到 IPv4 Internet 络的隧道上。
3. 特定于 Teredo 主机的中继确定 Teredo 客户端位于受限 NAT之后 。如果 Teredo 中继发送 ICMPv6 Echo Request 消息给 Teredo 客户端,则 NAT 丢弃此消息,因为没有从 特定于 Teredo 主机的中继来的 Teredo 通信的源特定的映射。因此, 特定于 Teredo 主机的中继经由 Teredo 服务器在 IPv4 Internet 络上发送一个气泡数据包到 Teredo 客户端。
4.Teredo 服务器从特定于 Teredo 主机的中继的气泡数据包。 Teredo 服务器发送气泡数据包到 Teredo 客户端,同时,Origin 指示符包含了这个特定于 Teredo 主机的中继的 IPv4 地址和 UDP 端口号。因为一个从 Teredo 服务器的 Teredo 通信的映射存在于 NAT,一个气泡数据包被发送到 Teredo 客户端。
5.Teredo 客户端确定从收到气泡数据包的来源指示符上确定特定于 Teredo 主机的中继的 IPv4 地址和 UDP 端口。要建立一个从 特定于 Teredo 主机的中继的 Teredo 的通信的映射, Teredo 客户端还要发送一个气泡数据包到 特定于 Teredo 主机的中继。
6. 根据来自 Teredo 客户端的气泡数据包的收条——与一个进入队列等待转发(ICMPv6 Echo Reply 消息)的数据包对应,特定于 Teredo 主机的中继确定一个特定于来源的 NAT 映射现在存在于 Teredo 客户端的受限 NAT 之中。特定于 Teredo 主机的中继将 ICMPv6 Echo Reply 消息发送到 Teredo 客户端。
7.一个通信初始化的数据包从 Teredo 客户端发送到特定于 Teredo 主机的中继的 IPv4 地址和 UDP 端口上。
所有 Teredo 客户端与 特定于 Teredo 主机的中继并发的数据包都直接被发送。

特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化
特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化依赖于 Teredo 客户端是Cone NAT 之后的还是受限 NAT。

Cone NAT
图19显示了当 Teredo 客户端位于Cone NAT 之后时,特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化。

图19:Teredo 客户端位于Cone NAT 之后时,特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化

要 从 特定于 Teredo 主机的中继发送到 Teredo 客户端的一个通信初始化数据包, 特定于 Teredo 主机的中继要确定 Teredo 客户端是一个Cone NAT 。因此, 特定于 Teredo 主机的中继直接发送初始化数据包到 Teredo 客户端。
要 确定初始化数据包的 IPv6 地址真实,并且符合特定于 Teredo 主机的中继, Teredo 客户端用本文的有关" 特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化"(Cone NAT 之后的)的 1 至 3 步与 特定于 Teredo 主机的中继执行一次 ICMPv6 Echo Request/Echo Reply 的消息交换。当此消息交换完成, Teredo 客户端向特定于 Teredo 主机的中继发送对通信初始化数据包进行响应的消息。

受限NAT
图20 显示了当 Teredo 客户端位于受限 NAT 之后时 特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化。

图20: Teredo 客户端位于受限 NAT 之后时,特定于 Teredo 主机的中继到 Teredo 客户端的通信初始化。

从特定于 Teredo 主机的中继发送通信初始化数据包到 Teredo 客户端,过程如下:
1.特定于 Teredo 主机的中继通过 IPv4 Internet 络经由 Teredo 服务器发送一个气泡数据包到 Teredo 客户端。
2.Teredo 服务器接收到来自 特定于 Teredo 主机的中继的气泡数据包。 Teredo 服务器把这个数据包发送给 Teredo 客户端,同时,来源指示符包含了 特定于 Teredo 主机的中继的 IPv4 地址和 UDP 端口号。因为一个从 Teredo 服务器来的 Teredo 通信的特定源映射存在于 NAT,气泡数据保被发送给 Teredo 客户端。
3.Teredo 客户端通过收到的气泡数据中的来源指示符来确定特定于 Teredo 主机的中继的 IPv4 地址和 UDP 端口号。为了建立一个从 Teredo 中继的 Teredo 通信的映像, Teredo 客户端发送一个气泡数据包给特定于 Teredo 主机的中继。
4. 根据气泡数据包的收条——与一个进入队列等待转发的数据包(该数据包来自于特定于 Teredo 主机的中继)对应,特定于 Teredo 主机的中继确定一个特定于来源的 NAT 映射现在存在于 Teredo 客户端的受限 NAT 之中。特定于 Teredo 主机的中继发送通信初始化数据包给 Teredo 客户端。
为 确保初始化通信数据包的 IPv6 地址真实,并且指向 特定于 Teredo 主机的中继, Teredo 客户端按照" Teredo 客户端到 特定于 Teredo 主机的中继的通信初始化"(针对受限NAT)的步骤1至6,与 特定于 Teredo 主机的中继执行一个 ICMPv6 Echo Request/Echo Reply的消息交换。当消息交换执行完毕, Teredo 客户端对发送到 Teredo 特定主机服务器的通信初始化数据包进行响应。

Teredo 客户端到 IPv6 主机的消息初始化
Teredo 客户端到 IPv6 主机的消息初始化依赖于 Teredo 客户端是Cone NAT 的,还是受限NAT。

Cone NAT
图21 显示了当 Teredo 客户端位于Cone NAT 之后时, Teredo 客户端与 IPv6 主机的通信初始化过程。

图21: Teredo 客户端位于Cone NAT 之后时, Teredo 客户端与 IPv6 主机的通信初始化过程

Teredo 客户端发送初始化通信数据包到 IPv6 主机,过程如下:
1. 要发送一个通信初始化数据包, Teredo 客户端必须首先验证离 IPv6 主机最近 Teredo 中继的 IPv4 地址和 UDP 端口号。 Teredo 客户端A经由它自己的 Teredo 服务器发送一个 ICMPv6 Echo Request 消息。
2.Teredo 服务器收到 ICMPv6 Echo Request 消息后,在 IPv6 网上把它发送给 IPv6 主机。
3.IPv6 主机发送给 Teredo 客户端的一个 Teredo 地址予以响应。根据 IPv6 的网络路由结构,这个含有 Teredo 地址的数据包被发送给最近的 Teredo 中继。
4.Teredo 中继将 ICMPv6 Echo Reply 压缩,并直接发送给 Teredo 客户端。因为这是Cone NAT 之后的,所以来自 Teredo 中继的数据包被发送到 Teredo 客户端。
5.Teredo 客户端从ICMPv6 Echo Reply消息的 IPv4 源地址和UDP端口号确认 Teredo 中继的 IPv4 地址最接近 IPv6 主机。一个通信初始化数据包就被发送至 Teredo 中继的 IPv4 地址和UDP端口上。
6.Teredo 中继去除 IPv4 和 UDP 的标头,并把此数据包发给 IPv6 主机。
所有接下来的往返于 Teredo 客户端和 IPv6 主机的数据包采用经由 Teredo 中继的路径。

受限 NAT
图22 显示了当 Teredo 客户端位于受限 NAT 之后时,Teredo 客户端到 IPv6 主机通信的初始化。

图22 显示了当 Teredo 客户端位于受限 NAT 之后时, Teredo 客户端到 IPv6 主机通信的初始化。

IPv6 主机发送初始化数据包至 Teredo 客户端,过程如下:
1. 要发送初始化数据包至 IPv6 主机, Teredo 客户端必须首先验证 Teredo 中继的 IPv4 地址是否距离 IPv6 主机最近。 Teredo 客户端 A 通过它自己的 Teredo 服务器发送一个 ICMPv6 Echo Request 消息给 IPv6 主机。
2.Teredo 服务器收到 ICMPv6 Echo Request 消息,并且在 IPv6 网络上发送给 IPv6 主机。
3.IPv6 主机响应一个发送至 Teredo 客户端 A 的 Teredo 地址的 ICMPv6 Echo Reply 消息。根据 IPv6 网络的路由结构,这个以 Teredo 地址打包的数据包被发送至最近的 Teredo 中继。
4.Teredo 中继验证 Teredo 客户端位于受限 NAT 之后。如果 Teredo 中继本应发送 ICMPv6 Echo Request 消息至 Teredo 客户端而没发,NAT将会丢弃它。这是因为不存在一个起始于 Teredo 中继的 Teredo 通道的映射。因此, Teredo 中继在 IPv4 Internet 络上通过 Teredo 服务器发送一个气泡数据包至 Teredo 客户端。
5.Teredo 服务器收到来自 Teredo 中继的气泡数据包。 Teredo 服务器发送气泡数据包之 Teredo 客户端,同时来源指示符获得 Teredo 中继的 IPv4 地址和 UDP 端口号。因为一个起始于 Teredo 服务器的 Teredo 通道的特定源映射存在于 NAT,气泡数据包就被发送至 Teredo 客户端。
6.Teredo 客户端从收到的气泡数据包的来源指示验证 Teredo 中继的 IPv4 地址是不是距离 IPv6 主机最近。为了建立一个起始于 Teredo 中继的 Teredo 通道的特定于来源的映射, Teredo 客户端发送一个气泡数据包至 Teredo 中继。
7. 根据气泡数据包已符合等待发送的接收回执(ICMPv6 Echo Reply消息), Teredo 中继确认 Teredo 客户端的受限 NAT 现在存在一个特定源的映射。 Teredo 中继发送 ICMPv6 Echo Reply 消息至 Teredo 客户端。
8.从 Teredo 客户端发送一个通信初始化数据包至 Teredo 中继的 IPv4 地址和UDP端口。
9.Teredo 中继移除 IPv4 标头并发送此数据包至 IPv6 主机。
所有接下来的往返于 Teredo 客户端和 IPv6 主机之间的数据包都采用经由 Teredo 中继的路径。

IPv6 主机到 Teredo 客户端的通信初始化。
IPv6 主机到 Teredo 客户端的通信初始化依赖于 Teredo 客户端是基于Cone NAT 的,还是受限NAT的。

Cone NAT
图23显示了当客户端位于Cone NAT 之后时, IPv6 主机到 Teredo 客户端的通信初始化。

图23:客户端位于 Cone NAT 之后时,IPv6 主机到 Teredo 客户端的通信初始化

从 IPv6 主机发送初始化数据包至 Teredo 客户端,过程如下:
1.IPv6 主机发送一个数据包至 Teredo 客户端。根据 IPv6 网络的结构,以 Teredo 地址打包的数据包被发至最近的 Teredo 中继。
2.Teredo 中继验证 Teredo 客户端是位于受限 NAT 之后。因此, Teredo 中继就将数据包与 IPv4 和 UDP 的标志压缩在一起,从 IPv6 主机发送到 Teredo 客户端。
根 据这个数据包的接收回执,Teredo 客户端,储存对应于 Teredo 中继的 IPv4 地址和 UDP 端口号,这样,响应数据包才能被发送给 Teredo 中继。 Teredo 中继接收到它们,除去 IPv4 和 UDP 标志后,发送该 IPv6 数据包到 IPv6 主机。
为 确保这个通信初始化数据包的 IPv6 地址真实有效,并且对应 IPv6 主机, Teredo 客户端按照本文关于" Teredo 客户端到 IPv6 主机通信初始化"(针对Cone NAT )的1-4步骤,与 IPv6 主机执行一次ICMPv6 Echo Request/Echo Reply消息交换。当消息交换执行完成后, Teredo 客户端送到 IPv6 主机的通信初始化数据包进行响应。

受限 NAT
图24 表明当 Teredo 客户端位于受限 NAT之后, IPv6 主机到 Teredo 客户端的通信初始化。

图24: Teredo 客户端位于受限NAT之后时, IPv6 主机到 Teredo 客户端的通信初始化

从 IPv6 主机发送通信初始化数据包至 Teredo 客户端,进程如下:
1.IPv6 主机发送一个数据包至 Teredo 客户端。根据 IPv6 网络的结构,以 Teredo 地址打包的数据包被发至最近的 Teredo 中继。
2.Teredo 中继验证 Teredo 客户端位于受限 NAT之后。如果 Teredo 中继本应发送这个数据包至 Teredo 客户端而没有发,NAT将会丢弃这个数据包,因为不存在一个起始于 Teredo 中继的 Teredo 通道的特定于来源的映射。因此, Teredo 中继在 IPv4 Internet 上,将气泡数据包通过 Teredo 服务器发送到 Teredo 客户端。
3.Teredo 服务器收到来自 Teredo 中继的气泡数据包。 Teredo 服务器将带有来源指示的气泡数据包发送至 Teredo 客户端,这个来源指示包含有 Teredo 中继的 IPv4 地址和UDP端口号。因为一个起始于 Teredo 服务器的 Teredo 通道的特定于来源的映射已存在于 NAT 中,这个气泡数据包被发送至 Teredo 客户端。
4.Teredo 客户端从接收的气泡数据包的来源指示验证 Teredo 中继的 IPv4 地址是不是最离 IPv6 主机最近。
5.根据收到气泡数据包已等待发送的回执(此数据包来自 IPv6 主机), Teredo 中继确认在客户端的受限NAT中建立了一个特定于来源的通道映射。 Teredo 中继向 Teredo 客户端发送数据包。
为根据收到气泡数据包已等待发送的回执(此数据包来自 IPv6 主机), Teredo 中继确认在客户端的受限 NAT 中建立了一个特定于来源的通道映射。 Teredo 中继发送数据包给 Teredo 客户端。

总结
   Teredo 是一种地址分配和主机间自动隧道技术,当 IPv6 / IPv4 主机均位于一个或多个 IPv4 NAT 之后时,它可以帮助用户建立IPv6 单播连接。IPv6 数据包以基于 IPv4 的 UDP 消息发送。 Teredo 通信依托于 Teredo 服务器和 Teredo 中继。一个 特定于 Teredo 主机的中继相当于一个没有使用 Teredo 地址的 IPv6 或是 IPv4 ,但是能够在通信路径上不使用 Teredo 中继的情况下与 Teredo 用户进行通信。本文对获得 Teredo 地址,维持 NAT 映射以及在两个 Teredo 客户端、两个特定于 Teredo 主机的中继、和两个 IPv6 主机之间进行通信的初始化流程都做了详尽的说明。不管是基于Cone NAT 还是受限NAT,任何初始化通信过程都基于 Teredo 客户端。

from  http://www.ipv6bbs.cn/thread-144-1-1.html