本页目录
IPv6 协议
128 位地址终结了 NAT 的统治——SLAAC 自动配置、简化的固定长度头部、原生 IPSec 支持。理解 IPv6 不只是"地址变长了",它的邻居发现和地址自动配置模型和 IPv4 完全不同。
概述
IPv6 是 IPv4 的后继协议,1998 年由 RFC 2460 定义(2017 年更新为 RFC 8200)。核心改进:128 位地址(从 43 亿到 3.4×10³⁸)、固定 40 字节 header(无 options 开销、无 checksum)、原生安全(IPsec 支持)和无状态地址自动配置(SLAAC)。当前全球 IPv6 部署约 40-50%,但移动网络(4G/5G)和大型云提供商已广泛使用。过渡期将长期存在 Dual-Stack 和 NAT64/DNS64 等共存技术。
IPv6 Header: 40 bytes, 固定
0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|Traffic Class| Flow Label |
| (4) | (8 bits) | (20 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
| (16 bits, ≥0) | (8 bits) | (8 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
| (128 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
| (128 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
与 IPv4 header 的关键差异:
移除的:
IHL: 无 → header 固定 40B
Header Checksum: 无 → L2 CRC + L4 checksum 足够, 每 hop 重算 checksum 浪费
Identification/Flags/Fragment Offset: 无 → 端点分片 (PMTUD for IPv6)
Options: 移入 extension headers
新增的:
Flow Label: 20 bits → 标记 flow (多用于 ECMP hash + QoS)
Next Header: 取代 Protocol → 但也可指向 extension header 链
保留的:
Traffic Class ≈ DSCP + ECN
Hop Limit ≈ TTL
Flow Label
20-bit 伪随机标记,由发送方选择,同一 flow 的所有包相同。设计目标: 让路由器/交换机只用 Flow Label + Src/Dst IP 就能区分 flow,不需要解析 L4 端口 (可能被 IPsec ESP 加密)。
实践中: Linux 用 skb->hash 生成随机 Flow Label (net.ipv6.auto_flowlabels=1) — 每 TCP 连接一个。
Next Header 与 Extension Header 链
基本:
Next Header = 6 (TCP) → 直接指向 TCP header
Extension header 链:
IPv6 Header (Next Header=0, Hop-by-Hop)
→ Hop-by-Hop Options Header (Next Header=43, Routing)
→ Routing Header (Next Header=44, Fragment)
→ Fragment Header (Next Header=6, TCP)
→ TCP Header + Data
每个 EH 格式:
[Next Header (1)] [Hdr Ext Len (1)] [Options (variable)]
→ 必须 8-byte 对齐
EH 顺序 (RFC 8200):
1. Hop-by-Hop Options (type 0)
2. Destination Options (type 60) — for processing at intermediate destinations
3. Routing (type 43)
4. Fragment (type 44)
5. Authentication Header (AH, type 51)
6. Encapsulating Security Payload (ESP, type 50)
7. Destination Options (type 60) — for processing at final destination
8. Upper Layer (TCP=6, UDP=17, ICMPv6=58)
安全: RH0 (Type 0 Routing Header) 已废弃 — 源路由可用于 DDoS 放大攻击
(攻击者: 包 → Host A → Host B → Host A → ... 无限循环)
IPv6 Fragmentation (只在端点)
IPv6 与 IPv4 不同 — 路由器永不分片 (IPv6 DF 永为 1)。超过链路的包 → 路由器丢弃 + ICMPv6 Packet Too Big (type 2, code 0)。
端点用 Fragment Extension Header:
[Fragment EH: Next Header=6, Reserved, Fragment Offset, M flag, Identification]
[original packet fragment: 从 offset 开始]
SLAAC 深入
地址生成流程
1. 接口 up → 生成 link-local 地址: fe80::/64 + IID
2. DAD: 验证 link-local 地址唯一 → 通过 → tentative → preferred
3. RS (Router Solicitation):
ICMPv6 type 133, src=:: (unspecified) or link-local, dst=ff02::2 (all-routers)
可选 Option: Source Link-Layer Address
4. RA (Router Advertisement):
ICMPv6 type 134, src=router's link-local, dst=unicast (response to RS)
含 Option: Prefix Information, MTU, Source Link-Layer Address
Prefix Information Option:
Type=3, Len=4 (32 bytes)
Prefix Length: (1 byte, 通常 64)
L (on-link): 此 prefix 在同一个链路上 → 可以直接通信
A (autonomous): 用此 prefix 做 SLAAC
Valid Lifetime: 地址有效 (UINT32_MAX ≈ 无限 or 具体值)
Preferred Lifetime: 地址偏好 (≤ Valid Lifetime)
Prefix: (16 bytes)
5. 生成 global unicast address:
前缀来自 RA + IID (来自隐私扩展 or EUI-64)
6. DAD again for global address
7. 如 M flag (Managed) set in RA → 额外 DHCPv6 获取 DNS/NTP/etc
如 O flag (Other Config) set → DHCPv6 仅获取 DNS (地址仍用 SLAAC)
隐私扩展 (RFC 8981)
永久地址 (EUI-64 based):
自动生成, 稳定, 适合服务器
临时地址 (随机 IID):
valid_lifetime ≤ 24h (短期)
preferred_lifetime ≤ 24h (更短)
周期性: 生成新 random IID + 新 IP → 旧 IP deprecated → 旧 IP removed
→ 外向连接用临时地址 (隐私), 内向连接用永久地址 (可达)
Linux:
sysctl net.ipv6.conf.default.use_tempaddr=2 # prefer temporary for outbound
过渡技术
| 技术 | 原理 | 使用 |
|---|---|---|
| Dual Stack | 同时跑 IPv4+IPv6 | 理想,但需要 IPv4 快耗尽 |
| DS-Lite | IPv4-in-IPv6 隧道到 AFTR | ISP 提供 |
| NAT64 + DNS64 | IPv6-only 客户端访问 IPv4 服务 | 移动网络 (T-Mobile US) |
| 464XLAT | CLAT (客户端翻译) + PLAT (运营商翻译) | 运营商级 NAT64 |
参考
- RFC: 8200 (IPv6), 4862 (SLAAC), 8201 (PMTUD), 8981, 4291 (地址架构)
- 源码:
net/ipv6/目录,include/net/ipv6.h
Keywords: IPv6, extension header, SLAAC, RA, RS, DAD, privacy extensions, Dual Stack, NAT64, DNS64