第六版网际协议

  • 格式:pdf
  • 大小:260.54 KB
  • 文档页数:15

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个字节不被计算在内。

每种扩展头都进行了对齐,必要的时候进行了填充。

表3-1列出了基础IPv6协议规范定义的所有扩展头。

每种扩展头将在后续小节中进行讨论。

其他IPv6功能的规范可能定义了一些扩展头。

比如,移动IPv6有自己的扩展头,这些将在《IPv6 Advanced Protocols Implementation》中进行介绍。

3.3.1扩展报头的顺序表3-2给出了在一个IPv6报文中推荐的扩展报头的顺序和数量。

注意这不是一个强制的要求,发送节点应该采用这个推荐,但接收节点不应该假设接收的报文中的扩展头一定满足这个要求。

唯一的例外是逐跳选项头,它必须紧接于基础IPv6报头后面,而且在一个报文中只能出现一次。

推荐中要求所有的扩展头都只能在报文中出现一次,唯独目的选项报头。

目的选项报头可以出现两次——其中一次在路由头之前,另外依次在路由头之后。

出现在路由头之前的目的选项报头将会被路由头中列出的所有路由器进行处理;而出现在路由头之后的目的选项报头则只会被报文的最终目的节点处理。

此外,移动IPv6定义了另外一种目的选项头的位置,它位于路由头和分片头之间。

移动IPv6将在《IPv6 Advanced Protocols Implementation》第5章中介绍。

由于扩展头的顺序只是一个推荐要求,因此任何的IPv6实现应该能够尽力足够多的采用任意顺序的扩展头(甚至每种扩展头都重复出现的情况)。

3.3.2逐跳选项头逐跳选项头需要被所有的中间设备处理,如报文传输路径中的所有路由器,此外报文的源节点和目的节点也需要处理逐跳选项头。

当前处理报头中的下一个报头的值为0时,即表示下一个报头是逐跳选项头。

逐跳选项头被要求必须紧跟在IPv6报头之后。

图3-3给出了逐跳选项头的格式。

下一个报头(Next Header):8位,标识了紧接在逐跳选项头后面的协议号。

扩展头长度(Hdr Ext Len):8位,给出了该扩展头的长度(以8字节为单位,但不包括第一个8字节)。

选项(Option):可变长度,但必须保证逐跳选项头的长度为8字节的倍数。

选项的格式将在第3.3.6节中讨论。

3.3.3目的选项头目的选项头被报文的最终目的节点处理。

但如果目的选项头出现在路由头之前,那么路由头中列出的所有中间节点都需要处理目的选项头。

当前处理报头的下一个报头的值为60时,表示下一个报头为目的选项头。

图3-4给出了目的选项头的格式。

下一个报头(Next Header):8位,标识了紧接在逐跳选项头后面的协议号。

扩展头长度(Hdr Ext Len):8位,给出了该扩展头的长度(以8字节为单位,但不包括第一个8字节)。

选项(Option):可变长度,但必须保证逐跳选项头的长度为8字节的倍数。

选项的格式将在第3.3.6节中讨论。

3.3.4路由头报文源节点可以通过路由头中的源路由来指定报文传输路径上的所有中间节点(称为路由段)。

当前处理报头的下一个报头的值为43时,表示下一个报头为路由头。

图3-5给出了路由头的通常格式:下一个报头(Next Header):8位,标识了紧接在逐跳选项头后面的协议号。

扩展头长度(Hdr Ext Len):8位,给出了该扩展头的长度(以8字节为单位,但不包括第一个8字节)。

路由类型(Routing Type):8位,IPv6有几种路由头。

[RFC2460]定义了类型为0的路由头,后面将讨论。

剩余路由段数(Segments Left):8位,记录了从当前节点到报文最终目的节点还需要经过的中间节点数。

类型相关的数据(Type specific data):根据路由类型的值,含有相关的选项信息。

如果剩余路由段数为0了,网络节点可以忽略一个不能识别的路由头(即不能识别的路由头类型)。

在这种情况下,节点可以继续从不能识别的路由头后面的内容开始处理报文。

另一方面,如果如果剩余路由段数不为0,那么该节点应该丢弃这个报文,并产生一个ICMPv6差错给源节点,错误原因是‘参数问题’。