IPv6 Internet Protocol version 6协议解析

发布时间 2023-09-20 17:59:42作者: 秋来叶黄

简介

1883定义了ipv6的协议,不过作废了,在2460又重新做了定义,区别不大,只是有个别字段做了扩充。

2373和2374对ipv6的格式做了规定。

ipv6是下一代ip地址协议,比ipv4的地址更长,可以表示更多地址段。不过由于ipv6地址太长,不方便记忆,并且ipv4的基础设施太过根深蒂固,所以目前还没有完全普及。虽然很多企业或者高校都使用或者支持了ipv6,但是目前还是以ipv4为主。

ipv6还会带来性能问题,因为地址从32位编程128位,增加了匹配解析的时间。

但是ipv6精简了head,一些不是必须的标识都放置到扩展字段,比如ip分片,因为并不是每一个数据包都需要ip分片,所以ipv4 head中必须包含分片字段就浪费了很多空间。

由于ipv6地址边长,可表达的ip地址增多,理论上可以为地球上所有介入的设备分配一个ip地址,也就是大家都可以直接互联,而不需要ipv4这种有一个跳板机,只能通过跳板机连接其他机器。ipv4之所以有跳板机和中间路由,就是因为不能为每个设备分配唯一ip地址,因为地址有重复,只能通过路由器等设备,一层层分发。从这方面来说,ipv6减少了中间步骤,有更好的传输率。

协议头

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version| Traffic Class |           Flow Label                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Payload Length        |  Next Header  |   Hop Limit   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                                                               +
   |                                                               |
   +                         Source Address                        +
   |                                                               |
   +                                                               +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                                                               +
   |                                                               |
   +                      Destination Address                      +
   |                                                               |
   +                                                               +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

version 版本 4bit

内容是6,标识ipv6

Traffic Class 数据流类型 8bit

1883与2460的区别也就是这个标识。标识当前数据流是视频,还是音频等分类。

Flow Label 流标识符 20bit

Payload Length 数据长度 16bit 无符号

表示有多少字节。这里需要注意,payload长度不包括ipv6的固定头,但是包括扩展的头长度。按照rfc2460所述,是从固定头向后所有数据都叫做payload(有效载荷)。

Next Header 下一个头 8-bit

就是指明ipv6包含的payload是什么协议,在这里会说明(tcp/udp)。

Hop Limit 8-bit

没转发一次,减1,当为0时,丢掉改包。

Source Address 源地址 128-bit

Destination Address 目标地址 128-bit

ipv6 扩展头

ipv6扩展头有几种类型,数据格式都会有一个next header,标明下一个扩展是什么内容,或者说下一块数据是什么内容

   +---------------+------------------------
   |  IPv6 header  | TCP header + data
   |               |
   | Next Header = |
   |      TCP      |
   +---------------+------------------------
标准的ipv6头,next header是tcp,下面紧跟的是tcp数据

   +---------------+----------------+------------------------
   |  IPv6 header  | Routing header | TCP header + data
   |               |                |
   | Next Header = |  Next Header = |
   |    Routing    |      TCP       |
   +---------------+----------------+------------------------
增加了一个routing扩展,所以固定头的next header是routing。routing header后面是tcp,所以next header是tcp

   +---------------+----------------+-----------------+-----------------
   |  IPv6 header  | Routing header | Fragment header | fragment of TCP
   |               |                |                 |  header + data
   | Next Header = |  Next Header = |  Next Header =  |
   |    Routing    |    Fragment    |       TCP       |
   +---------------+----------------+-----------------+-----------------
增加了routing和分片

每个扩展头长度必须是8的倍数。目前有如下扩展

           Hop-by-Hop Options
           Routing (Type 0)
           Fragment
           Destination Options
           Authentication
           Encapsulating Security Payload

后两个扩展由rfc2402和rfc2406定义

ipv6扩展头顺序

ipv6如果有多个扩展头,需要按照一下数据设置:


           IPv6 header
           Hop-by-Hop Options header
           Destination Options header (note 1)
           Routing header
           Fragment header
           Authentication header (note 2)
           Encapsulating Security Payload header (note 2)
           Destination Options header (note 3)
           upper-layer header

扩展头格式

扩展头格式定义了两种,一个是逐跳选项头和目标选项头。

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
      |  Option Type  |  Opt Data Len |  Option Data
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -

      Option Type          8-bit identifier of the type of option.

      Opt Data Len         8-bit unsigned integer.  Length of the Option
                           Data field of this option, in octets.

      Option Data          Variable-length field.  Option-Type-specific
                           data.

Opetion Type

最高的两位表明了,如果无法解析当前扩展头内容,如何处理。

      00 - skip over this option and continue processing the header.

      01 - discard the packet.

      10 - discard the packet and, regardless of whether or not the
           packet's Destination Address was a multicast address, send an
           ICMP Parameter Problem, Code 2, message to the packet's
           Source Address, pointing to the unrecognized Option Type.

      11 - discard the packet and, only if the packet's Destination
           Address was not a multicast address, send an ICMP Parameter
           Problem, Code 2, message to the packet's Source Address,
           pointing to the unrecognized Option Type.

最高位的第三位表明了当前扩展头是否可以在传输中修改

      0 - Option Data does not change en-route

      1 - Option Data may change en-route

扩展头设置,必须严格按照顺序,解析也同样要严格按照顺序执行,不可跳过特定扩展而解析下一个。

除了表示路由的,每种扩展头只能有一个。

扩展头必须字节对齐,具体对齐规则,请参考rfc2460

Hop-by-Hop Options Header 逐跳选项头

逐跳扩展会携带一些信息,每一个路由都需要对信息进行检测

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
    |                                                               |
    .                                                               .
    .                            Options                            .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Next Header

8-bit selector
下一个数据的类型

Hdr Ext Len

8-bit unsigned integer
扩展数据长度,表示几个字节,不包含第一个字节。

Options

可变长度。扩展内容。必须字节对齐。

Routing Header 路由扩展头

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |  Routing Type | Segments Left |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    .                                                               .
    .                       type-specific data                      .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Next Header

8-bit selector
下一个数据类型

Hdr Ext Len

8-bit unsigned integer
数据长度,表示多少字节。不包括第一个字节。

Routing Type

8-bit
路由类型

Segments Left

8-bit unsigned integer
剩余路由数量

type-specific data

可变长度

Fragment Header 分片扩展头


   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Next Header  |   Reserved    |      Fragment Offset    |Res|M|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Identification                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Next Header

8-bit selector

Reserved

8-bit reserved field
保留字段,填充0

Fragment Offset

13-bit unsigned integer
距离原始数据开头的字节数偏移

Res

2-bit reserved field
保留字段,填充0

M flag

1 = more fragments
0 = last fragment.

Identification

32 bits
用来标识是哪一组分片,或者说是属于哪一个数据包。必须与其他分片id区分,在可能存活的声明周期内不可以重复。

Destination Options Header 目的扩展头

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
    |                                                               |
    .                                                               .
    .                            Options                            .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

用来为接收数据端传递额外信息

Next Header

8-bit selector

Hdr Ext Len

8-bit unsigned integer
表示多少字节长度,不包括第一个字节

Options

可变长度

https://www.rfc-editor.org/rfc/rfc1883.html
https://www.rfc-editor.org/rfc/rfc2373.html
https://www.rfc-editor.org/rfc/rfc2374.html
https://www.rfc-editor.org/rfc/rfc2460.html
https://www.rfc-editor.org/rfc/rfc2402
https://www.rfc-editor.org/rfc/rfc2406
https://en.wikipedia.org/wiki/IPv6