电脑技术学习

IPv6/IPv4协议转换的试验

dn001

  在IPv6和IPv4协议之间进行转换,并使之能够在同一网络协同工作的应用试验中,最大的考虑,并不是针对那些已经拥有了IPv6/IPv4双模机制的新产品,而是继续使用那些有了些年头的网络核心设备。

编者按:从IPv4向IPv6迁移,已不再是什么热点话题、也不是什么新技术讨论。在经过多年预备之后,当前的网络主体产品都具备了IPv4/IPv6双模。

但另一方面,有关如何在现实网络中部署IPv6的话题,仍然困扰着整个业界,除偶然尚不完备的商业部署之外,更多的试验性合作仍然在继续。

好的消息正在传来,例如美国的网络服务提供商MCI公司,已经着手向其第一批商业客户提供基于IPv6的服务及应用,尽管这些IPv6业务还不能够被视做真正意义上的“全面的IPv6”。再例如,除了早前中、日、韩三国在IPv6、下一代Internet试验网上的高调合作,2005年5月18日的另一项合作备忘录的签署,也不应被忽视,这就是中国信息产业部王旭东部长和法国工业部部长帕特里克·戴维江(Patrick Devedjan)签署的关于IPv6合作的谅解备忘录,中法两国将合作推进新一代互联网的应用与服务产业化。

既然涉及到产业化进程,就应当将IPv6的技术本身与实际应用结合起来。可以看到,大量现实中的网络核心设备,在走向IPv6的进程上已经成为难点所在。

要害的一点是,不要指望现在就遗弃IPv4,而应当使IPv6和IPv4共存。

现行的IPv4网络协议仍然不能充分支持新添节点或者新应用的要求,IPv6 是一个全新的协议,显著特性包括: 增强地址的可扩展性和路由功能,提升安全性,易于配置,和相对于IPv4的高性能。

不幸的是,IPv4和IPv6并不兼容,因此以此一标准设计的程序和系统,无法和另一标准的系统通信。而IPv4系统普遍存在,并且也不会在一夜之间被蜂拥而至的IPv6取代。因此,设计一个平滑过渡的机制,让应用在网络升级的过程中继续工作,是十分必要的。

对于协议上地址转换,有两种方式:

第一种地址转换是,使用非凡IPv6地址,能简单地将所有应用的数据包进行转换。不幸的是,这种非凡IPv6地址,要求IPv6路由器能为此而包含非凡的路由信息,因此被认为不是一个很好的主意:路由器已被要求维护太多额外的状态信息了。

第二种地址转换,维护一个IPv4和IPv6地址之间的清楚映射图,因此能够使用标准的IPv6 地址,而不需要任何非凡的IPv6路由器处理。这样处理的缺点是,假如IP地址内嵌在一些应用数据流中,比如FTP, 在升级的时候,也必须进行完全透明的转换。

我们在试验中设计了一个IPv6/IPv4网络地址和协议中继器,作为设备驱动运行在Windows NT 操作系统中。我们的测试环境由一个中继器作为网关,帮助IPv6和IPv4主机连接到相互隔离的两个以太网中,这样可以使网络的性能损失很少。我们测量后的数据是,一对IPv6节点和IPv4 节点之间通过中继器通信,在100Mbps以太网环境下,TCP带宽为7210Kbps,往返数据包间隔424微秒。

我们最初在SPIN的扩展操作系统上实现IPv6协议,这样能够使用系统内核扩展部分的快速原型。用这种方法实现基本的IPv6后,我们把自己的系统连到了6Bone网络(编者注:IPv6的主干网)。我们对使用IPv6服务的访问感爱好,但是很快发现,只有很少的主机能通过6Bone网络访问,更别说使用IPv6多种常用的服务了。因此,我们决定设计一个IPv6/IPv4中继器,使IPv6系统和IPv4 系统能够互相访问,并享受对方提供的服务。

