原文链接:https://blog.csdn.net/Jacob71/article/details/123731939
IPv6报文结构在RFC 2460 “Internet Protocol, Version 6 (IPv6) Specification”中有详细的定义。
IPv4报文头
首先回顾一下IPv4报文结构(如下图):
报文中各个字段意义如下:
版本(Version):4 bits,IP协议版本号,固定为4
IHL(Internet Header Lenght):4 bits,IP报文头长度,以4字节(32 bits)为单位,即报文头实际长度 = (IHL × 4) 字节。IPv4报文头最小长度为20字节,该字段最小值为5
服务类型(Type of Service – ToS):8 bits,指示网络中设备如何处理该报文,用于提供QoS (Quality of Service),IETF与1998年在RFC2747中使用差分服务 (Differentiated Service)重新定义该字段,即DSCP
数据包总长(Total Length):16 bits,IPv4报文的中长度,包括报文头和数据
标识符(Identifier):16 bits,每个报文有一个唯一的标识符,网络设备对报文进行分片时,需要保证所有分片的标识符字段与原始报文保持一致,接收端基于标识符进行报文重组
标志(Flag):3 bits,有DF (Don’t Fragment)标志位,和更多分片标志位 (More Fragments Flag)用于表示该分片是否是最后一个分片
分段偏移(Fragment Offset):13 bits,该分片在原数据报文中的偏移量,以8字节为单位
生存时间(Time To Live):数据报文在网络中存在的最大跳数
协议(Protocol):8 bits,指示IP报文中数据部分承载的协议类型,如ICMP(1)、TCP(6)、UDP(17)
报文头校验和(Header Checksum):16 bits,IPv4报文头的校验和,网络中的每台设备转发报文时均需要进行校验该字段,失败则丢弃报文
源IP地址(Source IP Address):32 bits,发送数据报文节点的IPv4地址
目的IP地址(Destination IP Address):32 bits,接收数据报文节点的IPv4地址
可选项(Options):长度可变,很少使用,常用的选项有源路由选项、时间戳选项等
填充(Padding):长度可变,用于将选项填充到32 bits的整数倍,即32 bits对齐
数据(Data):报文承载传输的数据
IPv6报文头
IPv6报文结构(如下图):
报文中各个字段意义如下:
版本(Version):4 bits,IP协议版本号,固定为6
流量类别(Traffic Class):8 bits,与IPv4中的ToS类似,使用RFC 2647中规定的DSCP
流标签(Flow Label):20 bits,标记一条流,详细使用信息参见RFC 6437 ”IPv6 Flow Label Specification”
净荷长度(Payload Length):16 bits,IPv6基本报文头后的数据部分长度(包括扩展头的长度),以字节为单位
下一报头(Next Header):8 bits,指示基本报文头后的扩展报文头,如果没有扩展报文头,则指示数据部分所承载的协议
跳数限制(Hop Limit):与IPv4的TTL相同
源IPv6地址(Source IPv6 Address):128 bits,发送数据报文节点的IPv6地址
目的IPv6地址(Destination IPv6 Address):128 bits,接收数据报文节点的IPv6地址
扩展报文头(Extension Header):可变长度,包含下一报头字段、扩展报头长度字段和扩展报头的内容,RFC 2460中定义了6中扩展报头
数据(Data):报文承载传输的数据
IPv4与IPv6报文头差别
IPv4与IPv6报文的区别(如下图所示):
相对于IPv4,IPv6简化了基本报文头的内容,且大小固定,方便网络设备高性能转发处理。比较大的变化就是IPv6报文头中删掉的字段:
IHL(IP报文头长度)字段,由于IPv6基本报文头长度固定,扩展报文头长度算入数据长度部分,因此不再需要这个字段
标识符、标志和分段偏移等三个字段用于IPv4数据包的分段与重组,IPv6报文在网络设备中不允许进行分片操作,因此从IPv6报文头中却掉。但是IPv6允许源主机对报文进行分片,这时将增加IPv6分片扩展报头。实际上,这三个字段移动到分片扩展报头中
报文头校验和字段,IPv6在报文头中删除了这个字段。因为目前在二层(以太网)有校验和与差错控制机制,在传输层(TCP和UDP)也有校验和机制,而在IP层做校验和操作已经没有必要
可变长度的选项字段,IPv6使用扩展报头替代了这个字段
IPv6扩展报文头
IPv6扩展报文头是可选项,在IPv6基本报文头中的下一报头字段指明是否有扩展头,如果没有扩展头,则该字段指明IPv6报文所携带的数据部分使用的协议,例如下图,数据部分是TCP协议:
下面的表格给出了下一报头字段的取值即意义:
目前,IPv6已经定义的扩展头有:
逐跳扩展头(Hop-by-Hop):必须由网络转发路径上的所有路由器检查处理
目的选项扩展头(Destination Options):有RH扩展头时,可以放在逐跳扩展头后,或者是最后一个扩展头
路由扩展头(Routing): (Note: RFC 5095, Dec 2007, deprecated RH type 0)
分片扩展头(Fragment):由于IPv6使用path MTU机制,很少使用分片机制
AH扩展头(Authentication):IPsec AH
ESP扩展头(Encapsulating Security Payload):IPsec ESP
其他扩展头:MIPv6, HIP, SHIM6, ...
IPv6扩展头使用如下图所示:
最后一个扩展报文头中的下一个报文头字段总是指示哪种协议被封装在数据部分。
RFC 2460建议一个报文使用多个扩展头时,扩展报头的出现顺序如下:
IPv6基本报头
逐跳选项报头
目的选项报头
路由报头
分段报头
AH报头
ESP报头
目的选项报头
上层协议报头
逐跳选项扩展报文头
逐跳选项扩展报文头要求网络转发路径上每台路由器都必须处理报头中的信息。报文头中的选项为 IPv6 报文提供了很好的灵活性,可以通过扩展报头标准组中未定义的一组值对 IPv6 包进行补充定义,这组值采用 TLV (Type-Length-Value,类型·长度·值) 三元组进行定义。下图是巨帧负载选项 (Jumbo Payload Option)逐跳选项报文头格式的例子:
IPv6报文默认最大为64K字节,需要时可以采用巨帧的逐跳选项报文头,报文最大可以支持2^32长度。
路由扩展报文头
路由扩展报文头允许数据报文发送端指定去往目的端的路径,扩展头中包含去往数据报文目的端路径上的一台或多台中间路由器。该功能与 IPv4 使用的源路由选项类似,路由扩展报文头由前一个报文头中的下一报头值 43 来标识。
分片扩展报文头
IPv6 路由器不对数据包进行分片,只有发送 IPv6 数据包的源节点才能执行分段操作,如果网络中的节点(如路由器)收到一个需要被分片的 IPv6 报文,网络节点会丢弃该数据包并向源节点发送一条 ICMPv6消息,即“分组过大“ 差错消息。
IPv6分片扩展头的格式如下:
Fragment Offset,与IPv4报头中的分段偏移类似
M flag:用于表示是否是最后一个分片,与IPv4报头中分段标志类似
Identification:与IPv4报头中的标识符类似,唯一标识一个原始数据包,接收端用来组装报文
可以看到,实际上是将IPv4报文头中的三个字段移到了分片扩展报文头中。
目的选项扩展报文头
目的选项扩展报文头用于承载仅需要数据包目前节点处理的选项信息,使用TLV选项,由前一个报头中的下一报头字段值 60 米标识。目的选项扩展报文头格式如下:
与IPSec相关的AH扩展头和ESP扩展头,参见相关的标准定义。
————————————————