|  | 
 
| 路由头 
 若指定ipv6数据报在源地址发送到目的地址的过程中,必须要经过一个活几个节点,那么可以将这些地址的列表放在路由头中。路由头的类型是值是43.也就是说,若一个报头中的“下一报头”域的值是43,表示下一个报头是路由头。路由头的格式如下图:
 下一报头
 扩展头部长度
 路由类型
 剩余段
 类型相关数据
 对路由头的各个字段的说明如下:
 下一报头:该字段的长度是8位,表明紧跟在路由头后面的下一个报头的类型。
 扩展头部长度:该字段的长度8位无符号整数,表明以8个8位组为单位,但不包括前8个8位组在内的路由头的长度。
 路由类型:该字段的长度8位,是特殊路由头变量的标识符。
 剩余段:该字段的值是8位无符号整数,表明剩余段的数量。例如,已明确列出的,在到达最终节点前还要访问的中间节点的数量。
 类型相关数据:该字段的格式由路由类型决定。该字段的长度是可变的,但是要保证其字节数是8个8位组的整倍数。
 
 若节点遇到一个路由类型未知的数据报,它要依赖剩余字段的值进行不同处理,若剩余字段是0,那么节点必须忽略该路由头,继续处理下一个报头;若剩余字段的值不为0,那么节点必须丢弃该数据报,然后向该数据报的原节点发送一个code,为0的icmp参数的错误报文,向其说明该路由类型未被认可。
 
 若处理完路由头之后,有一个节点确定该数据报将被转发到链路最大传输单元(Maximum Tranmission Unit,MTU)比该数据报小的链路上,那么节点必须丢弃该数据报,路由类型是0的路由头的格式如下图:
 下一报头
 扩展报头长度
 路由类型=0
 剩余段
 保留字
 地址[1]
 地址[2]
 、、、、、
 地址【n】
 下一报头:该字段的长度是8位,表明紧跟在路由头后面的下一个报头的类型。
 扩展头部长度:该字段的长度8位无符号整数,表明以8个8位组为单位,但不包括前8个8位组在内的路由头的长度。对于路由类型为0的路由头来说,该值等于头中地址数的两倍。
 路由类型:0
 剩余段:该字段的值是8位无符号整数,表明剩余段的数量。例如,已明确列出的,在到达最终节点前还要访问的中间节点的数量。
 保留字:该字段的长度为32位,发送端将其初始化0;接收端将其忽略。
 地址【1、、、、、、n】:ipv6地址矢量,从1到n来标记。
 多播地址不能出现在路由类型为0的路由头中。若有的数据报中路由头类型为0,那么该数据报的 ipv6目的地址不不能是多播地址。直到数据报到达了ipv6头的目的地址字段所指明的节点时,路由头才会被检验和处理。
 
 分段头
 
 当ipv6源地址发送的数据报比到达目的地址所经过的路径上的最小MTU还要大时,这个数据报就要分为几段分别进行发送,这时就要用到分段头。目的地址收到被分段发送的全部数据后再将它们组合起来,分段头的类型值为44。也就是说,若一个报头中的“下一报头”字段值为44,表示下一个报头是分段头。分段头的格式如下:
 下一报头
 保留字
 段偏移量
 保留字
 M
 标识
 
 对分段头各字段的说明如下:
 下一报头:该字段的长度是8位,表明紧跟在路由头后面的下一个报头的类型。
 扩展头部长度:该字段的长度8位。现在未被使用。但是发送时要初始化为0;接受时忽略。
 段偏移量:该字段的长度13位无符号整数.表明以8个8位组为单位,报头后面的数据相对于原数据报中可分片部分的开始位置的偏移量。
 保留字:该字段的长度是2位。现在未被使用。但是发送时要初始化为0;接受时忽略。
 M标志:M=1时表明后面还有分段;M=0  时表示这是最后一个分片。
 标识:该字段的长度是32位。表示源节点为每个要分段的数据报创建一个唯一的标识值。
 
 注意:与ipv4不同,ipv6的分段操作只在源节点上进行,而不在数据报经过的路由器进行。
 
 可以将没有分段的大数据称为原始数据报,它可以分为两部分:不可分段部分和可分段部分。两部分如下示:
 
 不可分段部分
 可分段部分
 不可分段部分包括ipv6报头和在到达目的地址前要由路由器处理的扩展头(路由头和逐跳选项头);可分段部分包括仅需要最终目的节点处理的扩展报头和上层报头及数据。将原始数据报中的可分段部分按从左至右的顺序分成若干段,每一段的长度都是8个8位组的整数倍(最后一个分段可能不是)。如下图所示:
 
 不可分段部分
 第一个分段
 第二个分段、、、最后一个分段
 
 
 然后,原始数据报如下图所示的一系列分段数据报发送出去。其中,每个分段数据报大小都应该与传送路径上的mut相适应。
 不可分段部分
 分段头
 第一个分段
 
 不可分段部分
 分段头
 第二个分段
 、
 、
 、
 不可分段部分
 分段头
 最后一个分段
 
 到达目的端后,所有的数据分段数据报又被组装成原始数据报的形式。
 若第一个分段数据报到达目的端(它不一定是第一个分段数据报),从这时起的60s内,没有收到全部分段数据报,那么分段数据报的组装过程将被放弃,已经收到的分段数据报也将全部丢弃。这种情况下,若收到了第一个分段数据报,将向源地址发送一个icmp分段组装超时报文,若分段的长度不是8个8位组的倍数,且M标识是1时,或者分段的长度和偏移量都超过65535个8位组时,要将分段丢弃,然后向源地址发送代码为0 的icmp参数错误报文。
 下边的情况不应该发生,如果发生了,它们也不会被认为是错误的:
 l         相同原始数据报的不同分段的分段头的数量和内容可能不同。无论在分段数据报中出现何种报头,收到数据报、重新组装之前都要处理。在组装数据报时,只使用偏移量为0的分段数据报中的报头。
 l         相同原始数据报的不同分段的分段头的下一报头值可能不同,、。在组装数据报时,只使用偏移量为0 的分段数据报中的值。
 认证头
 
 认证头的功能是实现了数据的完整性和数据报来源的认证。完整性保证了数据报在传输过程中没有被篡改过;数据来源的验证性,保证数据确实来自于源地址所标记的接口。
 若要使用验证头,那么它必须放置在那些将路由器处理扩展头之后(如:逐跳选项头、路由头、分段头),并且在只能由数据报的目的地址处理扩展头之前。认证头的类型值是51.也就是说,如果一个报头中的“下一报头”字段的值为51,标识下一个报头是认证头。认证头格式如下:
 下一报头
 载荷长度
 保留字
 安全参数索引
 序列号
 认证数据(可变的)
 
 对认证头的各个字段说明如下:
 下一报头:该字段的长度是8位,表明紧跟在认证头后面的下一个载荷(Payload)类型
 载荷长度:该字段的长度是8位。指明以4个8位组为单位的认证头的长度再减去2。
 保留字:该字段的长度是16位,保留为将来使用。现全为0。
 安全参数:目的地址和安全协议结合起来,唯一的指明了该数据报的安全关联(Security Association,SA)安全参数索引的值,在1-255范围之内的,由IANA保留,而供以后可以使用SPI的0值,表示在IPsec要求密钥管理实体建立一个新的安全关联,但是在安全关联还没有建立期间,没有安全关联存在。
 序列号:该字段的值是无符号32位整数。表示一个递增的计数器值。每发送一个数据报,该值加1.若该值已经增加到232,计数器就必须回0时,通信双方就必须重新协商安全架构(Security Architecture)。否则,一旦计数器回0,所有收到的数据都要被丢弃。发送者必须传送该值,但是接收者不必响应。。该值可以用来做反重放攻击,若当前接到的数据的序列号相同,则将该数据丢弃。
 认证数据:该域包含了对数据报的完整性校验值(Integrity Check Value,ICV)。该字段的长度可变,但必须是32的整数倍。因此,该域可能包含填充数据。对于IPv6而言,填充数据要保证使整个认证头的长度是64为的整数倍。
 
 认证头有两种使用方式:传输模式(transport mode)和隧道模式(tunnel mode).
 在传输模式下,把认证头插入ip头和tcp、udp、icmp等上层协议,或者在其它已经插入的IPsec头之前。认证头可以看作是一个端到端的载荷(End-toEnd payload),,因此它在逐跳选项头、路由头、分段头之后,可以在目的选项头之前,也可以在它后面。下图显示了在传输模式下,认证头在典型的ipv6数据报中的位置。
 应用认证之前
 原始ip头
 扩展报头
 Tcp
 数据
 应用认证之后
 原始ip头
 逐跳选项头、目的选项头、路由头、分段头
 认证头
 目的选项头
 Tcp
 数据
 
 隧道模式下,认证头可以应用在主机和安全网关中。此时,认证头保护包括内部ip头在内的全部ip数据报。认证头的位置与传输模式下的位置相同,如下图:
 新的ip头
 扩展报头
 认证头
 原始的ip头
 扩展报头
 Tcp
 数据
 
 
 封装安全载荷头
 
 封装安全载荷头(Encapsulating Secuirty Payload Header,ESP)提供数据加密功能,实现端到端的加密,提供无连接的完整性和抗重放服务,也可以限制通信流的机密性。封装安全载荷头可以单独使用,也可以在使用隧道时嵌套使用。它提供了主机之间、安全网关之间,主机和安全网关之间的安全服务。封装安全载荷头的类型值是50.也就是说,若一个报头中的“下一报头”字段的值是50,表示下一个报头是封装安全载荷头。封装安全载荷头的格式如下:
 安全参数索引
 序列号
 载荷数据(可变的)
 填充数据(0-255字节)
 填充数据长度
 下一报头
 认证数据(可变的)
 封装安全载荷头各个字段的说明如下:
 安全参数索引:该字段的长度是32位。无论是长度还是功能,都与认证头中的SPI字段相同。
 序列号:该字段的值是无符号32位整数。表示一个递增的计数器值。当安全关联建立时,发送者和接收者必须把计数器初始化为0,若建立了抗重放机制(默认的),序列号是不允许循环的。因此在安全架构下,在发送232个数据报之前,发送者和接收者的计时器都应该复位。序列号是强制使用的,即使接收者不需要对此字段做任何处理。
 载荷数据:该字段的长度可变。若加密载荷的算法需要使用加密同步数据,则可将其放在该域中。
 填充数据:为了是载荷在正确的位置结束,可以使用填充数据。发送者可以填充0-255在季节的填充数据。
 填充数据长度:该字段的值是8位无符号整数。表明以字节为单位,填充数据的长度。
 下一报头:该字段长度是8位,表明包含在载荷数据字段中的数据类型,如ipv6扩展头或上层协议标识符。
 认证数据:该字段的长度可变。包含了对除认证数据字段以外的封装安全载荷头数据的完整性校验值。
 
 在传输模式下,可以可以把封装安全载荷头放在ip头之后,上层协议头之前,其格式如下所示:
 应用安全载荷头之前
 原始ip头
 扩展报头(若有)
 Tcp
 数据
 应用安全载荷头之后
 原始ip头
 逐跳选项头、目的选项头、路由头、分段头
 ESP
 目的选项头
 Tcp
 数据
 ESP跟踪
 Esp认证
 隧道模式下,放在压缩的ip头之前,格式如下:
 新ip头
 新扩展报头
 ESP
 原始ip头
 原始扩展报头
 Tcp
 数据
 ESP跟踪
 ESP认证
 
 目的选项头
 
 目的选项头中携带着仅需要由最终目的检验的可选信息。它要在ipv6目的地址字段中所列出的第一个目的主机上处理,也要在路由头所列出后续目的主机上处理。目的选项头的类型值是60。也就是说,若一个报头中的“下一报头”字段是60,表示下一个选项头是目的选项头,目的选项头的格式如下:
 下一报头
 扩展头长度
 选项
 下一报头:该字段长度是8位,表明紧跟在目的选项头后面的下一个报头的类型。
 扩展报头长度:该字段的长度8位无符号整数,表明以8个8位组为单位,但不包括前8个8位组在内的目的选项头的长度。
 选项:包含一个或多个TLV(Type-Length-Value)编码的选项。该字段的长度是可变的,但要保证其能使整个头的长度是8个8位组的整数倍。
 
 有两种可能的方式在ipv6数据报中编码可选的目的信息:一种是将其作为目的选项头一个选项;一种是将其作为一个单独的扩展报头。可以根据希望目的的节点所做的处理不同,来选择不同的编码方式。
 
 若希望在数据报的目的地址不是多播地址的情况下,目的节点丢弃数据报,然后向源地址发送icmp类型未被认可报文,那么信息可以编码为一个单独的扩展头,也可以编码为目的选项头的一个选项,这时,选项类型最高两位的值为11.那么到底用何种方式编码,可以依据哪种方式所用的长度小,或者是选项域的对齐方式更好,解析效率更高来决定。
 如果希望目的节点做其他处理,那么必须将信息编码为目的选项头的选项,选项类型的最高两位可以是00、01或10
 
 选项格式及扩展
 
 
 在介绍逐跳选项头和目的选项头时,都用到了个数不定的TLV编码的选项。TLV的意思是:类型-长度-值,也就是说,,选项由类型、长度和数据(值)这三个域组成。具体格式如下所示:
 选项类型
 选项数据长度
 选项数据
 对各个字段的说明如下:
 选项类型:该字段的长度是8位。是选项类型的标识符。
 选项数据长度:该字段的值是8位无符号整数,是“选项数据”字段的长度,以8位组为单位。
 选项数据:该字段的长度可变,。是与类型相关的可选项的数据。
 
 若一个ipv6扩展报头的选项域中包含了多个以TLV编码的选项,那么对这些选项的处理要严格按照它们在报头中出现的顺序来进行,决不允许不按顺序、处理特定选项的发生。
 
 选项类型标识符以如下规格编码:其最高两位指定了当ipv6节点无法识别这一选项类型时所要作出的反应。
 00-   跳过这个选项,继续处理。
 01-   抛弃这个包
 02-   抛弃这个包,并且不管包的目的是否是多播地址,都给包的源地址发送一个icmp“参数存在问题”(编码是2)的报文,指向无法识别的选项类型。
 03-   抛弃这个包,并且只有当包的目的地址不是多播地址时,才给包的源地址发送一个icmp“参数存在问题”(编码是2)的报文,指向无法识别的选项类型。
 
 选项类型的第三位指明是否可以改变到目的地址的路由(Change En-route)。当数据报中有认证头时,对于任何可改变路由的选项,在进行数据报认证值的计算和校验时,其选项字段的全部数据都应该当作0来处理。
 0-      选项数据不可以改变路由
 1-      选项数据可以改变路由
 如上述的选项类型的前三位,要放在选项类型字段的所有前8位中,作为一个整体来处理。也就是说,一个特定的选项类型是有选项类型字段的全部前8位表示的,而不是仅仅由5位表示。
 
 有些选项要求其字节长度有一定的对齐方式,为此定义了两种填充选项,Pad1选项和PadN选项。
 
 Pad1选项比较特殊,它的字段的值为0,而且没有长度字段和值字段。用它来向报头的选项字段填充一个8位组。Pad1的格式如下:
 
 选项类型=0
 若要填充的长度多于一个8位组,那么,不是向其中填充多个Pad1选项,而是使用PadN选项来填充。PadN的格式如下示:
 
 选项类型=1
 选项数据长度
 选项数据
 对于要填充N个8位组的填充选项,其选项数据长度字段的值应该是N-2,选项数据字段为N-2个全为0的8位组。这是因为选项类型字段和数据长度字段的长度已经是2个8bit了,所以选项字段是N-2个8位组。
 
 扩展报头的顺序
 
 若在同一个ipv6数据报中要使用多个扩展报头,建议以以下顺序排列这些扩展报头:
 Ipv6基本报头-----逐跳选项头-------目的选项头------路由头-----------分段头----------认证头------封装安全载荷头------目的目的选项头-------上层协议报文。
 注意:在RFC中给出了认证头与封装安全载荷头相对顺序的附加建议。
 在一个ipv6数据报中,目的选项头最多可以出现两次:一次是在路由头前面,一次是在上层协议头前面。其它类型的选项头最多只能出现一次。但是如果上层协议也是ipv6头(例如在ipv6被压缩或在隧道中时),那么它可以跟在它自己的扩展头后面,但是,对于ipv6节点来说,除了逐跳选项头外,无论这些扩展报头在一个ipv6数据报中出现几次,顺序如何,节点都应该可以处理。
 | 
 |