1 前言
随着互联网用户的不断增多以及他们对网络服务要求的不断提高,IPv4固有的一些缺陷使得它已经不能满足这种日渐增长的需要。IPv6正是为解决这个问题而出现的,同时它的新特性为下一代互联网的应用提供了更好的支持。 互联网的普及使IPv4向IPv6的过渡不可能一蹴而就,它需要很长一段时间才能完成。IPv6也不仅仅是对IPv4的简单升级,因为头部特征和配址机制的不同,这两种协议是互不兼容的。因此,IPv4如何渐近、平滑的过渡到IPv6是必须解决的一个问题。 IETF的Ngtrans工作组提出了从IPv4过渡到IPv6的3种主要迁移机制:双协议、协议翻译A、隧道。
2 双协议

图1 双协议(栈)节点的网络分层模型
如图1(a)所示,双协议节点(包括主机和路由器)同时实现了IPv4和IPv6协议,可以和IPv4或IPv6主机建立通信。主机根据目的IP地址来决定采用IPv4还是IPv6协议发送或接收数据包。在理想的网络分层模型中,传输层和网络层是独立的,IP层的改变并不会影响传输层协议的运行,但实际上TCP和UDP协议在校验码计算中都采用包含了源和目的IP地址的伪头部,所以在LINUX、WINDOWS等操作系统的IPv6协议实现中,作为IPv6上层协议的TCP/UDP代码是独立于IPv4上的TCP/UDP而实现的,如图1(b)所示,因此称之为双栈节点更合适。 目前双栈是运行最广泛的迁移机制。不过双栈只允许相同IP版本之间的通信,即IPv4和IPv4之间的通信,或IPv6和IPv6之间的通信。不同版本IP之间的通信需要通过协议翻译来完成。 在IPv4到IPv6的过渡初期,绝大多数终端或路由器都是纯IPv4节点(只实现了IPv4协议栈的节点)或双栈节点,在过渡中期,双栈节点或纯IPv6节点将是主要的通信实体,到过渡后期,所有接入互联网的设备基本上都是纯IPv6节点(只实现了IPv6协议栈的节点)。
3 协议翻译
协议翻译用来将IPv4(IPv6)数据包转换成IPv6(IPv4)数据包,这种转换对上层协议是透明的。利用协议翻译可以在纯IPv6节点和纯IPv4节点之间建立通信,而不需要修改应用软件。但在IPv4数据包转换成IPv6数据包的过程中,由于IPv6头部含有扩展头部以及诸如流标签等新字段而引起的不适当的翻译,可能会导致传输性能的下降。另外,协议翻译如NAT一样会潜在的破坏端到端的服务(比如IPSec)。 Bump-In-the-Stack(BIS)和Bump-In-the-API(BIA)机制可以使IPv4主机上的应用软件和纯IPv6主机进行通信,当应用软件向纯IPv6主机发送数据包时,IPv6地址被映射成一个临时的IPv4地址,然后根据SIIT(Stateless IP/ICMP)将IPv4数据包转换成IPv6数据包。协议转换是一个十分消耗资源的过程,考虑到扩展性的问题,协议翻译器应该处于网络边缘的位置。目前最有名的协议翻译机制是NAT-PT(Network Address Translator-Protocol Translator)。

图2 纯IPv6主机和纯IPv4主机通过NAT-PT通信
NAT-PT为IPv6主机提供临时使用的IPv4地址,并根据SIIT对IPv4数据包和IPv6数据包进行相互转换,从而解决纯IPv6主机和纯IPv4主机之间的通信问题。如图2所示,NAT-PT维护一个IPv4地址池,这些地址供IPv6主机和IPv4主机通信时临时使用。IPv6主机首先通过DNS获得通信对方的IPv6地址,图2中为PREFIX:202.106.185.250,其中PREFIX是NAT-PT所在IPv6域规定的96位前缀。当NAT-PT收到来自IPv6主机的数据包后,根据SIIT将它转换成IPv4数据包,目的地址转换成202.106.185.250,源地址转换成159.226.39.110,该地址取自NAT-PT维护的IPv4地址池。在通信过程中,NAT-PT需要维护IPv6地址(2001:250:f006:1::8)和转换后的IPv4地址(159.226.39.110)之间的映射关系,以便对返回的IPv4数据包进行反向转换。 NAT-PT还可以支持应用层网关的功能,对IPv4或IPv6的DNS请求和应答包以及FTP数据包进行转换。由于IPv4地址的匮乏,NAT广泛运行于目前的IPv4互联网,将NAT升级成NAT-PT,使得IPv4和IPv6网络互连,可以实现IPv4向IPv6的平滑过渡。
4 隧道
被不兼容的网络分离的两个相同版本IP主机之间的通信可以通过隧道方式进行。在过渡前期,IPv4网络占主导地位,IPv6网络好比是整个IPv4汪洋中的孤立岛屿,这些岛屿之间的通信可采用IPv6-over-IPv4隧道来实现。过渡后期,IPv6网站占统治地位,类似地,各个孤立IPv4岛屿之间的通信可采用IPv4-over-IPv6隧道来实现。

