简介
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