在TCP/IP协议集内,与IP直接或间接互操作的协议包括各种应用层协议、链路层协议以及TCP和UDP。本章将探讨如何对这些协议进行修改或者是否必须修改以适应IPV6。
协议的层次
TCP/IP网络技术依靠于层次概念。在每一层,两个实体可以彼此通信,使用相邻下层来封装其数据。应用协议通常从一个节点到另一个节点来定义应用程序彼此通信的方式。来自应用层的数据由传输层协议进行封装,然后再封装在网际层协议内,最后封装在链路层协议中。
要理解IPV6对其他层协议的影响,重要的是要理解这些协议如何使用IP。由于如此众多的系统要依靠大量的TCP/IP网络技术和应用协议,重要的是对IP的升级不一定要对IP的上层或下层协议进行广泛的升级。因此,除IPV4之外,大多数现有TCP/IP应用、软件和硬件只需要进行少量修改,就可以和IPV6一起工作。
应用层
万维网( WWW )和e-mail是当今使用最广泛的应用。WWW和e-mail客户必须指向Internet 上的服务器才能工作。传统上这些客户能够接受节点的主机名或其IP地址。在使用域名时,可调用域名系统( DNS )来获得与主机名对应的IP地址,然后在传输层和网际层使用。
对于简单的应用,很轻易使其与IPV6一起工作:可以重写软件,使其能接受和正确处理IPV4地址和IPV6地址;或者要求只能按主机名来访问。前一种方法保留了应用直接对节点寻址的能力,但相对而言比较复杂;而后一种方法只是去掉了大多数用户不使用甚至不需要的功能。
但是,考虑到对IPV6提供的安全性、服务质量或其他特性的需要,有些应用希望使用IPV6服务,这样就需要更广泛的更新。
传输层
大多数情况下,IP地址与应用层协议无关,但是与传输层协议却有很大关系。UDP和TCP 的伪头都使用了源IP地址和目的IP地址,而且TCP电路是由源节点和目的节点的IP地址和端口号来定义的。假如要与IPV6互操作,至少要修改UDP和TCP,以适应1 2 8位IPV6地址。这意味着UDP和TCP需要识别IPV6地址,并能正确计算伪头。对于TCP,其实现还必须能够治理基于IPV6地址的电路。
在第一个IPv6 RFC发布之后,出现了一些顾虑,即需要TCPng来补充IPng。目前TCP在处理移动节点时有一点问题:确定TCP电路需要源节点和目的节点的IP地址。假如在TCP交互期间,一方或双方的IP地址有所改变,则电路的标识就会出现问题。移动节点从一个网络地址向另一个网络地址转换时就会出现这种情况,例如,火车或汽车上的节点使用无线网络接入,或连接到网络的节点在夜间为获得更好的费率而改变ISP的情形。
这种问题的产生是由于TCP至少在目前还没有机制能答应在连接中改变IP地址。假如一个节点收到的TCP段中的源IP地址与此TCP电路在建立时协商的地址不同,该节点将认为这个TCP段是属于另一个电路的。这意味着移动IP目前还不能支持激活的TCP电路从一个网络地址向另一个网络地址转换。
TCPng的问题比简单地答应TCP连接支持网络地址转换要复杂许多。问题在于支持这样的地址转换将导致安全性漏洞:攻击者很轻易冒充从一个网络向另一个网络转换的节点,如同授权的节点从一个网络向另一个网络转换一样。解决这样的问题将要求对TCP进行重大的升级,即需要引入机制使节点在其IP地址改变时能向其他节点证实自己。
目前,假如移动IP在TCP连接的中间切换网络,它必须在切换之后重新协商连接。某种意义下,对于支持移动主机的无缝互操作,TCPng是很必要的。
链路层
与上面层相比,诸如以太网和AT M 之类的链路层协议由于IPV6的升级而受到的影响很小。这是由于这些协议只是将上层数据报封装到链路层帧中。但这并不说明IPV6对链路层协议毫无影响。例如,ATM 使用类似点到点电路来跨越网络传送数据,对于需要将IPV6包交付多个节点的服务,ATM 需要格外注重。关于ATM over IP的具体信息参见RFC1680(IPng对AT M 服务的支持)和RFC1932(IP over ATM :一个框架文档)。也可参见IP over ATM 工作组的Internet 草案,其中一些草案涉及Ipv6 over ATM 地址。
可能受IPV6影响的链路层问题还包括路径M T U发现及地址解析协议( ARP ), 这些协议需要修改以支持128位IPV6地址。
IPv6域名系统扩展
Internet应用程序能够很轻易使用,DNS是一个重要因素:它使名字很方便地映射到IP地址。DNS使用分级的名字空间,每一级都有一些服务器帮助将名字映射为地址。主机名可能是诸如
“host.organization.com”的形式,表示主机 host在域organization.com中。假如organization.com 内的节点要查找host,就查询本地DNS服务器,该服务器保持着organization.com中的主机的名字和地址信息,它将简单地查找host,并以host对应的32位IP地址往返答节点的请求。
假如organization.com之外的节点需要host .organization.com的IP地址,它将查询自己的本地DNS服务器,这个本地服务器必须查询保持. com网络域信息的上一级服务器,然后该上级服务器将请求导向organizatio n.com域的DNS服务器,由这个服务器最终响应,将所请求的IP 地址发送给查询者的本地DNS服务器,再由该本地DNS服务器将信息传递给发出请求的节点。
到目前为止一切顺利。但是DNS最初被设计为用于处理32位IPV4地址。RFC1886( 支持IPV6的DNS扩展)描述了为使DNS支持IPV6而进行的必要的修改。此RFC篇幅很短,它扼要陈述了为使DNS适用于IPV6而进行的三处修改:
• 建立新的资源记录类型(称为AAAA记录类型),以将名字映射为128位的IPV6地址。IPV4 资源记录使用A类记录类型。
• 建立新域,即.IP6.int,用于增补IPV6主机地址以支持基于地址的查找,即请求节点想了解IPV6地址对应的域名。IPV4地址也有类似设施,即.in-addr.arpa。
• 必须修改现有的DNS查询,使之不仅能定位或处理IPV4地址,同样也能处理IPV4和IPV6 地址共存的情况。
地址解析协议和邻居发现
IPV6不再执行地址解析协议( ARP )或反向地址解析协议( RARP )。在IPV4中,这些协议用于计算IP地址与本地链路网络地址的关联,换言之,以以太网为例,这些协议将节点的以太网MAC地址链接到IP地址。这些协议的必要性在于,节点要计算出将IP包使用链路层发往同一本地子网的哪一个节点。
ARP简单易行,它可在以太网和任一使用48位MAC地址的网络媒体上执行,也可用于任意长度的MAC地址。在IPV6中没有继续使用ARP有如下原因:首先,ARP依靠于IPV6和使用组播的ICMPv6报文。这意味着,没有必要为使用ARP的每个不同类型网络都重新构造ARP, 任一支持IPV6和组播的节点应该也支持邻居发现。对组播的支持很重要,在链路层更是如此。和广播一样,组播在诸如以太网之类的支持多路同时访问同一媒体的网络上很轻易实现。但是,对于所谓的非广播多址接入( NBMA )网络,例如ATM 和帧中继,组播则很难处理。这些NBMA网络依靠于电路而非包,要求为将接收组播信息的每个节点都建立一条单独的电路,这导致组播更加复杂。但是只要有机制能提供组播功能,这些网络上的节点也能够支持邻居发现,而无需显式建立ARP之类的服务。
RFC1970(IPv6 的邻居发现)中描述了邻居发现机制,它提供了几种不同用途,包括下列方面的支持:
• 路由器发现。即帮助主机来识别本地路由器。
• 前缀发现。节点使用此机制来确定指明链路本地地址的地址前缀以及必须发送给路由器转发的地址前缀。
• 参数发现。此机制帮助节点确定诸如本地链路M T U之类的信息。
• 地址自动配置。用于IPV6节点自动配置。
• 地址解析。替代了ARP和RARP,帮助节点从目的IP地址中确定本地节点(即邻居)的链路层地址。
• 下一跳确定。可用于确定包的下一个目的地,即,可确定包的目的地是否在本地链路上。假如在本地链路,下一跳即是目的地;否则,包需要选路,下一跳即是路由器,邻居发现可用于确定应使用的路由器。
• 邻居不可达检测。邻居发现可帮助节点确定邻居(目的节点或路由器)是否可达。
• 重复地址检测。邻居发现可用于帮助节点确定它想使用的地址在本地链路上是否已被占用。
• 重定向。有时节点选择的转发路由器对于待转发的包而言并非最佳。这种情况下,该转发路由器可以对节点进行重定向,以将包发送给更佳的路由器。例如,节点将发往Internet的包发送给为节点的内联网服务的默认路由器,该内联网路由器可以对节点进行重定向,以将包发送给连接在同一本地链路上的Internet路由器。
邻居发现通过定义非凡的I C M P报文类型来执行,这些报文包括:
• 路由器通告。要求路由器周期性地通告其可用性,以及用于配置的链路和Internet参数。这些通告包含对所使用的网络地址前缀、建议的逐跳极限值及本地MTU的
指示,也包括指明节点应使用的自动配置类型的标志。
• 路由器请求。主机可以请求本地路由器立即发送其路由器通告。路由器必须周期性发送这些通告,但是在收到路由器请求报文时,不必等待下一个预定传送时间到达,而应立即发出通告。
• 邻居通告。节点在收到邻居请求报文的请求或其链路层地址改变时,发出邻居通告报文。
• 邻居请求。节点发送邻居请求报文来请求邻居的链路层地址,以验证它先前所获得并保存在高速缓存中的邻居链路层地址的可达性,或者验证它自己的地址在本地链路上是唯一的。
• 重定向。路由器发送重定向报文以通知主机,对于特定目的地自己不是最佳路由器。路由器通过组播来发送其路由器通告报文,这样同一链路上的节点可以构造自己的可用默认路由器列表。邻居发现也可以用于实现其他目标,包括:
• 链路层地址变化。对同一网络,节点可以有多个接口,假如节点得知自己的链路层地址改变,就可以通过发送几个组播包来将其地址改变通知其他节点。
• 入境负载均衡。应注重,接受大量业务流的节点可能有多个网络接口,使用邻居发现,所有这些接口都可以用一个IP地址来代表。通过让路由器在发送其路由器通告包时省略源链路层地址,可以实现路由器负载均衡。此时,查找该路由器的节点每次想要发送包给该路由器时,都必须执行邻居发现,而该路由器就可以选择接受包的链路层接口来响应此节点。
• 任意点播地址。正如第6章所述,任意点播地址表示单播地址的集合,发送给该任意点播地址的包将交付给这些地址中的任一个。通常任意点播地址用于标识提供同样服务的节点集,即,将包发送给一个任意点播地址的节点并不在意由节点集中的哪一个来响应。因为任意点播地址的多个成员都可能响应对其链路层地址的请求,邻居发现机制要求节点应预计到可能收到多个响应,并能正确地处理。
• 代理通告。假如一个节点不能正确响应邻居发现请求,邻居发现机制答应用另一个节点来代表该节点。例如,一个代理服务器可以代表移动IP节点。