两种转换

地址转换

通常来说,IPv6/ IPv4的网络地址转换有两种情形:一是IPv6站点和IPv4节点通信: 例如,一个由支持IPv6的新设备组成的新网络,有时候需要和一些外部网络的IPv4节点通信; 二是IPv4站点和IPv6节点通信: 例如,诸如网页、文件和打印服务等重要服务,要能同时被IPv6和IPv4节点访问,需要逐个将IPv4站点升级成IPv6。

图1和图2大致上可以反映出这两种转换情况。

IPv6/IPv4协议转换的试验



图1 IPv6站点的中继器

图1中中继器用于一个IPv6站点和IPv4网络内节点通信的情况。IPv6 站点的内部路由必须配置,使得供IPv4节点使用的数据包,能够路由到中继器。IPv6站内主机,使用能映射到纯粹IPv4 主机的IPv6地址,发送数据包到IPv4 网络中的节点。这一设计中,和纯粹IPv4节点的通信时,IPv6节点使用一个IPv4兼容的IPv6地址(IPv4-compatible IPv6地址)作为自己的地址,而给IPv4分配一个映射IPv4的IPv6地址(IPv4-mapped IPv6)。IPv4-兼容的 IPv6地址将IPv4地址作为低32位,并且能识别IPv6/IPv4兼容地址或者纯粹IPv6节点,但它无法识别纯粹的IPv4节点。同样,映射IPv4的IPv6地址也只能识别纯粹的IPv4节点。这种方法的结果是,中继器不需要保存额外的状态信息,不管IPv4和IPv6域地址映射所用的IPv6的前缀如何,只识别IPv6站点内含惟一IPv4 地址的主机。因此,图1中主机B和主机A通信需要IPv4地址,以便能够通过IPv4网络路由。为了克服这个限制,内含状态信息的中继器将几个IPv6主机映射到一个全球惟一的IPv4地址上,这需要使用TCP/UDP端口的转换技术。


IPv6/IPv4协议转换的试验


图2 IPv4站点的中继器

图2的中继器用于IPv4站点与IPv6网络内节点的通信。IPv4站点内主机发送数据到IPv6网络内的节点,使用中继器指派的IPv4目标地址,映射到独立的 IPv6主机。为了让带有一个目标IPv4地址的数据包能正常抵达目标,IPv4站点的内部路由必须包含到达中继器的路由信息。中继器接到这些数据包后,进行IPv4-to-IPv6转换,并转发数据包到IPv6网络。这一模式中,中继器能使用惟一的IPv6地址访问IPv4站点内的节点,从而为来自IPv6 网络的数据包进行IPv6-to-IPv4转换。这些IPv6地址可能来自和IPv6 主机通信的IPv4 主机里面动态分配的地址池。一个更好的方法是,分配惟一的、可路由的IPv6地址,以便访问IPv4站点内的所有节点,并且在DNS中注册。这样可能很轻易使得IPv6 地址有足够多的空余,而且还有一个好处是,IPv6网络内主机能很轻易解析、并通过中继器和IPv4站点内的节点建立会话。

总之,这两种模式之间的微妙区别在于,前者映射一个全局IPv4地址池访问IPv6地址,而后者使用私有IPv4地址访问IPv6地址。全局IPv4地址是稀缺的,这种机制要求为IPv6节点动态分配IPv4地址池,以便IPv6节点能够和IPv4节点通信。

为了能在IPv4和IPv6节点之间通信,中继器需要同时进行地址和协议转换。协议转换将大多数域从一个IP协议版本转换到另外一个版本。地址转换需要跨越协议边界,将数据包中的地址进行转换。(更为具体的地址转换探讨,读者可参照第D6版的链接。)

协议转换

协议转换就是利用一些非凡的规则处理数据分段和路径MTU发现问题(path MTU discovery),从而完成两种IP协议间的简单映射。基本的操作是移除原始的IP数据包头,并用另一个IP协议的新数据包头替代。

