2.4 扩展报头
IPv6技术精要
理解扩展报头相对较为困难,所以本节将采取步步深入的方式进行介绍。有些扩展报头很简单,而有些扩展报头则比较复杂,因此,即便有些内容理解起来有些含糊,也不必太在意,本节的目的是让大家熟悉扩展报头的概念以及相应的使用方式。
扩展报头是可选项,位于IPv6基本报头之后,如前所述,IPv6报头包含下一报头字段,该字段的作用有两个:
一是标识IPv6包数据部分所承载的协议;
二是指示扩展报头的存在。
在前面已经说过,下一报头字段能够标识IPv6包数据部分所承载的协议,这一点与IPv4报头的协议字段相似(如图2-5所示)。
第二个作用是对IPv6报头的重要补充,用于指示被称为扩展报头的额外报头的存在。在必需的IPv6基本报头之后,可以有0个、1个或多个扩展报头。所有扩展报头中都有的一个字段是另外的下一报头字段,表示接下来还有其他扩展报头,或者是数据(净荷)协议(如TCP报文段)。因此,最后的扩展报头总是指示哪种协议被封装在数据部分(净荷),这一点与IPv4的协议字段相似。
目前在RFC 2460中定义了6种扩展报头(如表2-3所示)。大家可能还记得,在IPv4报头中有一个很少使用的可变长度的选项字段,可以为IPv4提供一定的灵活性,而IPv6也有两个扩展报头提供了类似的功能:逐跳选项(Hop-by-Hop Option)报头和目的选项(Destination Option)报头。图2-7给出了使用这两种报头的IPv6包示例。
IPv6基本报头拥有前面讨论过的全部字段,包括源地址和目的地址字段,IPv6基本报头中的下一报头字段为0则表示后面紧跟的是逐跳选项扩展报头。
逐跳选项扩展报头位于IPv6基本报头之后,有关扩展报头的详细内容将在下一节讨论,这里需要注意的是,该字段也包含自己的下一报头字段,值51表示后面还有其他的扩展报头,即AH(Authentication Header,认证头)扩展报头。
最后的扩展报头就是AH,其下一报头字段值为6,表示后面跟的是TCP上层协议报头,也就意味着本数据包没有其他的扩展报头了。
注:
下一报头字段的作用是将多个IPv6报头链接在一起,链条的末尾是IPv6包的数据部分。
RFC 2460建议同一个数据包使用多个扩展报头时,这些扩展报头的出现顺序如下:
1.IPv6基本报头;
2.逐跳选项报头;
3.目的选项报头;
4.路由报头;
5.分段报头;
6.AH报头;
7.ESP报头;
8.目的选项报头;
9.上层协议报头。
2.4.1 逐跳选项扩展报头
逐跳选项报头用于承载选项信息,并且数据包传送路径上每台路由器都必须处理这些信息。逐跳选项报头是与IPv4选项字段类似的包含可变长度选项字段的两个扩展报头之一,顾名思义,逐跳选项报头是一种要求传送路径上每台路由器都必须处理的扩展报头。
注:
目的选项报头是另一种使用选项的扩展报头,顾名思义,该扩展报头包含的信息只传递给目的端,本节将在最后详细讨论目的选项报头。
下面就来分析一下选项的使用。选项为IPv6包提供了很好的灵活性,可以通过扩展报头标准组中未定义的一组值对IPv6包进行补充定义,这组值也被称为TLV(Type-Length-Value,类型-长度-值)三元组。目前已经定义了两种使用选项的扩展报头:逐跳选项报头和路由选项报头。如图2-8所示,这两类扩展报头都有下一报头字段和报头扩展长度字段,然后是一个或多个选项组,每个选项都包含一组选项类型(Option Type)字段、选项长度(Option Length)字段和选项数据(Option Data)字段(即TLV)。
图2-9显示了包含巨包净荷选项(Jumbo Payload Option)的逐跳选项报头格式。巨包净荷选项用于表示该IPv6包大于65 535字节。由于这是逐跳选项,因而路径上的所有路由器都必须检查该信息。
下面列出了与逐跳选项扩展报头相关的字段信息。
IPv6基本报头:下一报头(Next Header,8比特):除了IPv6基本报头的其他信息之外,还有一个值为0的下一报头字段,表明基本报头后面有一个逐跳选项扩展报头。
逐跳选项扩展报头。
下一报头(Next Header,8比特):下一报头字段值为6,表明该报头后面是TCP报头,没有其他扩展报头。
报头扩展长度(Header Extension Length,8比特):表示以八位组为单位的逐跳选项报头的长度,不包含第一个八位组。可以有多个选项,每个选项都包含一个TLV(选项类型、选项长度和选项数据字段)。
选项类型(Option Type,8比特):表示该报头所承载的选项类型,十六进制值C2表明这是一个巨包净荷选项。
选项长度(Option Length,8比特):表示选项数据字段中的字节数,值4表示选项数据长度为4字节(32比特)。
选项数据(可变长度):本例中的数据是巨包净荷长度。巨包净荷长度是一个32比特字段,表示以字节为单位的IPv6包大小,不包括IPv6报头,但包括逐跳选项扩展报头以及其他扩展报头。巨包净荷长度必须大于65 535字节,最大可以达到4 294 967 295字节。
TCP报文段:由于只有一个选项且没有其他扩展报头,因而后面跟着的是TCP报文段,从前面的逐跳选项扩展报头中下一报头值为6即可看出。
如果使用了逐跳选项扩展报头,那么该报头必须紧跟在IPv6基本报头之后。
2.4.2 路由扩展报头
路由扩展报头允许数据包源端指定去往目的端的路径,该报头包含去往数据包目的端路径上的一台或多台中间路由器,该功能与IPv4使用的松散源路由选项非常类似,路由扩展报头由前一个报头中的下一报头值43来标识。
图2-10显示了路由类型为2(在IPv6中支持移动性)的路由扩展报头结构。该扩展报头允许将数据包从通信端直接路由到移动节点的转交地址(Care-of Address),扩展报头提供了移动节点的当前位置信息。
下面列出了与路由扩展报头相关的字段信息。
下一报头(Next Header,8比特):表示路由扩展报头后面下一个报头的类型,要么是其他的扩展报头,要么是净荷协议。
报头扩展长度(Header Extension Length,8比特):表示以八位组为单位的路由报头的长度,不包含第一个八位组。
路由类型(Routing Type,8比特):值为2。
剩余段(Segments Left,8比特):值为1。
保留(Reserved,32比特):该字段被保留,传输时被初始化为0,并且被接收端忽略。
家乡地址(Home Address,128比特):表示目的端移动节点的家乡地址。
注:
有关路由器如何处理路由扩展报头的内容超出了本书范围,如果感兴趣,可以参考RFC 2460或Cisco Press出版的Cisco Self-Study: Implementing Cisco IPv6 Networks”。许多ISP对源节点在数据包的下一跳选择问题上持怀疑态度,通常都会根据管理需要阻塞包含了路由扩展报头的数据包,目前唯一有效的路由扩展报头就是类型2,该类型报头用于IPv6中的移动性支持。
2.4.3 分段扩展报头
如图2-11所示,分段扩展报头与IPv4报头中用于分段目的的字段相似。当IPv6数据包的源端需要将数据包分段并将每个分段都作为一个单独的数据包进行发送时,就需要用到分段扩展报头。数据包的接收端再重组这些分段后的数据包,每个数据包都有自己的IPv6基本报头和分段扩展报头。
与IPv4不同,对每个被分段的数据包来说,源端会生成一个唯一的标识值,并且每个分段后的数据包中都会包含该标识值。该标志值可以确保接收端能够正确地重组来自原始数据包的各个片段。如果源端还需要对同一条消息中的其他数据包进行分段,那么就要使用不同的标志值。
下面列出了与分段扩展报头相关的字段信息。
下一报头(Next Header,8比特):表示原始数据包被分段后的数据的协议号。
保留(Reserved,8比特):该字段被保留,传输时被初始化为0,并且被接收端忽略。
分段偏移(Fragment Offset,13比特):表示被分段后的数据在该报头之后的相对偏移量或位置,以八位组为单位。与IPv4报头中的分段偏移相似,该字段的目的是指示接收端如何将该分段后的数据包与其他分段后的数据包进行排列。
Res(2比特):该字段被保留,传输时被初始化为0,并且被接收端忽略。
M标志(M flag,3比特):M(More Fragments,更多分段)标记用来表示是否是最后一个分段(比特0)或者后面还有更多分段(比特1),该字段与IPv4报头的更多分段标志(More Fragments Flag)相似。
标识符(Identification,32比特):该字段与IPv4报头的标识符字段相似,用来唯一的标识同一个原始数据包中的所有分段数据包,该字段从IPv4中的16比特扩充到IPv6中的32比特。
2.4.4 IPSec:AH和ESP扩展报头
IPv6利用以下两种扩展报头来实现IPSec中的两种关键的安全协议:
AH(Authentication Header,认证头);
ESP(Encapsulating Security Payload,封装安全净荷)。
1.IPSec
在讨论AH和ESP扩展报头之前,首先简要回顾一下IPSec以及这两种安全协议的主要功能,目的不是要求大家完全掌握IPSec、AH和ESP,而是希望为大家理解其重要性以及在IPv6中的使用分方法提供足够的背景知识。
IPSec是保障数据包在IP网络中传输安全性的一组协议集。
AH和ESP是为整个IPv6包或部分IPv6包提供认证与完整性功能的主要安全协议,此外,ESP还能够提供加密功能。
注:
IPSec是IPv4和IPv6的一部分,但实现IPv4协议栈的设备并不强制要求提供IPSec功能,早期的RFC要求所有的IPv6实现都必须强制支持IPSec,描述方式是“必须支持”IPSec,不过最新的RFC 6343“IPv6 Node Requirements”放松了这一要求,相应的描述方式调整为“应该实现”IPSec。
AH可以提供数据包的真实性和完整性保证,认证(Authentication)的作用是确保数据包的发送方和接收方身份都是真实的,完整性(Integrity)的作用是保证数据包在发送途中未被更改。AH可以提供认证和完整性功能,但不提供加密功能,加密(Encryption)是利用一定的算法(被称为密码)转换信息(通常是明文)的过程,以确保只能由拥有特殊信息(通常称为密钥)的接收方读取。
ESP可以提供认证、完整性和加密功能,ESP不仅可以保护数据包不被中间设备更改,而且还能保护数据包的内容不被查看,ESP有自己的认证方案,也可以与AH配合使用。总得来说,AH仅提供认证和完整性功能,而ESP除了提供认证和完整性功能之外,还能对数据包进行加密。
到现在为止,还没有说到究竟需要对数据包的多少内容进行认证或加密,这个问题的答案取决于IPSec的工作模式,即传输模式或隧道模式。
2.传输模式与隧道模式
顾名思义,传输模式保护传输层及更高层,仍然使用原始的IP报头。由于原始的源IP地址和目的IP地址都在IP基本报头内,因而中间设备路由器不是IPSec的参与者。传输模式通常用于主机之间的通信。
隧道模式用于保护IP包的全部内容,包括IP报头。实现方式是将原始IP包(包括IP报头)封装到一个新的IP报头中,隧道端点作为新的源IP地址和目的IP地址,隧道端点可以是路由器或主机本身。隧道模式可以保护整个IP包,而传输模式不行。图2-12解释了传输模式与隧道模式之间的区别。
下面将开始讨论AH扩展报头和ESP扩展报头,如果是初次接触IPSec,那么对某些内容感到困惑是完全可以理解的。
2.4.5 ESP扩展报头
ESP扩展报头是一种可变长度的扩展报头,如前所述,该报头用于提高认证、完整性和加密等功能,ESP扩展报头是由前一个报头中的下一报头字段值50来标识的。
图2-13显示了ESP扩展报头的结构,ESP扩展报头可以分为4部分。
ESP报头:SPI(Security Parameter Index,安全参数索引)和序列号字段。
净荷:ESP净荷数据字段。
ESP报尾:填充、填充长度以及下一报头字段。
ESP认证数据。
图2-13显示了ESP扩展报头的各个字段,ESP被视为端到端通信机制,也就是说,路径上的路由器不会处理ESP报头。请注意,ESP为原始数据包提供了认证完整性与机密性机制,因此,ESP扩展报头被封装在IPv6基本报头、逐跳选项扩展报头、路由扩展报头以及分段扩展报头之后(如图2-14所示)。对IPv6来说,加密操作会涵盖整个传输层报文段、ESP报尾以及目的选项扩展报头(如果目的选项扩展报头位于ESP报头之后),目的选项扩展报头可以位于ESP报头之前或之后,这取决于设计意图。
与前面讨论过的扩展报头不同,有关ESP扩展报头各个字段的内容已超出了本书范围,需要大家对IPSec有比较深入的认识和理解,如果大家初次接触IPSec,那么对某些内容感到困惑是完全可以理解的,有关IPSec的详细信息,可参考Cisco Press出版的由James Henry Carmouche编写的图书IPSec Virtual Private Network Fundamentals,这是一本非常好的学习IPSec知识的图书。
AH扩展报头
AH扩展报头也是一种可变长度的扩展报头,与ESP不同的是,AH仅提供认证和完整性功能,并不使用加密机制来提供机密性功能,AH扩展报头是由前一个报头中的下一报头字段值51来标识的。
图2-15显示了AH扩展报头的结构,与ESP一样,AH也被视为端到端通信机制,请注意,AH仅提供数据的完整性机制,可以确保通信参与方的身份,并且接收方可以据此检测出数据包内容在传送过程中是否被更改。与ESP相似,AH扩展报头也被封装在IPv6基本报头、逐跳选项扩展报头、路由扩展报头以及分段扩展报头之后(如图2-16所示)。目的选项扩展报头可以位于ESP报头之前或之后,这取决于设计意图。
与其他IPSec扩展报头一样,有关AH扩展报头各个字段的内容已超出了本书范围,需要大家对IPSec有比较深入的认识和理解。
2.4.6 目的选项扩展报头
目的选项扩展报头用于承载仅需要数据包目的节点处理的选项信息,除了逐跳选项扩展报头之外,目的选项扩展报头是另一个使用选项的扩展报头,目的选项扩展报头是由前一个报头中的下一报头字段值60来标识的。如图2-17所示,目的选项扩展报头的格式如下。
下一报头(Next Header,8比特):用于标识目的选项扩展报头后面的报头类型,既可以是其他扩展报头,也可以是净荷协议。
报头扩展长度(Header Extension Length,8比特):表示以八位组为单位的目的选项扩展报头的长度,不包含第一个八位组。
选项(可变长度):该字段包含一个和多个采取TLV编码的选项。
选项类型(Option Type,8比特):表示该报头所承载的选项类型。
选项长度(Option Length,8比特):表示选项数据字段中的字节数。
选项数据(可变长度):即数据包的数据内容。
注:
有关目的选项扩展报头的一种建议使用方式是IPv6的移动性支持,相关内容定义在RFC 6275“Mobility Support in IPv6”。
“对每个移动节点来说,无论其连接互联网的当前附着点在哪里,都是由其家乡地址来标识的。当移动节点离开家乡时,就会与一个转交地址产生关联,转交地址可以提供该移动节点的当前位置信息,传送给移动节点的IPv6数据包都会被透明路由到这个转交地址,协议要求IPv6节点缓存移动节点的家乡地址与转交地址之间的绑定关系,然后就可以将发送给该移动节点的数据包直接发送给转交地址。为了支持该操作,移动IPv6定义了一个新的IPv6协议和一个新的目的选项,这样一来,所有IPv6节点(移动节点或固定节点)都能与移动节点进行通信。”
2.4.7 无下一报头
下一报头字段值为59时表示该报头后面无其他数据。它仅仅是一个占位符,表示该报头后面无任何数据。假如净荷长度指示该报头后面还有其他字节,那么这些字节都会被忽略。