图3 IPv6-over-IPv4隧道
隧道的实质就是对数据包的封装,如图3所示,IPv6-over-IPv4(IPv4-over-IPv6)隧道就是将IPv6(IPv4)分组封装在IPv4(IPv6)分组中,利用已有的IPv4(IPv6)网络进行传输,从而解决IPv6(IPv4)站点或主机之间相互通信的问题。由于隧道的端节点需要对IPv6数据包进行封装、对IPv4数据包进行解封装,因此它必须是双栈节点。 在IPv6-over-IPv4数据包的IPv4头部,其协议类型字段取值41,表示这是一个封装了IPv6报文的IPv4数据包。源和目的地址字段分别是隧道首尾端节点的IPv4地址,如果是配置隧道,那么目的IPv4地址是由隧道首节点的配置信息决定的;如果是自动隧道,那么目的IPv4地址通常是目的IPv6地址中嵌套的IPv4地址。 一般情况下,路由器和路由器之间的隧道通常是配置隧道,隧道接口的配置参数即隧道两端的IPv4地址是手工配置的,目前6Bone网络采用的隧道大多是配置隧道,配置隧道的不足之处在于它的建立通常不符合IPv6路由体系是分层、简化的指导思想,因此导致路由效率的低下,而且它的维护和运行都有一定的复杂性。自动隧道不需要手工配置,它的端节点IPv4地址可从数据包的IPv6地址中获得,因此自动隧道的建立和维护相对简单,也更灵活。 针对不同的应用场景,目前提出了多种隧道技术,如6to4、ISATAP、Teredo、6over4、DSTM、Tunnel Broker等。
(1) 6to4 6to4用于连接被IPv4网络分离的各个孤立的IPv6站点,隧道的端点是孤立IPv6站点的出口路由器。

图4 IPv6站点通过6to4隧道通信
6to4隧道协议定义了3种通信实体:6to4主机、6to4路由器、6to4中继路由器。6to4主机指孤立IPv6站点中的纯IPv6主机,6to4路由器指IPv6站点中的出口路由器。6to4主机使用全球地址前缀2002:AABB:CCDD::/48,其中AABB:CCDD是出口路由器的IPv4地址(该地址必须是公有地址)的十六进制表示,它作为全球IPv6地址中的NLA(Next Level Aggregator)ID。完整的6to4地址是2002:AABB:CCDD:SLA (Site Level Aggregator) ID:Interface ID。 以图4为例,6to4主机之间的通信过程如下:站点1的6to4主机在获得站点2的6to4主机地址后向其发送数据包,该数据包被路由至本站点的6to4路由器A,路由器A发现数据包的目的地址含有6to4前缀2002,于是从数据包的IPv6源地址和目的地址中提出隧道两端的IPv4地址(也就是IPv6地址中的NLA部分),然后用IPv4头部封装数据包,封装后的报文其目的地址为站点2的6to4路由器B的IPv4地址,从而建立一条从A到B的隧道。作为隧道端点的路由器B收到数据包后对其进行解封装,去掉IPv4头部,得到一个IPv6数据包,然后发送,直到数据包最后到达站点2的6to4主机。 6to4中继路由器通常位于IPv6主干网,除了具有6to4路由器的功能外,它还负责向IPv6主干网宣告它对其他6to4站点的可达性,同时向其他6to4路由器宣告它对主干网内各站点的可达性。6to4中继路由器用于6to4主机和一般IPv6主机之间的通信,以图4为例,站点1的6to4主机获得主干网上某个IPv6主机的地址后向其发送数据包,该数据包被路由至本站点的6to4路由器A,路由器A通过查找路由表得到下一跳的IPv6地址为中继路由器C的6to4地址,从该地址从提出C的IPv4地址,以此作为目的IPv4地址对数据包封装,建立一条从A到C的隧道。C收到数据包后解封装,得到一个IPv6数据包并发往主干网,直至最终到达目的IPv6主机。 6to4隧道容易管理,所以是目前最重要的自动隧道技术之一。而且它根据IPv4地址自动能产生一个48位的前缀,所以不必向互联网注册机构申请IPv6地址就可运行。与此同时,这种配址方式也导致了对IPv6路由体系层次化的破坏。
(2) ISATAP ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)意为域内自动隧道配址协议,顾名思义,它指某个IPv4域内的双栈主机相互之间可通过该隧道进行通信。