首先需要讨论的是IP 转换。IPv6和IPv4数据包头有一些类似,但是大多数域要么意义不一,要么长度各异,也有的被移除了。中继器需要在IP 数据包头中,进行直接复制、转换、忽略、或者用缺省值来设置新的域,以便从一个IP协议版本转换成另外一个。

许多域需要简单的调整。做IPv6-to-IPv4转换的时候,IPv4的域需要通过计算得到,而在IPv4-to-IPv6的转换时候,则需要进行忽略处理。和IPv4对比,IPv6数据包头没有明确的域支持数据分段处理,而使用一个独立的数据包头作为数据段,保存信息。

当中继器接受一个数据包时,IPv4和IPv6的域之间有直接的映射关系,可以直接进行转换。需要当心的是,两种协议的识别域长度不一样。

数据包从IPv4转换到IPv6,长度会增加,根据两个协议之间的数据包头长度不同而变。

其次是ICMP 转换。当ICMP信息中有未知的域,中继器将默认简化ICMP的信息。为了保持ICMP信息,数据包头中ICMPv4 和 ICMPv6的格式基本相同。惟一例外的是,ICMP的参数问题信息在ICMPv4中是8位指针值,而在ICMPv6中是32位指针值。

ICMP错误信息尽可能地包含IP 数据包头和相应的数据,是属于引起错误的那种数据包,并且需要像普通IP 数据包头一样传输,以便传递这些信息。这样,需要递归转换包含在ICMP错误信息中的IP 数据包。需要注重的是,IP数据包头的转换可能改变数据段的长度。

实际测试过程

这个部分,我们探讨基本性能衡量标准,并介绍一些我们所使用过的应用,验证中继器是否真正起作用。我们的实验环境是,IPv6和IPv4机器在相互隔离的私有以太网中互连。中继器配备了两个以太网网卡,作为IPv6和IPv4两个以太网之间的网关。我们使用Linux和 Windows NT 4.0作为我们测试IPv6的机器。Windows NT上,我们使用Microsoft Research公开发布的IPv6协议栈。中继器被当做一个Windows NT 设备驱动,Windows NT上的中继器使用IPv4和IPv6协议栈发送IP数据包。

为了评估中继器的性能,我们使用工具来测量带宽,并用ping测量一对IPv6和IPv4主机之间的通信延迟,使用NT内建的IPv4转发功能,对比IPv6/IPv4 中继器进行数据包转发的性能,结果显示:

IPv6/IPv4协议转换的试验
在100Mbps网络上,我们测量了64字节到1440字节的ping数据包的往返延迟。表1中,v4-v4和v6-v6列,显示了使用相同协议的两个机器之间的通信延迟。FWD和NAPT列,分别显示了通过NT转发和我们的中继器进行通信的往返延迟。中继器比转发器平均慢了30微秒。

IPv6/IPv4协议转换的试验


表2则显示了在10M和100M以太网上,使用TCP发送64 MB的带宽。需要注重的是,10M以太网中,中继器和转发器对带宽没什么显著影响。但是在快速网络(100M以太网)中,转发器和中继器的带宽明显低于IPv4或IPv6内部的直接通信。使用NT性能检测软件,我们注重到,在快速以太网运行ttcp带宽标准检测时,转发器/中继器中处理器的利用率几乎接近100%。这是由NT的数据包接受体系架构引起的,这种设计结构假设设备驱动拥有数据包缓冲,不会把缓冲的权限给接收数据包的模块(在大多数UNIX系统中,正是如此)。报告结果,我们认为,使用中继器和转发器的带宽受到CPU的限制,明显地受到了NT数据包接受体系架构的影响;必须分配缓冲空间容纳IP数据包的有效负载,并在转发前,复制完整的数据。另外需要注重的是,使用中继器的带宽,比转发器少了10%。我们断定,性能损失部分是因为Microsoft Research的IPv6原型不够好,这种原型比Windows NT携带的产品化IPv4协议栈慢了1.9Mbps。我们估计Windows NT IPv6的实现比较成熟时,端到端的TCP带宽供给会有所改善。

