NDP 邻居发现与无状态自动配置
IPv4 用 ARP 解析 MAC、用免费 ARP 做 DAD、用 DHCP 自动获取地址——三套不同机制各管一摊。IPv6 把这些功能统一收编到一个协议里:NDP(Neighbor Discovery Protocol,邻居发现协议)。NDP 借助 ICMPv6 新增的报文类型,完成了地址解析、重复检测、网关发现、自动配置等全部任务。本文是 HCIA IPv6 系列的收官篇。
🧬 NDP 与 ICMPv6
NDP 不是独立协议号,它通过 ICMPv6 的新增报文类型实现。NDP 涉及的 5 种 ICMPv6 报文类型如下:
Router Solicitation
主机找路由器要网关信息
Router Advertisement
路由器周期性通告网关与前缀
Neighbor Solicitation
解析邻居 MAC / 做 DAD
Neighbor Advertisement
响应 NS,告诉对方自己的 MAC
重定向
告诉主机有更好的下一跳
📝 NDP 对比 IPv4 的三大机制
IPv4: ARP Request/Reply
IPv6: NS / NA(Type 135 / 136)
IPv4: 免费 ARP
IPv6: DAD(NS/NA,Type 135 / 136)
IPv4: DHCP 选项
IPv6: RS / RA(Type 133 / 134)
NDP 一个协议干了 IPv4 三个机制的活,且都在 ICMPv6 框架内,便于统一管理。
🔍 NDP 五大功能
NDP 一共承担 5 项核心任务:
- DAD:重复地址检测(替代免费 ARP)
- ND:邻居发现(替代 ARP)
- 自动配置:无状态 SLAAC / 有状态 DHCPv6
- 路径 MTU 发现:PMTUD
- ICMP 重定向:通知更优下一跳
本文重点讲解 DAD、ND、自动配置,这三项是 HCIA 必须掌握的核心。
🛡️ 1. DAD 重复地址检测
任何 IPv6 单播地址(LLA 或 GUA)在配置到接口后,都必须经过 DAD 才能正式使用。
DAD 流程
接口 up,配置地址 fe80::1
↓
地址标记为 tentative(试验地址),此时不接收业务流量
↓
发送 NS(Type 135):
sip = ::(未指定地址,自己还在试验阶段)
dip = ff02::1:FF00:1 (自己的请求节点组播)
target= fe80::1
↓
若无人回复 NA:试验结束,地址转正,正常转发
若有冲突:对端回复 NA(Type 136)
├─ 接口标记为 duplicate(地址冲突,不可用)
└─ 控制台显示 "duplicate" 或 "DAD failed"💡 对比 IPv4 免费 ARP
- 免费 ARP:广播问"有人用这个 IP 吗",被动等待无人回应即视为可用;若有冲突,没有统一的处置流程。
- DAD:用组播(仅少数设备侦听,效率更高)+ 明确的 tentative/duplicate 状态机,处置更规范。
先 LLA 后 GUA:接口同时配多个地址时,DAD 从 LLA 开始,依次对每个 GUA 各做一次 DAD。
🤝 2. ND 邻居发现(地址解析)
IPv6 没有 ARP 表,但有NDP 邻居缓存表(ND表),作用等价于 IPv4 的 ARP 表。
IPv4 ARP vs IPv6 ND 对比
2. 封装:
sip 10.1.12.1 / dip 10.1.12.2 / dmac ?3. ARP 表无条目 → 发 ARP Request(广播)
4. 收到 ARP Reply → 更新 ARP 表 → 用解析到的 dmac 转发
2. 封装:
sip fe80::1 / dip fe80::2 / dmac ?3. ND 表无条目 → 发 NS(Type 135)
4. 收到 NA(Type 136)→ 更新 ND 表 → 用解析到的 dmac 转发
sip = fe80::1dip = ff02::1:FF00:2target = fe80::2option: source mac = AR1
sip = fe80::2dip = fe80::1smac = AR2 / dmac = AR1option: target mac = AR2
IPv4 广播 / IPv6 请求节点组播
IPv4 单播 ARP Reply / IPv6 单播 NA
IPv4 ARP 表 / IPv6 ND 表
IPv4 独立 ARP / IPv6 ICMPv6 Type 135/136
⚠️ NS 的"组播定向"优势
IPv4 ARP 用广播,全网设备都中断一下做 ARP 询问。IPv6 的 NS 用请求节点组播(FF02::1:FF + 目标单播后 24 bit),只有后 24 bit 匹配的少数设备才被唤醒。在大型二层网络上显著减少无效扰动。
🌐 3. 无状态自动配置(SLAAC)
主路由器周期性(200~600 秒)发送 RA(Type 134) 报文,主机收到后将 RA 中的前缀 + EUI-64 自动拼成自己的 GUA 地址:
路由器 LLA(
FE80::*)FF02::1(本链路所有主机)2001:db8:1::/64preferred lifetime / valid lifetime
主机的合成过程:
收到 RA 前缀 2001:db8:1::/64
+
本接口 EUI-64 :02E0:FCFF:FEC5:6BE9
↓
合成 GUA: 2001:db8:1::2E0:FCFF:FEC5:6BE9/64
↓
对该地址做 DAD → 通过 → 正式使用💡 RS / RA 触发流程
主机刚启动时不等周期 RA,会主动发 RS(Type 133) 立即请求路由器回复 RA,缩短地址获取时延:
SLAAC 配置示例
# 主机侧
interface GigabitEthernet 0/0/0
ipv6 enable
ipv6 address auto global # 通过 SLAAC 获取 GUA
ipv6 address auto link-local # 自动生成 LLA
# 路由器侧
interface GigabitEthernet 0/0/0
undo ipv6 nd ra halt # 使能 RA 发送(默认是 halt)⚠️ RA 默认是关闭的
华为 VRP 默认在接口上不发送 RA,需要 undo ipv6 nd ra halt 显式开启。这与 Linux 路由默认行为不同,是个常见配置陷阱。
🏭 4. 有状态自动配置(DHCPv6)
当需要统一管理地址、DNS、SIP 等参数时(企业严格的地址溯源场景),用 DHCPv6。
# DHCPv6 Server
ipv6
dhcp enable
#
dhcpv6 pool POOL_A
address prefix 3FFF::/64
dns-server 3FFF::1
#
interface GigabitEthernet 0/0/0
dhcpv6 server POOL_A
# DHCPv6 Client
interface GigabitEthernet 0/0/0
ipv6 address auto dhcp⚠️ DHCPv6 默认不分配网关
DHCPv6 的标准行为不通过 DHCP 下发网关,网关信息依旧靠 RA 学习。这与 DHCPv4 形成鲜明对比——IPv4 的 option 3 直接给网关。这就是为什么 DHCPv6 不能完全取代 RA 的原因。
🔀 5. M/O flag:无状态 + 有状态混合
RA 报文里的两个标志位决定主机如何配合 SLAAC 和 DHCPv6:
M=0 / O=0M=0 / O=1M=1 / O=0 或 1💡 最佳实践(M=0, O=1)
地址通过 SLAAC 自动获取(无需 DHCPv6 管理地址),DNS 等附加信息通过 DHCPv6 集中管理(便于统一变更)。M=0, O=1 是兼顾灵活性和可控性的首选组合。
# 路由器同时启用 RA + DHCPv6(地址 SLAAC,参数 DHCPv6)
interface GigabitEthernet 0/0/0
undo ipv6 nd ra halt
ipv6 nd autoconfig other-flag # O=1,其他信息走 DHCPv6
ipv6 nd autoconfig managed-address-flag # M=0,地址不用 DHCPv6(默认)
dhcpv6 server POOL_A📊 邻居缓存状态机简述
ND 表项分多状态,反映邻居"是否仍可达":
Empty → Incomplete(已发 NS 待 NA)→ Reachable
↓(超时)
Stale → Delay → Probe → (回)Reachable| 状态 | 含义 |
|---|---|
| Empty | 无缓存 |
| Incomplete | 已发 NS,等待 NA |
| Reachable | 邻居可达,确认生效 |
| Stale | 可达时间超时,未知是否仍可达 |
| Delay | Stale 状态下需向该邻居发数据,等待 5 秒 |
| Probe | Delay 超时未收到数据,发送单播 NS 探测 |
📝 HCIA 知道这层即可
邻居状态机的全套细节(Probe 触发条件、超时阈值)属于 HCIP+ 深度内容,HCIA 层级理解"Reachable 表示可用、Stale 表示可能过期"即可。完整状态机详见 HCIP IPv4/IPv6 综合笔记。
⚖️ IPv4 ARP vs IPv6 NDP 全景对照
| 维度 | IPv4 | IPv6 |
|---|---|---|
| 地址解析 | ARP Request 广播 | NS 组播(请求节点) |
| 重复检测 | 免费 ARP | DAD(NS / NA) |
| 获取网关 | DHCPv4 option 3 | RS / RA |
| 获取前缀 | 子网掩码推断 | RA 直接携带前缀 |
| 自动地址 | DHCPv4 全过程 | SLAAC(RA + EUI-64) |
| 是否广播 | 是(ARP 广播) | 否(组播定向,无广播) |
| 表项名称 | ARP 表 | ND 表 |
💡 IPv4 用三个协议,IPv6 用一个
NDP 把 ARP、免费 ARP、自动配置三件事整合在 ICMPv6 框架内,命名、报文结构、状态机都统一了。学习 IPv6 时抓住"NS/NA 用于邻居,RS/RA 用于网关"两条主线即可理清全部行为。
🧪 综合配置实验
# 路由器侧(连主机接口)
ipv6
#
interface GigabitEthernet 0/0/0
ipv6 enable
ipv6 address 2001:db8:1::1/64
undo ipv6 nd ra halt # 开启 RA
ipv6 nd autoconfig other-flag # O=1,其他信息走 DHCPv6
# 主机侧
interface GigabitEthernet 0/0/0
ipv6 enable
ipv6 address auto global # 通过 RA + EUI-64 自动获取
ipv6 address auto link-local # 自动生成 LLA验证:
# 查看 ND 表(等价 IPv4 的 ARP 表)
display ipv6 neighbors
# 查看接口 ND / RA 状态
display ipv6 interface GigabitEthernet 0/0/0🤖 AI伴学
NDP 思维迁移自 ARP/DHCP 时容易把 DAD、ND、SLAAC 三件事混淆。建议用 AI 当陪练:
"我正在学 IPv6 NDP。请按 ICMPv6 Type 编号依次讲解 133~137 五种报文,每个报文给我一个抓包样例的 sip/dip/target 字段让我写出 NDP 状态。最后让我判断这两种地址(FE80 和 2001 GUA)在哪一步走 DAD、何时走 ND。"
想了解如何用 AI 生成 NDP 故障排查脚本,请参考 实践任务:网络基础的 AI 辅助。
