一、ipv6的基本格式
ipv6报文格式从简单性来看,比ipv4较简单,而且ipv6的基本头部的长度是固定的。相较与ipv4,ipv6去掉了一些头部,把这些头部全部弄到了后面的扩展投不中。ipv6的报文格式如下:

version:4bits 版本号 ipv6为6
Traffic Class: 8 bits,传输类别,可用于源节点或转寄路由器标识和区分IPV6包中的不同类别或优先级;类似于实现IPV4的TOS/DIFF
Flow Label:20bits 流标签,数据流是指从某特定的源节点向某特定的目的节点发送的数据包序列。当源节点希望中间的路由器对数据包进行一些特殊处理时,就可以使用数据流标签,不支持数据流标签的可以赋值为0;
Payload Length: 16bits unsigned integer, ipv6的载荷长度,首部以外的长度(包括扩展首部)
Next Header:8 bits 指明紧跟IP首部后面的下一个首部的类型
Hop Limit:8bits unsigned integer,在每个传输此包的节点处减1,如果跳数限制减到0,就抛弃此包
Source Address:128 bit 源地址
Destnation Address:128 bit 目的地址
二、扩展首部格式:
1、下面是几个扩展首部的例子:
+-----------------------+--------------------------------------------
| ipv6 header | tcp header + data
| |
| next header = tcp |
| |
+-----------------------+---------------------------------------------
+-----------------------+-----------------------+-----------------------------
| ipv6 header | routing header | tcp header + data
| | |
| next header = | next header = tcp |
| routing | |
| | |
+-----------------------+------------------------+-------------------------------
一般情况下(hop-by-hop选项首部例外),扩展首部在数据包的传递过程中,中间的任何节点不会检测和处理,一直到这个ipv6首部中目的地址所标识的那个节点。
特例:hop-by-hop选项首部,携带了包的传送路径中的每个节点都必须检测和处理的信息。包括源节点和目的节点。如果HOP-BY-HOP选项首部存在,就必须紧跟在ipv6首部后面。
2、扩展首部出现的顺序
当在同一个包中使用多个扩展首部时,建议按如下顺序排列这些扩展首部:
ipv6 header
hop-by-hop options header (HOP-BY-HOP首部)
destionaion options header (目的地址选项首部)
routing header (路由首部)
fragment header (分片首部)
authentication header (认证首部)
encapsulating security payload header 封装安全载荷首部
destination options header (目的地址选项首部)
upper-layer header 上层协议首部
3、选项
在hop-by-hop和目的地址选项首部,包含若干个以类型-长度-值格式进行编码的选项,格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+------------------
| option type | opt data len |options data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+------------------
Option type: 8bit,标识选项类型;
Opt data len: 8bit 选项数据字段的长度;
Option data:可变长度,依选项类型而不同的数据;
选项类型的最高两个比特,指明当IPV6节点无法识别这个选项时的处理方式:
00: 跳过这个选项,继续处理首部
01:丢弃这个包
10:丢弃这个包,并给源地址发送一个“参数错误”的icmp,同时指针指向无法识别的选项类型
11:丢弃这个包,并且如果目的地址不是组播地址时,给源地址发送一个参数错误的icmp,同时指针指向无法识别的选项类型
选项的第三个比特:
0:选项数据不会改变选路
1:选项数据可能改变选路
4、Hop-by-Hop选项头部
用IPV6首部的”下一个首部“为
0(0x00)来标识,此选项头部用于传送在数据包的传送路径中每个节点都必须检测的可选信息。格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | hdr ext len | |
| |
. .
. options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next header: 8bits, 紧跟在hop-by-hop选项首部后面的首部类型式
Hdr Ext len:8 bits hop-by-hop选项首部的长度,不包括开始的8个八位组
options: 可变长度,包含一个或多个TLV的选项
5、路由首部
next header = 43标识;用于IPV6源节点列出到目的节点的路径中所应"访问"的一个或多个中间节点,格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next header: 8bit 紧跟在路由首部后面的首部类型
Hdr Ext Len: 8bit 路由首部长度,不包括开始的8个八位组
Routing Type: 8bit 标识路由头部类型
Segements left:8bit 到达目的节点前仍然应当访问的中间节点数
type-specific data: 可变长度,格式由路由类型(routing type)来决定
6、分片首部
next header = 44标识;在ipv6中,只有源节点才可以分片,中间路由器不能分片,当发送的数据包长度大于MTU时,就需要分片,分片首部的格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | reserved | fragment offset | Res | m |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
next header: 8bit 同上
reserved : 3bit,保留
fragment offset: 13bit,分片偏移量。首部后面的数据相对于原包中可分片部分的开始位置处的偏移量
Res:2bit,保留,用0填充,接收时忽略
M flag:标识是否还有分片(1: 分片;0:最后一个分片)
Identification:32 bit,标识符
例子如下图:

7、目的选项首部
next header = 60标识,用于携带仅需要目的节点检测的可选信息。格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next header | hdr ext len | |
| |
. .
. options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
next header: 8bit 同上
Hdr Ext Len: 8bit 目的选项首部长度,不包括开始的8个八位组
options:可变长度。一个或多个TLV格式的选项
8、无下一个首部:
next header = 59 (0x3b)