我们对目前的延迟和带宽测量结果比较满足,因为所进行的转换不一定会对性能产生明显的影响。

设计中继器的目的,是为了“真实世界”的应用能够透明工作,我们使用了比较有代表性的一套程序,试验TCP、UDP和ICMP协议通过中继器工作的情况。测试的应用包括IPv6版本的Apache网页服务器、ttcp、finger、telnet、ping、traceroute和ftp等。

实验中发现,TCP协议转换工作得很好,但是我们还想验证普通的TCP应用。我们用telnet和finger,通过中继器在IPv6和IPv4主机之间建立连接。另外,IPv4主机上的网页浏览器从IPv6的Apache网页服务器接收文档,也相当成功。ping程序使用ICMP信息,判定特定主机是否联网。我们也用ping测量主机之间的基本往返延迟。

我们还测试了ftp,这个应用内含了一个ASCII码IP地址,并发送给接收者。为了使ftp能通过中继器正常工作,ftp客户端在支持IPv6的时候,需要侦测连接的ftp服务器,是IPv6还是IPv4。当和IPv4的ftp服务器通信时,需要将主机与IPv4兼容的IPv6地址当做ASCII的IP地址,而不是主机原来的IPv6地址。相反,当IPv4的ftp客户端访问IPv6的ftp服务器时,服务器要将ASCII码IP地址看做IPv4映射的IPv6 地址。这样,中继器就没有必要更新ASCII码IP地址。

测试遗留问题

为了真实的应用而做两种IP协议间转换,是可能的。我们还应看到一些未解决的问题:信息丢失、包含IP地址内容的应用,以及如何将IPv6主机转换成能够访问IPv4主机的IPv6地址 (例如,IP6NODE4地址) 和 反向转换(例如,IP4NODE6地址)等。

信息丢失

尽管两个IP协议的基本映射已经完成,但是有些域、选项和扩展仍然不能被顺利转换,结果导致信息丢失,从而影响一些应用。一个例子是,IPv6扩展数据包头的使用。这些数据包头可以是任意长度,并且可能封装的选项要比IPv4的40字节限制要大。而且,IPv6规范中定义特性的扩展,例如认证、封装和扩展路由,都是IPv4所没有的特性。因此,不可能完全透明地进行数据包头转换而不丢失信息。我们目前的方法是,转换过程中忽略所有这些特性,并观察对应用的影响。因此,我们在实验中,应用一般依靠于基本的IP特性,而不使用IP数据包头中扩展的域。

内含IP地址内容的应用

一些应用在数据包的有效负载的第三层,内含自己的IP地址,比如FTP程序和Windows 95/Windows NT的WINS注册进程。除非中继器解析所有这些应用的全部数据包,否则没有办法转换内含的IP地址,进而导致应用失败。我们实现的时候,没有做任何应用层次的IP地址转换,这对于使用能识别IPv4的IPv6新应用不会成问题,例如FTP。我们希望同样的解决方法能用于IPv6版本的所有内含IP地址应用。不过这也不可能,中继器需要在应用层次实现网关,扩展所支持的应用。

主机名解析

在一个主机和另外一个主机建立会话时,需要解析对方的地址。一般情况下, 使用主机表或者DNS。使用中继器时,解析需要为一个地址别名找到真实的主机。这种情况下,中继器使IPv4站点内的节点能够和IPv6网络内的节点通信。假设每个IPv4节点分配了一个惟一的IPv6地址是合理的。那么,任一IPv6节点都能解析自己的地址,并建立一个会话。然而反过来,IPv4解析一个IPv6主机的时候,就非常困难了,因为IPv4节点需要获得从中继器地址别名,而这个从中继器应该能够访问IPv6。

