IPv6报文格式
IPv6数据包由一个IPv6报头、多个扩展报头和一个上层协议数据单元组成。
IPv6基本报头(IPv6 Header)
• 每一个IPv6数据包都必须包含报头,其长度固定为40bytes。
• 基本报头提供报文转发的基本信息,会被转发路径上面的所有路由器解析。
扩展报头(Extension Headers)
• IPv6扩展报头是可能跟在基本IPv6报头后面的可选报头。IPv6数据包中可以包含一个或多个扩展报头,当然也可以没有扩展报头,这些扩展报头可以具有不同的长度。IPv6报头和扩展=报头代替了IPv4报头及其选项。新的扩展报头格式增强了IPv6的功能,使其具有极大的扩展性。与IPv4报头中的选项不同,IPv6扩展报头没有最大长度的限制,因此可以容纳IPv6通信所需要的所有扩展数据。
• 扩展报头提供报文转发的扩展信息,并不会被路径上所有的路由器解析,一般只会被目的路由器解析处理。
上层协议数据单元(Upper Layer Protocol Data Unit)
• 上层协议数据单元一般由上层协议包头和它的有效载荷构成,有效载荷可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。
IPv6报头格式中主要字段解释如下
Version:版本号,长度为4bit。对于IPv6,该值为6。(此字段用处不大,因为在MAC层就有上层数据的版本的信息了)
Traffic Class:流类别,长度为8bit。等同于IPv4中的TOS字段,表示IPv6数据报的类或优先级,主要应用于QoS。
Flow Label:流标签,长度为20bit。IPv6中的新增字段,用于区分实时流量(可以通过流量标签知道上层的应用层是什么数据,不用拆到应用层,方便分类并且直接转发),不同的流标签+源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高效率的区分数据流。
Payload Length:(头部长度固定,所以只需要标识负载长度)有效载荷长度,长度为16bit。有效载荷是指紧跟IPv6报头的数据报的其它部分(即扩展报头和上层协议数据单元)。该字段只能表示最大长度为65535字节的有效载荷。如果有效载荷的长度超过这个值,该字段会置0,而有效载荷的长度用逐跳选项扩展报头中的超大有效载荷选项来表示。
Next Header:下一个报头,长度为8bit。该字段定义紧跟在IPv6报头后面的第一个扩展报头(如果存在)的类型,或者上层协议数据单元中的协议类型。
Hop Limit:跳数限制,长度为8bit。该字段类似于IPv4中的Time to Live字段,它定义了IP数据报所能经过的最大跳数。每经过一个路由器,该数值减去1,当该字段的值为0时,数据报将被丢弃。
Source Address:源地址,长度为128bit。表示发送方的地址。
Destination Address:目的地址,长度为128bit。表示接收方的地址。
与IPv4报头比较:
IPv4报头中包含13个字段,如图所示。IPv6和IPv4相比,去除了IHL、identifiers、Flags、Fragment Offset、Header Checksum、 Options、Paddiing域,只增了流标签域,因此IPv6报文头的处理较IPv4大大简化,提高了处理效率。另外,IPv6为了更好支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有结构就能做到,理论上可以无限扩展(IPv4中有60个最大字节长度的限制),体现了优异的灵活性。下面介绍IPv6扩展报头的一些信息。
拓展报头格式
IPv6扩展报头中主要字段解释如下
Next Header:下一个报头,长度为8bit。与基本报头的Next Header的作用相同。指明下一个扩展报头(如果存在)或上层协议的类型。
Extension Header Len:报头扩展长度,长度为8bit。表示扩展报头的长度(不包含Next Header字段)。拓展报文总长度一定钥匙8字节的整数倍,如果不是整数倍,就会进行相应的填充。
Extension Head Data:扩展报头数据,长度可变。扩展报头的内容,为一系列选项字段和填充字段的组合。
IPv6的扩展头被当作IPv6静载荷的一部分,计算在 IPv6基本头的Palyload Length字段内。
拓展报头种类
当超过一种扩展报头被用在同一个分组里时,报头必须按照下列顺序出现:
IPv6基本报头
逐跳选项扩展报头
目的选项扩展报头
路由扩展报头
分段扩展报头
认证扩展报头
封装安全有效载荷扩展报头
上层协议数据报文
路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头(需要中间路由器处理的报文头部其实也就是逐条选项拓展报头,所以如果存在就放在第一个,字段号为0,方便被查看,其他报头中间路由器一律不进行处理,增加转发的速率),并不是所有的扩展报头都需要被转发路由设备查看和处理的。
逐跳选项报头
Next Header值=0。作用是用于携带在报文发送路径上必须被每一跳路由器检查和处理的可选信息,类似IPv4中的ROUTER ALERT选项。
Next Header:8bit,作用同基本头的Next Header 相同。
Hdr Ext Len: 8bit,标识Options头的长度。该长度以8Byte为单位,不包含扩展头的第一个8Byte,即如果该扩展头只有8Byte 长,该字段值即为0。
Options:可以携带不定数量采用TLV格式的选项,目前唯一定义的选项是巨型静载荷选项(类型为194)。使用巨型静载荷选项,要求IPv6头的16位净荷长度字段值必须为0,扩展头中的巨型净荷长度字段值不小于65535。此外还有一个限制:如果包中有分段扩展头,就不能同时使用巨型净荷选项,因为使用巨型净荷选项时不能对包进行分段。
静载荷=100000Byte 的IPv6数据包如下:
目的选项拓展报头
Next Header值=60。用在移动IPv6,承载数据包目的节点所需要的可选信息,给宿主机解释和使用的,目前这个选项为空用途:IETF暂时建议使用该扩展头在移动节点和家乡代理之间交换注册信息。
Hdr ext Len(8-bit):Header的长度,不统计前1个字节。
Options (变长):包含一个或多个TLV(Tag,Length,Value)三元组
Pad1,PadN:用于填充报文Options剩余部分
路由选择扩展头
Next Header值=43,作用是包含IPv6数据包到达目的地所要经过的中间节点,使源端可以强制数据包经过哪些节点,类似IPv4中的宽松源站选路。
Next Header: 8bit,作用同基本头的Next Header。
Hdr Ext Len: 8bit,标识Options头的长度。该长度以8Byte为单位,不包含扩展头的第一个8Byte,即如果该扩展头只有8Byte长,该字段值即为0。
Routing Type: 8bit,目前只定义了类型0,表示数据包需要经过的中间路由器的地址。
分段扩展头
Next Header值=44,作用是如果源端需要发送的数据包超过Path MTU的大小,源端在发送前需要将数据包先分段。在 IPv4中,数据包超过接口MTU值,中间节点路由器将对数据包进行分段处理;而在 IPv6中,中间路由器不能对数据包分段,如果中间路由器需要发送的报文超过本接口的 MTU 值,数据包将被丢弃同时路由器会发送一个ICMPv6的错误信息报文给源端。IPv6分段扩展头如下图所示:
Next Header:8bit,作用同基本头的Next Header。
Reserved: 8bit,保留目前未用为0。
Fragment Offset: 13bit,等同于IPv4中的分段偏移字段,以8Byte为单位。如该值为150,表示该报文的数据是位于原报文的1200Byte处后。
Res: 2bit,保留目前未用为0。
M: 1bit,表示后续是否还有分段,如为1表示后续还有分段报文,为0表示该报文是最后一个分段报文。
Identification: 32bit,该字段等同于IPv4的标识字段,为32位。源节点为每个被分段的IPv6包都分配一个标识符,用来唯一标识同一组分段的报文,便于接收端根据相同标识重组报文。
由于分段扩展头采用定长8Byte的设计,所以扩展头长度这一字段无任何意思,8bit保留为0。
在IPv4中,中间路由器对于超过接口MTU的数据包可以进行分段处理,这样操作会降低数据包的转发效率,而且数据包在转发过程中可能被多次分段。而在IPv6中,只有源端数据包发送方才能对数据包进行分段处理,如果中间路由器转发的数据包大于MTU将被丢弃掉,并向源端发送一个ICMPv6的错误信息报文。
如图所示,假设源端要发送2000Byte的IP报文数据,分段标识为1111,MTU值为1400Byte。由于IPv6基本头定长40Byte,所以数据包的有效静载荷长度为1360,由于要分段,加入分段扩展头8Byte,所以有效静载荷的数据部分为1352Byte,2000Byte的数据被分为2段,第一段的有效静载荷长度是1360,有效静载荷数据部分是1352Byte;第二段的有效静载荷长度是656,有效静载荷数据部分为648Byte,这两段的分段标识同为1111。
认证报头扩展头(Authentication Header)
Next Header值=51。作用是为报文提供完整性验证,在传输过程中不被改变的字段会被用作认证信息的计算,在传输过程中可能改变的字段如Hop limit字段,作为0处理。如果有多个扩展头,必须置于由中间节点路由器处理的扩展头之后,以及由目的地址处理的扩展头之前。认证报头扩展头的格式如图所示:
Next Header:8bit,作用同基本头的Next Header。Payload Len: 8bit,标识认证报头的总长度,单位是4Byte,最大为255。
RESERVED: 16bit,保留,填充为0。
SPI: 32bit,与目的地址和AH协议组合,唯一标识本数据包的SA。
Sequence Num: 32bit,是一个单调递增的数,可用作防重放攻击。
Integrity Check Value:可变长,必须是4字节的整数倍,其内容用作完整性检查。
ESP扩展头(Encapsulating Security Payload)
Next Header值=50。作用是提供对数据包的完整性验证和加密,ESP将需要加密保护的字段加密后放入ESP头的数据部分,ESP与AH联合使用,用来提供认证和加密。ESP扩展头的格式如图所示:
SPI:32bit,与目的地址和ESP协议组合,唯一标识本数据包的SA。
Sequence Num: 32bit,是一个单调递增的数,可用作防重放攻击。Payload Data:可变长,加密数据。
Padding:填充,由于加密数据必须是4Byte的整数倍,所以有时候需要填充,内容依据加密算法,最大为255Byte。
Pad Length: 8bit,标识Padding 部分长度,О表示无填充。Next Header:8bit,作用同基本头的Next header。
Authentication Data:可变长,身份验证。
参考资料:HCIE培训文档、《HCIE路由交换学习指南》