飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • IP协议

    • 认识 IP 协议与网络层定位
    • IPv4 编址体系与分类地址
    • CIDR 与子网划分实战
    • IPv6 编址体系
    • ARP 协议详解
    • NDP 协议详解
    • IGMP 与 MLD 组播侦听发现
    • VRRP 与网关冗余
    • IPv4 数据报首部解析
    • IPv6 数据报与扩展首部
    • IPsec 安全扩展
    • 分片、MTU 与路径发现
    • ICMP 与 Traceroute 原理
    • 路由基础与转发流水线
    • 动态路由协议
    • NAT 网络地址转换
    • DHCP 与自动配置
    • Wireshark 与命令行工具
    • IPv6 过渡技术
    • IP 协议栈排障与攻击防御
  • TCP协议

    • 认识 TCP 协议与传输层定位
    • TCP 报文段首部解析
    • 三次握手与连接建立
    • 四次挥手与连接释放
    • TCP 有限状态机
    • 序列号与确认机制
    • 超时重传与 RTO 计算
    • 滑动窗口与流量控制
    • 拥塞控制基础
    • 现代拥塞控制算法
    • TCP 选项与扩展
    • TCP 性能调优与内核参数
    • Nagle 算法与糊涂窗口综合征
    • TCP 定时器与 Keep-Alive 机制
    • TCP 安全与攻击防御
    • TCP 与上层/下层交互
    • TCP 综合实践与排障

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 最重要的设计之一。它告诉路由器"我后面跟着什么":

值含义
6TCP
17UDP
58ICMPv6
0Hop-by-Hop 选项
43Routing 首部
44Fragment 首部
50ESP(IPsec)
51AH(IPsec)
60Destination 选项

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 规定)

  1. Hop-by-Hop Options(逐跳选项):每个路由器都必须处理
  2. Destination Options(目的地选项 1):中间路由器不处理,目的主机处理
  3. Routing Header(路由首部):源路由,类似 IPv4 的松散源路由
  4. Fragment Header(分片首部):IPv6 分片信息
  5. AH(认证首部):IPsec 认证
  6. ESP(封装安全载荷):IPsec 加密
  7. Destination Options(目的地选项 2):最终目的地处理
  8. 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 首部对比

特性IPv4IPv6
首部长度可变 20~60 字节固定 40 字节
校验和有,路由器需重新计算无,提升转发速度
选项嵌入首部,路由器慢路径处理扩展首部链,多数跳过
分片路由器可分片仅源主机分片
地址长度32 位128 位
Identification16 位32 位(在 Fragment 首部)
DSCP/ECNTOS 字段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 位更安全

动手实践

  1. Wireshark 抓取 IPv6 流量(如 ping -6 fe80::1%eth0),观察固定首部字段

  2. 对比同一连接的 IPv4 和 IPv6 包大小:IPv6 首部比 IPv4 多 20 字节,但省掉了校验和计算

  3. Wireshark 过滤 ipv6.nxt == 44,观察 Fragment 扩展首部

  4. 思考:为什么 IPv6 取消首部校验和能提高路由器转发速度?如果链路层 CRC 检错率 99.99%,传输层 TCP 也有校验和,IP 层校验和是否冗余?

上一页
IPv4 数据报首部解析
下一页
IPsec 安全扩展