有多种方法能将IPv6的DNS记录转换成IPv4的DNS记录。第一种方法是,有满足的IPv6 DNS记录时,修改IPv4节点的解析方法,从中继器请求别名解析。第二种方法是,当有满足的IPv6 DNS记录时,修改站点的DNS服务器,从中继器请求一个临时的地址,代表它的IPv4客户端。最后还有一个方法,建议中继器识别DNS请求和回应数据包,并透明地传输这些数据。

整合的方法

在网络中使用中继器的实验表明,完全透明地完成IPv6/IPv4转换,需要不同程度地整合其他服务。正如前面所提到的,DNS和中继器之间的一些层次的协作是必要的,可以将IPv4地址绑定到一个IPv6地址上,反之亦然。我们的策略是,将中继器的功能直接整合到IPv6/IPv4主机的操作系统中。这种整合的好处:一是失败隔离: 整合的中继器只为主机服务,失败后,也不会影响其他主机; 二是可升级性: 整合的中继器只需要适应运行在本机上的那么多网络应用,而不用适应网络中独立的中继器在站点内所提供的大量网络应用; 三是安全的地址绑定解除: 一个应用终止TCP/UDP 网络连接时,整合的中继器能够识别出来,并能安全解除地址绑定; 四是更值得注重的: 当在离开机器前被填充了原先IPv4应用的数据包传输到IPv6时,这种整合方法会产生一个假象,似乎是一个纯粹IPv6节点发出的。

其他机制可用性

原则上,IPv6/IPv4地址转换的功能和IPv4网络地址中继器(NAT)类似, NAT 将私有内部地址转换成全球惟一地址,传送到骨干网,反之亦然。IPv4的NAT有如下限制:首先,需要保留状态信息,在全球惟一地址和私有内部地址之间建立映射,这样NAT是一个单点故障;其次,内含IP地址内容的应用需要非凡的转换,这是很困难的(比如,更新ASCII码IP字符串,传输过程中维护TCP序列号),或者根本不可能,因为应用数据流可能被加密或做了标记。任何保留状态信息的中继器都有这样的限制。然而,尽管有这些限制, NAT还是被广泛使用。

我们推荐的“网络地址转换-协议转换”,描述了一个保留状态的IPv6/IPv4中继器设计。这个设计解决了如何合并IPv4中NAT风格的UDP/TCP端口号转换,而端口号的转换和我们设计中状态内容的转换类似。

另一种机制是“无状态IP/ICMP转换”,这一机制避免了地址转换的需要,因此克服了IPv4 NAT的限制。首先,不用维护状态,不会受到网络失败的反复干扰。而且, 更多的无状态中继器可以用于更大的站点。其次,使用与IPv4映射和IPv4兼容的地址,答应避免转换内嵌在应用数据流中的IP 地址。然而,只有在IPv6套接字API能够正确把映射/兼容的地址当做IPv4 地址时,这个方法才能正常工作。

IPv6/IPv4网络地址和协议中继器的设计和实现,简单对比了“有状态”和“无状态”两种转换。目前有三种建议,符合IETF NGTRANS 工作组的要求,支持IPv6和纯粹IPv4节点之间的互操作。我们的试验中,尽管转换有限制(例如,信息丢失),但我们相信,中继器既然支持网络传输的主要功能(HTTP、FTP),那么足够扮演短期的过渡辅助角色,辅助完成IPv4到IPv6的过渡。

基于我们的实验,我们可以得出结论,IPv6/IPv4网络地址和协议中继器是AIIH方法的补充,有助于完成IPv4到IPv6的过渡。非凡是,我们相信,这对开发者来说,是一个有价值的工具,可以将应用从IPv4移植到IPv6。举例来说,一个被移植到IPv6的服务器应用,不用移植客户端,就可以直接进行测试。

链接:IPv4/ IPv6的地址转换细节

