Skip to content

IPv6 地址、SLAAC 与双栈迁移 ​

内容摘要:IPv4 地址 32 位已耗尽(01、07),IPv6(RFC 8200)用 128 位地址与简化的头部重新设计了网络层。本章讲清 IPv6 地址结构与分类、扩展头、依赖 ICMPv6/NDP(06)的无状态自动配置(SLAAC)、DHCPv6,以及现实中最重要的双栈共存与迁移(含 Happy Eyeballs)。

难度:中级 | 前置知识:06 NDP 邻居发现、07 IPv4 编址 | 所属层次:网络层(L3)

一、为什么需要 IPv6 ​

  • 地址耗尽:IPv4 约 43 亿地址早已分配殆尽,NAT(19)只是缓解、破坏了端到端连通性。IPv6 有 2¹²⁸ ≈ 3.4×10³⁸ 个地址。
  • 头部简化:IPv6 固定 40 字节头,取消头部校验和(交给上层与链路层 CRC,03)、取消路由器分片(改由源端 PMTUD,09),转发更高效。
  • 即插即用:SLAAC 让主机无需 DHCP 即可自动获址(本章第四节)。
  • 内建能力:邻居发现(NDP)、地址自动配置、组播替代广播(06)。

二、IPv6 报文头 ​

字段位宽语义对应 IPv4说明
版本46版本—
流量类别8DSCP+ECNTOSQoS(QoS 与高可用)
流标签20标识同一流无便于按流处理/ECMP(10)
载荷长度16载荷字节数(不含本头)总长度—
下一个头(Next Header)8上层协议或扩展头类型协议解复用键 + 扩展头链(02)
跳数限制(Hop Limit)8每跳减 1,0 则丢弃TTL语义同 TTL(07)
源/目的地址各 128端到端地址源/目的 IP—

设计对比:IPv6 头固定 40 字节且字段更少(无 IHL、无分片字段、无头校验和),可选功能移到扩展头。这让核心路由器转发更快,代价是扩展头链解析复杂度(见下)。

三、扩展头(Extension Headers) ​

IPv6 用扩展头链承载可选功能,通过「下一个头」字段串联:

扩展头用途处理者
逐跳选项(Hop-by-Hop Options)每跳都要检查(如 Jumbogram、路由器告警)每个路由器
路由(Routing)指定途经节点(部分类型因安全弃用)途经节点
分片(Fragment)仅源端分片(IPv6 路由器不分片)源与目的
目的选项(Destination Options)仅目的处理目的主机
认证/封装安全载荷(AH/ESP)IPsec(VPN 与隧道)端点

安全与性能注意:扩展头链可被滥用(超长头链、分片规避检测),防火墙需能穿透解析(防火墙与访问控制、网络安全)。IPv6 分片只在源端做——若路径 MTU 不足,路由器回送 ICMPv6「Packet Too Big」,源端据此减小(PMTUD,09)。

四、IPv6 地址表示与分类 ​

1、表示法 ​

128 位写作 8 组 16 位十六进制,用 : 分隔,可压缩:

  • 前导零省略:2001:0db8:0000:0000:0000:0000:0000:0001 → 2001:db8:0:0:0:0:0:1
  • 连续全零段用 :: 压缩一次:→ 2001:db8::1(:: 全文只能出现一次)
  • 前缀:2001:db8::/32,前缀长度同 CIDR 思想(07),接口 ID 通常占后 64 位(/64 是最常见的子网)。

2、地址分类 ​

类型前缀作用域说明
链路本地(Link-Local)fe80::/10单链路每个 IPv6 接口必有,NDP/路由协议用它,不跨路由器
全局单播(GUA)2000::/3(如 2001:db8::/32 文档)全球可路由到公网的「公网 IPv6」
唯一本地(ULA)fc00::/7(实际 fd00::/8)站点内类似 IPv4 私有地址(07)
组播(Multicast)ff00::/8视范围IPv6 无广播,全用组播(ff02::1=所有节点)
环回::1/128本机等价 127.0.0.1
未指定::/128—等价 0.0.0.0

关键认知:IPv6 一个接口通常同时有多个地址——至少一个 fe80:: 链路本地 + 一个(或多个)全局单播。这与「一接口一 IP」的 IPv4 直觉不同,排障时要全部查看(分层故障排查)。

3、本机实测(macOS,2026-09-07) ​

bash
# macOS
ifconfig en0 | grep inet6
# Linux
ip -6 addr show dev eth0

真实输出(全局地址已按规范脱敏为 2001:db8::/32 文档前缀,保留真实的 flags 语义):

