V6IPv6Hub

进阶篇 · 搞懂机制

邻居发现协议 NDP:IPv6 世界的"ARP" - IPv6Hub

NDP邻居发现地址解析

本页目录

  1. 一、NDP 的五个消息
  2. 二、地址解析:组播如何替代广播
  3. 三、DAD:上线前的自检
  4. 四、邻居缓存状态机
  5. 五、与 IPv4 的对照
  6. 六、动手观察
  7. 小结

邻居发现协议 NDP:IPv6 世界的"ARP"

IPv4 里用 ARP 把 IP 地址翻译成 MAC 地址。IPv6 没有 ARP,取而代之的是 NDP(Neighbor Discovery Protocol,RFC 4861)。它不只是"ARP 的替代品",而是一套统一了地址解析、路由器发现、地址自检和路径优化的机制。

一、NDP 的五个消息

NDP 运行在 ICMPv6 之上,使用类型 133~137:

消息 类型 作用
RS Router Solicitation 133 主机问:"有路由器吗?"
RA Router Advertisement 134 路由器答:"我在这,前缀是……"
NS Neighbor Solicitation 135 "谁是 2001:db8::B?"
NA Neighbor Advertisement 136 "我是,我的 MAC 是……"
Redirect 137 "去那个目标请走另一个网关,更近"

一次 IPv6 通信涉及的完整流程:

① 找网关  → RS / RA          (路由器发现)
② 配地址  → 前缀 + 自生成 ID  (SLAAC,见前一篇)
③ 自检    → NS 到自身地址      (DAD 重复地址检测)
④ 找邻居  → NS / NA           (地址解析,即"IPv6 的 ARP")
⑤ 转发    → Redirect(可选)   (路径优化)

二、地址解析:组播如何替代广播

IPv4 的 ARP 请求是广播:整条链路所有设备都要处理一遍。IPv6 改用请求节点组播(Solicited-Node Multicast),只通知该被打扰的那台设备。

映射规则(RFC 4291):取目标地址的低 24 位,拼到固定前缀 ff02::1:ff00:0/104 上。

目标地址        2001:db8:abcd:1::abcd:1234
取低 24 位                              cd:1234
请求节点组播    ff02::1:ffcd:1234

这意味着解析 2001:db8::1 时,只有低 24 位相同的那些设备会收到并处理这条消息——在典型网络里往往就只有目标那一台。

顺带的收益:开销随链路上设备数基本不变,而广播方案的开销会线性增长。这也是 IPv6 在大型二层网络中更"安静"的原因。

三、DAD:上线前的自检

在正式使用一个地址前,主机必须先做重复地址检测(DAD):

  1. 向该地址对应的请求节点组播发 NS,源地址用未指定地址 ::;
  2. 如果收到任何 NA 应答,说明地址已被占用,标记为重复并停止使用;
  3. 如果超时无应答,地址可用。

所以一个刚配好的地址会经历 tentative → preferred 的状态变化。用 ip -6 addr 看到 tentative 字样时,说明检测正在进行,属正常现象。

DAD 也可能带来一个副作用:如果某台设备刻意对所有 NS 都回 NA(恶意或故障),整条链路的地址自检都会失败。这类问题在受管交换机上可用 NDP 监控(RFC 7039 定义了相关 MIB)来发现。

四、邻居缓存状态机

NDP 不是"解析一次就永久记住",而是有一套精细的可达性检测状态机(RFC 4861 第 7.3.2 节):

INCOMPLETE  → 已发 NS,等待 NA
REACHABLE   → 最近确认可达(有超时)
STALE       → 曾可达,但已过期,未验证
DELAY       → 准备验证,先等一会儿看是否有上层确认
PROBE       → 正在发 NS 验证

实际意义:IPv6 会持续、温和地验证邻居是否还在。如果一台设备静默下线,邻居缓存会在几十秒到几分钟内探测到并把流量送到别处(或丢弃),比 IPv4 里"ARP 表缓存几分钟、期间黑hole"的体验更好。

五、与 IPv4 的对照

能力 IPv4 IPv6
地址解析 ARP(广播) NS/NA(组播)
路由器发现 ICMP Router Discovery(几乎不用) RA/RS(标准且必需)
地址自检 无(靠人工/冲突检测) DAD(协议内置)
路径优化 ICMP Redirect Redirect(同)
承载协议 独立的 ARP 协议 ICMPv6
认证 无 SEND(RFC 3971,部署极少)

注意最后一行:NDP 原生没有认证机制。SEND(Secure Neighbor Discovery)虽然定义了认证方案,但部署率极低。这意味着 NDP 消息天然可被伪造——这正是下一篇《IPv6 安全基础》要处理的问题。

六、动手观察

系统 命令
Windows netsh interface ipv6 show neighbors
Linux ip -6 neigh show
macOS ndp -an
抓包 Wireshark 过滤 icmpv6.type == 135 || icmpv6.type == 136

在浏览器里打开任何一个 IPv6 站点,然后立刻执行上面的命令,你会看到邻居条目从 INCOMPLETE 变成 REACHABLE,这就是 NDP 在工作的全过程。

小结

下一篇:《IPv6 安全基础:NDP 欺骗、RA 攻击与防护要点》。

← IPv6 与 DNS:AAAA 记录与双栈解析 IPv6 安全基础:NDP 欺骗、RA 攻击与防护要点 →