Skip to content

NDP 邻居发现与无状态自动配置

IPv4 用 ARP 解析 MAC、用免费 ARP 做 DAD、用 DHCP 自动获取地址——三套不同机制各管一摊。IPv6 把这些功能统一收编到一个协议里:NDP(Neighbor Discovery Protocol,邻居发现协议)。NDP 借助 ICMPv6 新增的报文类型,完成了地址解析、重复检测、网关发现、自动配置等全部任务。本文是 HCIA IPv6 系列的收官篇。


🧬 NDP 与 ICMPv6

NDP 不是独立协议号,它通过 ICMPv6 的新增报文类型实现。NDP 涉及的 5 种 ICMPv6 报文类型如下:

Type 133 · RS
Router Solicitation
主机找路由器要网关信息
Type 134 · RA
Router Advertisement
路由器周期性通告网关与前缀
Type 135 · NS
Neighbor Solicitation
解析邻居 MAC / 做 DAD
Type 136 · NA
Neighbor Advertisement
响应 NS,告诉对方自己的 MAC
Type 137 · Redirect
重定向
告诉主机有更好的下一跳

📝 NDP 对比 IPv4 的三大机制

地址解析(IP→MAC)
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 项核心任务:

  1. DAD:重复地址检测(替代免费 ARP)
  2. ND:邻居发现(替代 ARP)
  3. 自动配置:无状态 SLAAC / 有状态 DHCPv6
  4. 路径 MTU 发现:PMTUD
  5. ICMP 重定向:通知更优下一跳

本文重点讲解 DAD、ND、自动配置,这三项是 HCIA 必须掌握的核心。


🛡️ 1. DAD 重复地址检测

任何 IPv6 单播地址(LLA 或 GUA)在配置到接口后,都必须经过 DAD 才能正式使用。

DAD 流程

text
接口 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 对比

IPv4 ping 10.1.12.2
1. 查路由表 → 有路由
2. 封装:sip 10.1.12.1 / dip 10.1.12.2 / dmac ?
3. ARP 表无条目 → 发 ARP Request(广播)
4. 收到 ARP Reply → 更新 ARP 表 → 用解析到的 dmac 转发
IPv6 ping fe80::2
1. 查 IPv6 路由表 → 有路由
2. 封装:sip fe80::1 / dip fe80::2 / dmac ?
3. ND 表无条目 → 发 NS(Type 135)
4. 收到 NA(Type 136)→ 更新 ND 表 → 用解析到的 dmac 转发
NS · Neighbor Solicitation(Type 135)
sip = fe80::1
dip = ff02::1:FF00:2
target = fe80::2
option: source mac = AR1
NA · Neighbor Advertisement(Type 136)
sip = fe80::2
dip = fe80::1
smac = AR2 / dmac = AR1
option: 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 地址:

RA · Router Advertisement(Type 134)
sip
路由器 LLA(FE80::*
dip
FF02::1(本链路所有主机)
prefix
2001:db8:1::/64
lifetime
preferred lifetime / valid lifetime

主机的合成过程:

text
收到 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,缩短地址获取时延:

主机
路由器
RS(Type 133)→
← RA(Type 134)

SLAAC 配置示例

text
# 主机侧
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。

text
# 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:

RA Flags:M / O
M=0 / O=0
全部走 SLAAC,不向 DHCPv6 请求任何信息
M=0 / O=1
地址用 SLAAC,DNS/SIP 等附加信息走 DHCPv6
M=1 / O=0 或 1
地址和其他信息都通过 DHCPv6

💡 最佳实践(M=0, O=1)

地址通过 SLAAC 自动获取(无需 DHCPv6 管理地址),DNS 等附加信息通过 DHCPv6 集中管理(便于统一变更)。M=0, O=1 是兼顾灵活性和可控性的首选组合。

text
# 路由器同时启用 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 表项分多状态,反映邻居"是否仍可达":

text
Empty → Incomplete(已发 NS 待 NA)→ Reachable
              ↓(超时)
              Stale → Delay → Probe → (回)Reachable
状态含义
Empty无缓存
Incomplete已发 NS,等待 NA
Reachable邻居可达,确认生效
Stale可达时间超时,未知是否仍可达
DelayStale 状态下需向该邻居发数据,等待 5 秒
ProbeDelay 超时未收到数据,发送单播 NS 探测

📝 HCIA 知道这层即可

邻居状态机的全套细节(Probe 触发条件、超时阈值)属于 HCIP+ 深度内容,HCIA 层级理解"Reachable 表示可用、Stale 表示可能过期"即可。完整状态机详见 HCIP IPv4/IPv6 综合笔记


⚖️ IPv4 ARP vs IPv6 NDP 全景对照

维度IPv4IPv6
地址解析ARP Request 广播NS 组播(请求节点)
重复检测免费 ARPDAD(NS / NA)
获取网关DHCPv4 option 3RS / RA
获取前缀子网掩码推断RA 直接携带前缀
自动地址DHCPv4 全过程SLAAC(RA + EUI-64)
是否广播是(ARP 广播)否(组播定向,无广播)
表项名称ARP 表ND 表

💡 IPv4 用三个协议,IPv6 用一个

NDP 把 ARP、免费 ARP、自动配置三件事整合在 ICMPv6 框架内,命名、报文结构、状态机都统一了。学习 IPv6 时抓住"NS/NA 用于邻居,RS/RA 用于网关"两条主线即可理清全部行为。


🧪 综合配置实验

text
# 路由器侧(连主机接口)
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

验证:

text
# 查看 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 辅助

真人撰写written by human