text
inet6 fe80::1c95:43f7:963b:b3f8%en0 prefixlen 64 secured scopeid 0xf   ← 链路本地(必有)
inet6 2001:db8:ce00:902d:18ae:21c3:b1d4:183c prefixlen 64 autoconf secured ← 全局(SLAAC 自动配置)

解读:fe80::... 是链路本地地址(%en0 是作用域标识 zone id,链路本地必须带接口名);第二个是 autoconf(SLAAC 自动配置,见下节)得到的全局地址;secured 表示用了 RFC 7217 稳定隐私接口 ID(非基于 MAC,防追踪,见第七节)。一接口两地址,与 IPv4 直觉不同。

五、SLAAC 与 DHCPv6:两种获址方式 ​

1、无状态地址自动配置(SLAAC) ​

SLAAC(Stateless Address Autoconfiguration,RFC 4862) 让主机无需 DHCP 服务器自动配置全局地址,依赖 NDP 的路由器通告(RA,06):

  • 接口 ID 生成:早期用 EUI-64(从 MAC 派生,可被追踪);现代用 RFC 7217 稳定隐私地址或**临时地址(RFC 8981,隐私扩展)**避免追踪(对应本机 secured flag)。
  • RA 标志位决定获址方式:M(Managed,用 DHCPv6 拿地址)、O(Other,用 DHCPv6 拿 DNS 等其他配置)。

2、SLAAC vs DHCPv6 对比 ​

维度SLAACDHCPv6(RFC 8415)
是否需服务器否(靠路由器 RA)是
状态无状态有状态(记录租约)
地址控制主机自选接口 ID服务器集中分配
DNS 下发靠 RA 的 RDNSS 选项或 DHCPv6是
适用家庭/简单网络企业需集中管理/审计

实践:许多网络混用——SLAAC 配地址 + DHCPv6(O 位)下发 DNS。Android 长期不支持有状态 DHCPv6,这是纯 DHCPv6 方案的现实约束([待验证/时效],以设备文档为准)。

六、双栈与迁移(现实重点) ​

IPv4 到 IPv6 不是「一夜切换」,而是长期共存。主流策略是双栈(dual-stack):主机同时拥有 IPv4 与 IPv6,按目标可达性选择。

  • Happy Eyeballs(RFC 8305/8305bis):双栈客户端并发尝试 IPv6 与 IPv4 连接,优先 IPv6 但快速回退,避免「IPv6 配了却不通」导致的长超时。浏览器、curl 等已内建。
  • 过渡技术:NAT64/DNS64(IPv6-only 客户端访问 IPv4 服务)、464XLAT、6to4/6rd/Teredo(隧道,多数已弃用或小众)。
  • 双栈的运维代价:两套地址、两套路由、两套防火墙规则都要维护与验证——「IPv4 通不代表 IPv6 通」,反之亦然,排障必须双协议分别验证(分层故障排查)。

七、最小可复现实验 ​

1、实验目标 ​

  • 查看接口的多个 IPv6 地址与作用域。
  • 验证 IPv6 连通与「一接口多地址」。

2、平台与工具 ​

  • 本机验证环境:macOS 26.6.2,ifconfig、ping6。Linux 用 ip -6。

3、执行命令与本机实测 ​

bash
# 查看 IPv6 地址(本机可跑,见第四节输出)
ifconfig en0 | grep inet6           # macOS
# ip -6 addr show dev eth0          # Linux

# IPv6 连通(本机可跑,仅文档域名 example.com)
ping6 -c 2 example.com              # macOS
# ping -6 -c 2 example.com          # Linux

本机实测 ping6(2026-09-07):

text
16 bytes from 2606:4700:10::ac42:93f3, icmp_seq=0 hlim=43 time=194.882 ms
16 bytes from 2606:4700:10::ac42:93f3, icmp_seq=1 hlim=43 time=221.374 ms
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 194.882/208.128/221.374/13.246 ms

解读:hlim=43(Hop Limit,IPv6 版 TTL)说明经过若干跳;RTT min/avg/max/std-dev = 194/208/221/13ms 展示了分布而非单值(呼应 03 的「不要只看平均值」)。此为本机到公网的单点观测,随位置变化。

4、双栈选路观察(本机可跑) ​

bash
# 对比 A 与 AAAA 记录(DNS,[15](../#三、完整目录))
dig +short example.com A
dig +short example.com AAAA
# curl 默认 Happy Eyeballs;强制指定协议对比
curl -sS -o /dev/null -w 'used=%{remote_ip}\n' -4 https://example.com/   # 强制 IPv4
curl -sS -o /dev/null -w 'used=%{remote_ip}\n' -6 https://example.com/   # 强制 IPv6

5、SLAAC 实验(需 Linux,本环境未执行) ​

在隔离拓扑(20)用 radvd 发 RA,观察客户端 SLAAC 获址与 DAD:

