地址是怎么自动配出来的:SLAAC、RA 与 DHCPv6
IPv4 里我们习惯了"插上网线 → 找 DHCP 要地址"。IPv6 的做法完全不同:主力是无状态自动配置(SLAAC),由路由器用一条通告消息"广播"给整条链路。理解这条消息,就理解了 IPv6 地址分配的全过程。
一、三个角色
| 角色 | 职责 |
|---|---|
| 主机 | 监听链路通告,自己生成地址 |
| 路由器 | 周期性发送 RA(路由器通告),告知前缀与默认网关 |
| DHCPv6 服务器(可选) | 提供地址或额外配置(DNS、NTP 等) |
注意关键差别:路由器是"通知方",不是"分配方"。它不记录谁用了哪个地址,也不做地址池管理——主机自己算自己的地址。
二、RA:一条消息决定一切
RA(Router Advertisement,ICMPv6 类型 134,RFC 4861)由路由器周期性发送(默认间隔 200~600 秒),主机也可以主动发 RS 请求立即获得。它携带的关键信息:
| 字段/选项 | 作用 |
|---|---|
| 前缀信息(PIO) | 网络前缀、长度(通常 /64)、有效期 |
| A 标志 | 该前缀允许主机用 SLAAC 生成地址 |
| M 标志 | 主机应通过 DHCPv6 获取地址(有状态) |
| O 标志 | 主机应通过 DHCPv6 获取其他配置(无状态) |
| Router Lifetime | 默认网关的有效期,为 0 表示"我不是默认网关" |
| 源链路层地址 | 网关的 MAC,用于直接通信 |
| MTU 选项 | 告知链路 MTU,避免 PMTUD 黑洞 |
| RDNSS 选项 | 直接下发 DNS 服务器地址(RFC 8106) |
三、三种典型组合
组合一:纯 SLAAC(最常见)
M=0, O=0, A=1
主机用 RA 里的前缀 + 自己生成的 64 位接口标识,拼出完整地址。DNS 靠 RA 中的 RDNSS 选项下发。这是家庭网络和现代企业网的默认形态——没有任何服务器也在工作。
组合二:SLAAC + DHCPv6 无状态
M=0, O=1
地址仍由 SLAAC 生成,但 DNS、NTP、域名后缀等参数从 DHCPv6 获取。适合需要集中下发多个配置项的场景。
组合三:DHCPv6 有状态
M=1
地址与配置全部由 DHCPv6 服务器提供,管理方式接近传统 DHCPv4。适合需要**精确记录"谁用了哪个地址"**的合规场景。
四、一个必须知道的事实:Android 只支持 SLAAC
Android 不实现 DHCPv6 客户端。 这意味着:
- 在网络里,只要有 RA 且
A=1,Android 设备就能上网; - 如果网络被配置成"只有 DHCPv6 有状态、RA 里把 A 位置 0",Android 设备将无法获得地址。
这不是 Android 的"缺陷",而是当年的设计取舍。但实践中它影响巨大:给访客网络做 IPv6 规划时,务必同时开启 SLAAC。 只靠 DHCPv6 的方案会让大量手机用户上不了 IPv6。
五、接口标识如何生成
得到 /64 前缀后,后 64 位接口标识的生成方式:
| 方式 | 特点 |
|---|---|
| EUI-64 | 由 MAC 地址变换(插入 ff:fe、反转 U/L 位),可被追踪,现已不推荐 |
| 隐私扩展 | 随机生成,定期更换(RFC 4941),Windows/macOS/Linux 默认开启 |
| 稳定隐私 | 用密钥 + 前缀稳定派生(RFC 7217),既保护隐私又保持稳定 |
这就是为什么同一台手机会"每次连 Wi-Fi 地址都不一样"——那是隐私保护在工作,不是配置错误。
六、地址的三个状态
SLAAC 生成的地址不是"有或没有"这么简单,而是有生命周期:
tentative(候选,正在做 DAD 检测)
↓ 检测通过
preferred(首选,正常收发)
↓ 超过 preferred lifetime
deprecated(弃用,还能用但不用于新连接)
↓ 超过 valid lifetime
invalid(失效,彻底移除)
所以一台设备同时挂 3~5 个 IPv6 地址非常正常:链路本地 + 若干 GUA(含新旧前缀、含临时地址)。看到地址多不要慌,看状态和有效期。
七、排障速查表
| 现象 | 优先怀疑 |
|---|---|
有 fe80:: 但没有 2xxx: 地址 |
没收到 RA,或收到但 A=0 且无 DHCPv6 |
| 有 GUA 但没有默认路由 | RA 的 Router Lifetime = 0,或 RA 来自非网关设备 |
| 有地址能 ping 通网关,但打不开网页 | 没收到 RDNSS,DNS 未配置 |
| 地址每隔一段时间变化 | 隐私扩展的正常行为 |
| Android 设备上不了 IPv6,电脑可以 | 网络只开了 DHCPv6 有状态,关掉了 SLAAC |
| 重启路由器后地址全变 | 运营商重新下发了不同前缀(PD 变更) |
八、常用查看命令
| 系统 | 命令 | 看什么 |
|---|---|---|
| Windows | ipconfig /all |
是否有 2xxx: GUA、默认网关、DNS |
| Windows | netsh interface ipv6 show route |
是否有 ::/0 默认路由 |
| Windows | netsh interface ipv6 show neighbors |
邻居缓存(NDP 结果) |
| Linux | ip -6 addr show |
地址与状态(valid_lft/preferred_lft) |
| Linux | ip -6 route show |
默认路由与 RA 学到的路由 |
| Linux | rdisc6 <网卡> |
主动监听并打印 RA 内容(需 ndisc6 工具) |
| macOS | ifconfig / ndp -rn |
地址列表 / 邻居与默认路由器表 |
第三条命令 rdisc6 值得记住:当"为什么没拿到地址"时,直接看 RA 里到底有没有前缀、A 位开没开,比猜快得多。
小结
- IPv6 地址分配的主角是 RA + SLAAC,DHCPv6 是可选增强。
- RA 里的 M/O/A 三个标志位决定了设备从哪里拿地址、从哪里拿配置。
- Android 只支持 SLAAC,访客网络必须保留 SLAAC。
- 一台设备多个地址、地址会变,都是隐私保护机制的正常表现。
下一篇:《IPv6 与 DNS:AAAA 记录与双栈解析》。