邻居发现协议 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):
- 向该地址对应的请求节点组播发 NS,源地址用未指定地址
::; - 如果收到任何 NA 应答,说明地址已被占用,标记为重复并停止使用;
- 如果超时无应答,地址可用。
所以一个刚配好的地址会经历 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 在工作的全过程。
小结
- NDP 用 5 个 ICMPv6 消息统一承担了路由器发现、地址解析、重复地址检测与重定向。
- 地址解析靠请求节点组播,只打扰低 24 位相同的设备,比 ARP 广播安静得多。
- DAD 是协议内置的地址冲突保护,是 IPv6 相比 IPv4 的实打实改进。
- NDP 默认无认证,这是 IPv6 接入层需要额外防护的根本原因。
下一篇:《IPv6 安全基础:NDP 欺骗、RA 攻击与防护要点》。