bash
# [未在本环境执行] Linux;router 命名空间发 RA
ip netns exec cli ip -6 addr show dev veth-c   # 观察 autoconf 地址出现
ip netns exec cli ip -6 route show              # 观察默认路由来自 RA

6、结论边界与清理 ​

  • 地址与 RTT 为单机/单点观测;SLAAC 实验须在 Linux 隔离环境执行。只读命令无需清理。

八、错误示例与常见误区 ​

误区纠正
「一个接口只有一个 IPv6 地址」至少链路本地 + 全局,常多个(临时/隐私地址)。
「IPv6 有广播」无广播,全用组播(ff02::1 等)。
「IPv6 路由器会分片」不会;仅源端分片,靠 PMTUD(09)。
「IPv4 通则 IPv6 也通」两套独立栈,需分别验证。
「配了 AAAA 就万事大吉」IPv6 路径若不通,Happy Eyeballs 才能救;服务端与防火墙也要支持 v6。
「链路本地地址能跨路由器」fe80::/10 仅单链路有效,需带 %接口 作用域。

九、性能影响 ​

  • 头部简化:固定头 + 无逐跳校验和,转发更高效;但扩展头链解析可能抵消(性能观测)。
  • PMTUD 依赖:IPv6 强依赖 ICMPv6「Packet Too Big」;若被防火墙误丢,出现黑洞(09、网络安全)——不得盲目禁 ICMPv6(本库红线)。
  • Happy Eyeballs 开销:并发尝试略增连接建立开销,但显著改善「v6 半死不活」时的体验。

十、安全风险与加固 ​

  • 禁用 ICMPv6 会瘫痪 IPv6:ICMPv6 承载 NDP、PMTUD、DAD,不能像某些人对 ICMPv4 那样全禁(09)。需按类型精细放行。
  • RA 欺骗 / RA Guard:伪造 RA 冒充网关或下发恶意前缀(06、网络安全);交换机启用 RA Guard。
  • 隐私地址:EUI-64 暴露 MAC 可被追踪;用 RFC 7217/8981 稳定/临时地址(本机 secured flag)。
  • 双栈攻击面翻倍:防火墙必须同时覆盖 v4 与 v6,否则「v4 拦了、v6 漏了」(防火墙与访问控制)。

十一、版本与平台差异 ​

  • IPv6=RFC 8200、地址架构=RFC 4291、SLAAC=RFC 4862、DHCPv6=RFC 8415、Happy Eyeballs=RFC 8305、稳定接口 ID=RFC 7217、临时地址=RFC 8981。
  • 平台:Linux ip -6、sysctl net.ipv6.*;macOS ifconfig/ping6;Windows netsh interface ipv6。Android 对有状态 DHCPv6 的支持是现实约束。

十二、常见问题与排查方向 ​

  • 「IPv6 拿不到全局地址」:查是否收到 RA、RA 的 M/O 标志、DAD 是否冲突(06)。
  • 「IPv6 能 ping 通但网页打不开」:可能 PMTUD 黑洞(大包被丢)——查是否误丢 ICMPv6 PTB(09)。
  • 「v6 优先但很慢」:Happy Eyeballs 未生效或 v6 路径质量差;对比 -4/-6 时延。
  • 「防火墙对 v6 失效」:确认 v6 规则与 v4 对等(防火墙与访问控制)。

十三、清理与恢复 ​

  • 只读命令无副作用;实验新增地址/路由/radvd 配置用对应 del/停服务清理(见 20)。

十四、关联章节 ​

检索关键词 ​

IPv6 报文头 40 字节 Next Header 扩展头链 IPv6 地址压缩 :: 链路本地 fe80 全局单播 GUA ULA fd00 SLAAC RFC 4862 RA 标志 M O 位 DHCPv6 EUI-64 隐私地址 RFC 7217 双栈 Happy Eyeballs RFC 8305 NAT64 DNS64 ICMPv6 不能全禁

权威来源 ​

  • RFC 8200(IPv6)、RFC 4291(IPv6 地址架构)
  • RFC 4862(SLAAC/DAD)、RFC 8415(DHCPv6)、RFC 4861(NDP)
  • RFC 8305(Happy Eyeballs v2)、RFC 7217(稳定接口 ID)、RFC 8981(临时地址)
  • Linux ip(8)、各操作系统 IPv6 官方文档

报文与地址语义以上述 RFC 为准,verified_at: 2026-09-07;IPv6 地址与 ping6 输出为 macOS 26.6.2 本机真实执行,全局地址已按脱敏规范替换为文档前缀,保留 flags 语义。SLAAC/radvd 实验未在本环境执行(macOS 无 netns/ip)。

ICP 备案号待补充 · Gitee 主页