0%

IPv6报文

IPv6报文是一种可变长报文,由“固定首部”和“载荷数据”两部分组成:

  1. 固定首部:从Version字段到Destination Address字段为止”,长度40字节。
  2. 载荷数据:IPv6报文数据,长度范围为[0字节,65535字节],数据的最前面部分是0-N个扩展首部。

整个IPv6报文长度范围为[40字节,65535字节+40字节=65575字节]


表1(IPv6报文固定首部的示意)

IPv6 Packet Fixed Header Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Version (4 bits) Traffic Class (8 bits) Flow Label (20 bits)
4 32 Payload Length (16 bits) Next Header (8 bits) Hop Limit (8 bits)
8 64 Source Address (128 bits)
12 96
16 128
20 160
24 192 Destination Address (128 bits)
28 224
32 256
36 288

表2(IPv6报文的整体示意)

IPv6 Packet Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Version (4 bits) Traffic Class (8 bits) Flow Label (20 bits)
4 32 Payload Length (16 bits) Next Header (8 bits) Hop Limit (8 bits)
8 64 Source Address (128 bits)
12 96
16 128
20 160
24 192 Destination Address (128 bits)
28 224
32 256
36 288
40 320 Payload Data (variable bits)
44 352
48 384
52 416
56 448
... ...

一、固定首部

1.1、Version

中文名:版本

长度:4 bits。

含义:指明IP协议版本号,IPv6版本的话其值为0110

1.2、Traffic Class

中文名:通信量类

长度:8 bits。

含义:为了区分不同的IPv6报文的类别或优先级,和IPv4的区分服务(DS)字段作用相似。

1.3、Flow Label

中文名:流标号

长度:20 bits。

含义:IPv6新支持资源预分配机制,具体是可以给流设定一个服务质量目标,然后所有属于该流的IPv6报文在所经过的实现该新机制的路由器上都会被保证提供所需的服务质量。流标号就用来标识本IPv6报文属于哪一个流,全置为0表示不属于任何一个流。实时数据(比如“音频”,“视频”等)应用流机制能够大大改善服务质量,非实时数据(比如“网页”,“电子邮件”等)没有太大必要应用流机制。

备注:“通信量类对应的区分服务机制”和“流标号对应的资源预分配机制”是可自定义IP网络服务质量的两种机制。

1.4、Payload Length

中文名:载荷数据长度

长度:16 bits。

含义:IPv6报文除固定首部之外的长度(单位是“字节”,最大值为2^16-1=65535),包括“可能存在的扩展首部”。

1.5、Next Header

中文名:下一个首部的类型值

长度:8 bits。

含义:详见“二、扩展首部”小节内容。

1.6、Hop Limit

中文名:跳数限制

长度:8 bits。

含义:生存时间,用于限制IPv6报文在网络上的生存时间,防止IPv6报文在网络中无限循环堵塞网络。跳数限制,每经过一个路由器转发就减去1,减至0后被路由器丢弃。即IPv4报文中的“生存时间”字段,只不过这里命名更加准确。

1.7、Source Address

中文名:源IPv6地址

长度:128 bits。

含义:源IPv6地址。

1.8、Destination Address

中文名:目的IPv6地址

长度:128 bits。

含义:目的IPv6地址。

二、扩展首部

首先介绍扩展首部:

  1. 扩展首部置于IPv6报文的载荷数据中
  2. 现在定义了多种扩展首部,常见的如下:
    • Hop-by-Hop Options Header
    • Routing Header
    • Fragment Header
    • Destination Options Header
    • Authentication Header(本文只作提及,详细介绍见IPsec博文
    • Encapsulating Security Payload Header(本文只作提及,详细介绍见IPsec博文
  3. 所有的扩展首部大小都为8字节的倍数
  4. 每种扩展首部有个类型值,IP报文(包括IPv4报文和IPv6报文)的每种上层协议也有个类型值,由于“上层协议报文具有首部”,以上两者类型值本质一致[3]。固定首部和扩展首部中的Next Header字段值指向“下一个首部(扩展首部/上层协议首部)的类型值”,据此构成一条[固定首部] -> [扩展首部集合] -> [上层协议]链路
  5. 对于扩展首部的出现具有一定限制:
    • 每种扩展首部只能出现一次,除了“Destination Options Header”。“Destination Options Header”最多允许出现2次:1)在“Routing Header”存在前提下,一次出现在“Routing Header”之前;2)一次出现在上层协议数据之前(本质是上层协议首部之前)
    • 多个扩展首部的出现须遵从如下合法顺序

扩展首部合法出现顺序:

  1. Hop-by-Hop Options Header
  2. Destination Options Header
  3. Routing Header
  4. Fragment Header
  5. Destination Options Header
  6. Upper Layer Data / Upper Layer Header

2.1、Hop-by-Hop Options Header

中文名:逐跳选项首部

首部类型:扩展首部。

首部类型值:0

含义:承载传送路径上每个节点都必须处理的选项信息。

