IPv6 Internet Protocol version 6协议解析
简介
1883定义了ipv6的协议,不过作废了,在2460又重新做了定义,区别不大,只是有个别字段做了扩充。后面8200又做了新的定义,废弃了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减少了中间步骤,有更好的传输率。
这里按照最新的8200做介绍。
协议头
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|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)。
Next Header数值对应的协议可以参考 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
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和分片
除了Hop-by-Hop的扩展头,其余的扩展头在传输路径上都不可被修改。
Hop-by-Hop也不可被插入或者删除,只是允许在途径的每个节点进行检查和处理。如果有Hop-by-Hop扩展头,必须紧跟ipv6固定头后面。
每个扩展头长度必须是8的倍数。目前有如下扩展
Hop-by-Hop Options
Fragment
Destination Options
Routing
Authentication
Encapsulating Security Payload
前4个会在当前文档中介绍,后两个由4302和4303定义。
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
扩展头设置,必须严格按照顺序,解析也同样要严格按照顺序执行,不可跳过特定扩展而解析下一个。
除了表示路由的,每种扩展头只能有一个。
扩展头必须字节对齐,具体对齐规则,请参考rfc4303
所有的扩展头只能出现一次,只有Destination Options header可以出现两次,如上面展示的,一次出现在Routing header前,一次出现在Upper-Layer header前。
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
可变长度
No Next Header
表示后续没有Next Header了
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
https://datatracker.ietf.org/doc/html/rfc8200
https://datatracker.ietf.org/doc/html/rfc4303
https://datatracker.ietf.org/doc/html/rfc4302
https://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