IPv6 数据报与扩展首部
IPv6 首部的设计哲学
IPv4 首部像一张"万能表格",有选项、有校验和、有分片字段,路由器处理起来复杂。IPv6 的设计者决定:固定格式、简化处理、扩展靠后。
IPv6 首部固定 40 字节,没有选项、没有校验和、没有分片字段(分片移到扩展首部)。路由器处理 IPv6 首部时,只需读取固定字段,不需要像 IPv4 那样重新计算校验和,速度更快。
IPv6 固定首部结构
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class | Flow Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Source Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1. Version(版本,4 位)
固定为 0110(6)。
2. Traffic Class(流量类别,8 位)
完全复用 IPv4 的 TOS/DSCP/ECN 语义:
- 前 6 位:DSCP
- 后 2 位:ECN
3. Flow Label(流标签,20 位)
IPv6 新增字段,用于标识同一流的数据报。例如一条视频通话的所有包可以标记相同的 Flow Label,路由器识别后做相同处理(走相同路径、相同 QoS 队列),避免对每个包重新分类。
注意:Flow Label 目前实际部署较少,很多路由器忽略该字段。
4. Payload Length(有效载荷长度,16 位)
不包括首部,只表示后面跟着多少字节(扩展首部 + 上层数据)。最大 65535 字节。
特殊值 0 表示"超大载荷"(Jumbogram,超过 65535 字节),需配合 Hop-by-Hop 选项使用。
5. Next Header(下一个首部,8 位)
IPv6 最重要的设计之一。它告诉路由器"我后面跟着什么":
| 值 | 含义 |
|---|---|
| 6 | TCP |
| 17 | UDP |
| 58 | ICMPv6 |
| 0 | Hop-by-Hop 选项 |
| 43 | Routing 首部 |
| 44 | Fragment 首部 |
| 50 | ESP(IPsec) |
| 51 | AH(IPsec) |
| 60 | Destination 选项 |
6. Hop Limit(跳数限制,8 位)
等同于 IPv4 的 TTL,每经一跳减 1,到 0 丢弃。
7. Source / Destination Address(各 128 位)
IPv6 地址,各占 16 字节。
扩展首部链(Extension Header Chain)
IPv6 把选项从固定首部中移出,变成独立的扩展首部,像火车车厢一样串在固定首部后面:
[IPv6 固定首部] → [扩展首部 1] → [扩展首部 2] → ... → [TCP/UDP/ICMPv6]
Next=0 Next=43 Next=44 Next=6
每个扩展首部的第一个字节都是 Next Header,形成链表结构。
标准顺序(RFC 8200 规定)
- Hop-by-Hop Options(逐跳选项):每个路由器都必须处理
- Destination Options(目的地选项 1):中间路由器不处理,目的主机处理
- Routing Header(路由首部):源路由,类似 IPv4 的松散源路由
- Fragment Header(分片首部):IPv6 分片信息
- AH(认证首部):IPsec 认证
- ESP(封装安全载荷):IPsec 加密
- Destination Options(目的地选项 2):最终目的地处理
- Upper Layer(上层协议):TCP/UDP/ICMPv6
路由器处理规则
- 必须处理:Hop-by-Hop、Routing(部分类型)
- 不处理直接跳过:Fragment、AH、ESP、Destination Options
- 如果路由器遇到不认识的扩展首部,且 Hop-by-Hop 标志置位,返回 ICMPv6 "参数问题"
关键扩展首部详解
1. Fragment 扩展首部(Next Header=44)
IPv6 不允许中间路由器分片,只有源主机可以分片。分片信息存在 Fragment 首部:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Reserved | Fragment Offset |Res|M|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Fragment Offset:13 位,单位 8 字节(同 IPv4)
- M(More Fragments):1 位,1=后面还有分片
- Identification:32 位(比 IPv4 的 16 位更大,减少冲突概率)
注意:IPv6 的 Identification 是 32 位,IPv4 只有 16 位。16 位在高速网络中容易回绕(Wrap Around),导致分片重组错误。
2. Routing 扩展首部(Next Header=43)
允许源主机指定包必须经过的节点列表,类似"旅游攻略指定必经景点"。
Type 0(已废弃):曾被用于攻击(绕过防火墙、放大攻击),RFC 5095 废弃。 Type 2:用于移动 IP(Mobile IPv6),长度固定 4 字节,只含一个地址。
3. Hop-by-Hop 选项
包含所有中间路由器必须检查的选项。常见选项:
- Jumbo Payload:Payload Length=0 时,在此声明真实长度(可超过 65535)
- Router Alert:提示路由器"这个包需要额外注意"(如 RSVP、MLD)
IPv4 vs IPv6 首部对比
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 首部长度 | 可变 20~60 字节 | 固定 40 字节 |
| 校验和 | 有,路由器需重新计算 | 无,提升转发速度 |
| 选项 | 嵌入首部,路由器慢路径处理 | 扩展首部链,多数跳过 |
| 分片 | 路由器可分片 | 仅源主机分片 |
| 地址长度 | 32 位 | 128 位 |
| Identification | 16 位 | 32 位(在 Fragment 首部) |
| DSCP/ECN | TOS 字段 | Traffic Class 字段 |
| 流标识 | 无 | Flow Label(20 位) |
IPv6 的设计哲学可以总结为:固定格式、简化处理、扩展靠后。取消校验和是因为链路层 CRC 和传输层校验和已经足够可靠,路由器重新计算校验和是纯粹的 CPU 浪费。
本篇小结
- IPv6 首部固定 40 字节,无校验和,无选项,无分片字段
- Next Header 形成扩展首部链表,类似"车厢挂钩"
- 扩展首部标准顺序:Hop-by-Hop → Destination → Routing → Fragment → AH → ESP → Destination → Upper Layer
- 路由器只处理 Hop-by-Hop 和 Routing,其余跳过
- IPv6 分片仅源主机执行,Identification 32 位更安全
动手实践
Wireshark 抓取 IPv6 流量(如
ping -6 fe80::1%eth0),观察固定首部字段对比同一连接的 IPv4 和 IPv6 包大小:IPv6 首部比 IPv4 多 20 字节,但省掉了校验和计算
Wireshark 过滤
ipv6.nxt == 44,观察 Fragment 扩展首部思考:为什么 IPv6 取消首部校验和能提高路由器转发速度?如果链路层 CRC 检错率 99.99%,传输层 TCP 也有校验和,IP 层校验和是否冗余?