使用IPv4映射和IPv4兼容的IPv6地址进行地址转换,过程相当繁琐。IPv6转换到IPv4时,中继器简单抽取IPv6 地址的低32位,就可以获得IPv4地址。相反, IPv4转换到IPv6时,中继器将IPv6源/目标地址的低32位设置成IPv4源/目标地址,高96位分别设置成IPv4映射和IPv4兼容的前缀。然而,这并不是一个好主意,使用IPv4映射地址的一个缺点是,需要IPv6路由器包含IPv4映射地址所需要的路由信息。一个比较好的选择是,使用IPv6-only地址访问IPv4节点,不过这需要中继器维护清楚的IPv4和IPv6地址间的映射关系。

为了清楚说明情况,我们介绍一个IPxNODEy的符号来表示转换过程中所使用的地址类型。表1定义了四种地址。前两行定了IPv4 和 IPv6 节点内部访问的地址,后两行定了交叉访问的地址,由中继器负责分配,用于IPv4 和 IPv6地址范围内的相互转换。

IPv6/IPv4协议转换的试验


例如,使用IPxNODEy方法来描述下面的场景:一个IPv6-only主机希望和IPv4-only网页服务器通过中继器通信。这种情况下,IPv6主机需要一个交叉地址IP6 NODE 4,访问带IP4 NODE 4地址的IPv4网页服务器。同样,网页服务器回应IPv6主机时,需要IP4 NODE 6地址访问带IP6 NODE 6地址的IPv6主机。这样,中继器需要映射IP6 NODE 4地址到网页服务器的IP4 NODE 4地址,并且映射IP4 NODE 6地址到IPv6主机IP6 NODE 6 地址。

地址转换有三个阶段:地址绑定、地址解析和转换、地址解除绑定。

● 地址绑定 地址绑定的阶段,IPv4地址和IPv6地址建立对应关系。中继器维护表2中的IPv4 和 IPv6 地址的映射拓扑关系值(key-to-value)。

IPv6/IPv4协议转换的试验


中继器初始化的时候,进行地址静态映射,就完成了地址绑定。假如中继器配制成使用IPv4 映射或兼容的IPv6地址,那么所有绑定都默认是静态的。其他的静态映射会是纯粹的IPv4和IPv6地址之间。例如,IPv4节点到IPv6节点的地址绑定,可以由网络治理员给现存的IPv4站点内节点分配IPv6地址。这样, IP6 NODE4-to-IP4 NODE4就是给IPv4主机静态映射了一个IPv6地址。否则,地址就需要动态绑定了。

IPv6地址范围要比IPv4地址大得多,不可能为所有的地址建立一对一的IP4 NODE6-to-IP6 NODE 6绑定。因此,有必要复用IP4 NODE 6地址,来绑定多个 IP6 NODE 6地址。

● 地址解析和转换 一旦地址绑定完成,就可被用于地址解析和转换。IPv4节点发送数据包到IPv6节点,通过中继器路由。中继器接受到数据包,用IP4 NODE4-to-IP6 NODE4映射,并且用IP4 NODE 6-to-IP6 NODE 6映射。同样的,IP数据包返回的时候,通过相反的地址转换完成。注重的是,这不需要主机或路由器做改动。

● 地址解除绑定 地址解除绑定的阶段,IPv4和IPv6地址之间的对应关系被取消。我们期望中继器在日复一日的操作之后,能够维持IP6 NODE 4-to-IP4 NODE 4映射所绑定的数量不变;只有新主机加入站点后,才有必要添加新绑定。

另一方面,IP4 NODE 6-to-IP6 NODE 6映射所绑定的数量更多的是动态分配的,并且依靠于网络中不同主机建立的连接数量。所保留的、供中继器使用的IP4 NODE 6地址数量,限制了用于IP4 NODE 6-to-IP6 NODE 6映射所绑定的地址数量。