3第六版网际协议(IPv6)
3.1简介
在基础的工作原理上,IPv6和IPv4是没有什么区别的。但是,在IPv4的运维经验基础上,IPv6引入了一些显著的改进。其中比较重要的就是采用了扩展头。与IPv4选项不同的是,每个扩展头都被类似地认为是一个独立的上层协议,这样可以容纳数量更多,长度更长的选项。
通过扩展头的框架机制,其他类型的选项信息也得到了支持。如报文分片和源路由等。采用了这种扩展性非常好的机制后,基础的IPv6协议报头得到了极大的简化,它只包含了基础运行和操作必须的信息。
IPv6的另一个重要改变是输出IPv6报文的源地址选择。如同在第二章中介绍的一样,IPv6提供了具有各种属性(域范围或者生存期等等)的多种类型的地址。基于目的地址来选择一个合理的源地址不仅仅是为了性能和优化,而是为了保证互操作性和互通性。
在这一章中,我们将详细地讨论与网络层相关的IPv6规范:首先是[RFC2460]的IPv6扩展头,然后是[RFC3484]的缺省地址选择算法。虽然本章主要介绍源地址选择,我们还是讨论目的地址选择算法,因为他们有共同的原理。
在解释了规范之后,我们将给出KAME内核的IPv6实现。这一部分又可以分成两个部分:输入处理(第3.7节至第3.12节)和输出处理(第3.13节)。在输入处理中,我们将讨论KAME实现如何处理IPv6报头和扩展报头,如果处理输入报文中的基于范围的地址;在输出处理中讨论包括扩展头的插入和报文分片等在内的通用输出处理,然后是详细地介绍源地址选择算法。
3.2I Pv6报头格式
任何一种IPv6报文都有固定长度的IPv6报头。IPv6报头有固定的40字节长度,且只包含了分发报文所必需的信息。
图3-1给出了IPv6报头的格式。
版本(Version):4位的版本,IPv6的取值为6。
流量分类(Traffic Class):8位的流量分类。端节点产生各种类型的流量,网络设备基于分类为报文提供区分的转发服务。流量分类在产生报文的节点初始化为0,然后在传输过程中可能被中间的路由器进行修改。[RFC2474]和[RFC3168]详细地定义了流量分类的使用,这超出了本书的范围。
流标签(Flow Lable):20位的流标签,用来区分不同的网络流量。[RFC3697]提供了节点如何处理这个成员的指南:报文源节点标识出报文的流标签,如可以对一种特定的网络应用流量标识一个非0的流标签;如果源节点没有进行流标签的识别和设置,那么这个成员必须要被设置成0。报文在网络中间设备的转发处理过程中,流标签不能被改变。但RFC 并没有详细定义如何使用流标签,仅给出了从网络源节点至目的节点,包括中间的路由器,它们如何建立流的状态。
负载长度(Payload Length):16位的无符号整型,记录了IPv6报头后面的包括了扩展头(如果有的话)和上层协议负载在内的负载长度。
下一个报头(Next Header):8位的下一个报头,标识了紧接在IPv6头后面的上层协议或扩展报文的协议号。
跳数限制(Hop Limit):8位的跳数限制,限制了报文经过中间设备转发的次数。每个转发该报文的路由器将递减这个值,如果这个值被减到了0,报文将被丢弃。
源地址(Source Address):128位的源地址,标识报文的发送源。
目的地址(Destination Address):128位的目的地址,如果存在源路由扩展头(第3.3.4节),那么报文目的地址中可能是中间设备的地址;其他情况下,是报文目的地的地址。
3.2.1与IPv4报头的比较
图3-2给出了IPv6报头和IPv4报头之间的区别,其中阴影部分表示的是IPv4报头中有,而IPv6报头中没有的成员。
因为IPv6报头有40字节固定长度的头部长度,所以IPv6报头中没有了头部长度(IHL)成员。与IPv4不同的是,IPv6没有IP头部选项,而是用IPv6扩展头来实现选项,比如IPv4松源路由选项和记录路由选项就可以用IPv6路由扩展头来实现。因此,IPv6中没有了可变长度的选项。IPv6扩展头将在第3.3节讨论。
IPv4中与报文分片和重组相关的有报文标识(Identification)成员,标志(Flags)成员和分片偏移(Fragment Offset)成员。报文标识成员由报文的发送者设置,使得报文的接收者可以识别出哪些分片是属于同一个报文的;分片偏移成员给出当前分片在原始报文中的位置;标志成员表示了该报文是否允许在转发过程中被分片,以及是否是最后一个分片。在IPv6中,有专门的扩展头来处理分片和重组(参见第3.3.5节),因此IPv6头中也没有了这些相关的成员。
IPv6报头中去掉了头部校验和。其原因是互联网络不断趋向于可靠,趋向与越来越小的错误率。IPv4头部校验和仅仅计算了IPv4报头的校验和,而像TCP和UDP这些上层协议也提供了上层协议报头和负载的校验和,这样看来IP层的校验和不是特别的有必要。去掉了报头检验和,然后引入扩展报头机制,这些使得IPv6的转发效率得到了很大的提高。
IPv4报头中的服务类型(Type of Service)被IPv6报头中的流量分类所代替。协议(Protocol)成员被下一个报头成员代替。生存时间成员被跳数限制成员代替。与IPv4的报文总长成员不同的是,IPv6报头中的负载长度仅包括了负载的长度,而不包括IPv6报头在内。
由此可见,IPv6报头相对于IPv4报头,有更好的效率。总结起来如下:因为IPv6基础报头中不再处理分片和重组,所以去掉了4字节的分片相关成员;因为头部校验和变得不太重要,所以IPv6报头中去掉了2字节的头部校验和。
3.3I Pv6扩展报头
如同第3.2.1节中介绍的一样,IPv6用扩展头的机制来替代了IPv4中的选项。每种扩展头类似上层协议实现一种可选的IPv6协议可选功能。由于路由器并不需要处理扩展头,除非有明确的要求,因此含有端到端选项的IPv6报文的转发处理过程非常高效。另外,扩展头可以比IPv4选项容纳更多更长的扩展内容,这样可以为以后的新的选项需求提供灵活性。
[RFC2460]定义了如下的扩展头:逐跳选项头,路由头,分片头,以及目的选项头。此外,IPsec协议[RFC4302][RFC4303]定义了两种扩展头:认证报头和封装安全有效载荷头。这些扩展头位于基础IPv6报头和上层协议报头之间。通常由一个上层协议来终结扩展头的链。如果报文中没有上层协议头,那么‘无下一个报头’(No Next Header)作为一个假想的头部,用来表示扩展头链的结束。
每种扩展头的长度都是8字节的整数倍(除了认证头是4字节的整数倍)。由于没有哪种扩展头小于8字节,所以在记录扩展头的长度时,前8个字节不被计算在内。每种扩展头都进行了对齐,必要的时候进行了填充。