首部格式见下表,说明如下:

  • Next Header:下一个首部的类型值
  • Header Extension Length:扩展首部长度,以8字节为单位(即当值为11=3时,表示3*8=24个字节),另外有:1)这个长度不包括前面8个字节,即整个扩展首部长度为(1 + Header Extension Length) * 8字节;2)根据1有整个扩展首部长度字节数为8的倍数,且大于等于8字节
  • Options:扩展首部数据,由多个TLV (Type-Length-Value) Encoded Option + Padding构成
Hop-by-Hop Options Header Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Next Header (8 bits) Header Extension Length (8 bits)
4 32 Options (variable bits)
8 64
... ...

2.2、Destination Options Header

中文名:目的选项首部

首部类型:扩展首部。

首部类型值:60

含义:

  • 承载只需目的节点处理的选项信息
  • 如前所述可能出现在两个位置:1)路由扩展首部之前,此时该扩展首部被目的节点和路由头中指定的节点处理;2)上层协议数据之前,此时该扩展首部只能被目的节点处理

首部格式见下表(跟“2.1、Hop-by-Hop Options Header”一致),说明如下:

  • Next Header:下一个首部的类型值
  • Header Extension Length:扩展首部长度,以8字节为单位(即当值为11=3时,表示3*8=24个字节),另外有:1)这个长度不包括前面8个字节,即整个扩展首部长度为(1 + Header Extension Length) * 8字节;2)根据1有整个扩展首部长度字节数为8的倍数,且大于等于8字节
  • Options:扩展首部数据,由多个TLV (Type-Length-Value) Encoded Option + Padding构成
Destination Options Header Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Next Header (8 bits) Header Extension Length (8 bits)
4 32 Options (variable bits)
8 64
... ...

2.3、Routing Header

中文名:路由首部

首部类型:扩展首部。

首部类型值:43

含义:通过列出IPv6报文到达目的地所要经过的节点列表来提供路由选择功能。

首部格式见下表,说明如下:

  • Next Header:下一个首部的类型值
  • Header Extension Length:扩展首部长度,以8字节为单位(即当值为11=3时,表示3*8=24个字节),另外有:1)这个长度不包括前面8个字节,即整个扩展首部长度为(1 + Header Extension Length) * 8字节;2)根据1有整个扩展首部长度字节数为8的倍数,且大于等于8字节
  • Routing Type:路由类型
  • Segments Left:到达目的地还需要访问的节点数量
  • Type-Specific Data:跟具体路由类型有关的具体扩展首部数据
Routing Header Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Next Header (8 bits) Header Extension Length (8 bits) Routing Type (8 bits) Segments Left (8 bits)
4 32 Type-Specific Data (variable bits)
8 64
12 96
... ...

2.4、Fragment Header

中文名:分片首部

首部类型:扩展首部。

首部类型值:44

含义:对IPv6报文进行分片时,用于保存分片信息。

IPv6与IPv4的分片机制不同:

  • 在IPv4中,分片可以在发送源节点和中间路由节点进行,故发送源节点和中间路由节点只需基于“紧邻路径链路层MTU”来做是否分片决策
  • 在IPv6中,分片只能在发送源节点做,这导致发送源节点必须基于“所经过全路径最小链路层MTU”才能做是否分片决策。针对于此,IPv6中有两种解决方案:
    1. 使用“路径MTU发现(Path MTU Discovery,PMD,具体参见RFC 1191)”机制来获得“所经过全路径最小链路层MTU
    2. 使发送报文大小不大于1280字节,因为IPv6协议规定运行IPv6的所有链路都必须能够支持最小1280字节大小的报文

首部格式见下表,说明如下(可参比《IPv4报文》中的“1.5、标识、标志和片偏移”小节):

  • Next Header:下一个首部的类型值
  • Reserved:保留值,当前为全0
  • Fragment Offset:当报文不分片时,片偏移字段无实际意义;当报文分片时,片偏移字段的含义是:分片内数据相对于原报文内数据的偏移量,偏移量的具体计算公式为偏移字节数/8
  • Res:保留值,当前为全0
  • M Flag:
    • MF=1:表示后面还有分片
    • MF=0:1)在分片情形中,表示已是若干分片中最后一个;2)在未分片情形中,表示即原报文本身
  • Identification:分片标识
Fragment Header Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Next Header (8 bits) Reserved (8 bits) Fragment Offset (13 bits) Res (2 bits) M (1 bit)
4 32 Identification (32 bits)

三、最终格式

3.1、没有扩展首部

+------------------+-----------------------------------+
|                  |                                   |
|    Fixed Header  |           Upper Layer Data        |
|                  |                                   |
+------------------+-----------------------------------+
                   |                                   |
                   <------------Payload Data-----------> 

3.2、有扩展首部


+------------------+-----------------------------------+--------------------------------+
|                  |                                   |                                |
|                  |     Hop-by-Hop Options Header     |                                |
|   Fixed Header   |     Destination Options Header    |       Upper Layer Data         |  
|                  |     Routing Header                |                                |
|                  |     Fragment Header               |                                |
|                  |                                   |                                +
+------------------+-----------------------------------+------------------------------+-+-
                   |                                                                    |
                   <------------------------------Payload Data--------------------------> 

参考文献

[1]https://en.wikipedia.org/wiki/IPv6_packet
[2]https://datatracker.ietf.org/doc/html/rfc8200
[3]https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
[4]https://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml

您的支持将鼓励我继续分享!