图5 IPv4网络上的双栈主机通过ISATAP隧道通信
如图5所示,双栈主机首先向ISATAP服务器发送路由请求,得到一个64位的IPv6地址前缀,再加上64位的接口标识符::0:5EFE:a.b.c.d,构成一个ISATAP地址,这里的a.b.c.d是双栈主机的IPv4单播地址,该地址可以是公有的,也可以是私有的。双栈主机配置了ISATAP地址后,就成为一个ISATAP客户机,可以和IPv4域内的其他ISATAP客户机进行通信了。通信过程如下:双栈主机1获得双栈主机2的ISATAP地址后向其发送数据包,根据目的地址该数据包被交给ISATAP接口进行发送,ISATAP从数据包的IPv6源地址和目的地址从提出相应的IPv4源和目的地址,并对该数据包用IPv4头部进行封装,封装后数据包的目的地址为双栈主机2的IPv4地址,这样就建立了一条从主机1到主机2的隧道。数据包最后到达主机2,主机2对其解封装,得到一个IPv6数据包。 ISATAP隧道的优点是它不要求隧道端节点必须具有全球唯一的IPv4地址,因此可用于内部私有网中各双栈主机之间进行IPv6通信。和6to4隧道技术相结合,还可以使内部网的双栈主机接入IPv6主干网。
(3) Teredo 位于NAT后的IPv6节点采用一般的隧道技术(IPv6-over-IPv4)是不能和NAT域外的IPv6节点进行通信的,因为目前的NAT一般不支持协议类型为41(也就是IPv6-over-IPv4)的数据包。Teredo隧道有别于一般的IPv6-over-IPv4隧道,确切的讲,它是一种IPv6-over-UDP隧道。数据包通过被封装在UDP载荷中的方式穿过NAT,这是Teredo隧道的基本思想。 Teredo协议定义了4中通信实体: Client、Server、Relay、Host-specific Relay。其中Client指位于NAT域内的双栈主机,Server负责为Client分配Teredo地址,Relay负责转发Client和一般IPv6节点通信时的数据包,Host-specific Relay指不通过Relay可直接和Client进行通信的IPv6主机。这些通信实体都同时支持IPv6/IPv4协议。Teredo还为Client之间的通信进行了优化,可大幅度提高传输性能。 Teredo可使NAT域内的IPv6节点获得全球性的IPv6连接,在因IPv4地址匮乏而广泛运行NAT的地区尤其是在我国,Teredo隧道无疑具有较好的应用前景。但Teredo的运行需要Relay的支持,并且它不支持隧道中间存在Symmetric NAT,Teredo地址采用规定格式的前缀也不符合IPv6路由分等级的思想,这些不足在一定程度上也将影响Teredo的部署。
(4) 6over4 6over4是一种IPv4组播隧道机制,通过将IPv6数据包封装在IPv4中的方式连接互相分离的IPv6主机。6over4主机的IPv6地址由64位的单播地址前缀和规定格式的64位接口标识符::AABB:CCDD组成,其中AABB:CCDD是其IPv4地址a.b.c.d的十六进制表示。6over4将IPv4网络当做具有组播功能的一条链路,通过IPv6组播地址和IPv4组播地址的映射关系实现IPv6协议的邻居发现功能,以此,它要求IPv4网络支持组播功能。实际网络很少支持组播功能,所以6over4极少使用。
(5) DSTM 如果一个双栈主机没有配置IPv4地址,但想和另一个IPv4主机通信的话,可以采用DSTM也就是双栈转换机制来实现。双栈主机首先向DSTM服务器申请得到一个临时的IPv4地址和DSTM边缘路由器的地址,然后IPv4数据包被封装在IPv6载荷中进行传输,所以它是一种IPv4-over-IPv6隧道。在过渡后期,IPv6网络占据主导地位,IPv4网络反过来成为IPv6网路汪洋中孤立的小岛,当IPv6主机想访问IPv4资源的时候,DSTM将发挥作用。
(6) Tunnel Broker Tennel Broker也就是隧道代理相当于一个虚拟的IPv6服务提供商,它通过IPv6-over-IPv4隧道的方式为IPv4网络中的双栈主机提供全球性的IPv6连接。隧道代理通过web方式为用户分配IPv6地址、建立隧道以提供和其他IPv6站点之间的通信。目前已有不少提供隧道代理的网站。隧道代理的特点是灵活、可操作性强,针对不同用户可提供不同的隧道配置。
|