注:本文为 “IPv6 | 邻居发现 / 邻居状态迁移 / 邻居通信过程” 相关。
图片清晰度受引文原图所限。
略作重排,如有内容异常,请看原文。
IPv6 邻居发现机制
邻居发现协议(Neighbor Discovery Protocol)是 IPv6 协议的一个基本组成部分,使用了下表中的五种类型 ICMPv6 消息:
| ICMPV6 消息 | 类型 | 作用 |
|---|---|---|
| RS (Router Solicitation,路由器请求消息) | 133 | 节点启动后,通过 RS 消息向路由器发出请求,请求前缀和其他配置信息,用于节点的自动配置 |
| RA (Router Advertisement,路由器通告) | 134 | 对 RS 消息进行响应 在没有抑制 RA 消息发布的条件下,路由器会周期性地发布 RA 消息,其中包括前缀信息选项和一些标志位的信息 |
| NS (Neighbor Solicitation,邻居请求) | 135 | 获取邻居的链路层地址 验证邻居是否可达 进行重复地址检测 |
| NA (Neighbor Advertisement,邻居通告) | 136 | 对 NS 消息进行响应 节点在链路层变化时主动发送 NA 消息,向邻居节点通告本节点的变化信息 |
| Redirect,重定向消息 | 137 | 当满足一定的条件时,缺省网关通过向源主机发送重定向消息, 使主机重新选择正确的下一招她址进行后续报文的发送 |
使用表格中的五种 ICMPv6 消息,可以实现在 IPv4 中的地址解析协议 (ARP)、控制报文协议 (ICMP) 中的路由器发现部分、重定向协议的所有功能,并具有邻居不可达检测机制。
下面我们就来一一展开介绍下。
1. 地址解析过程
通过邻居请求消息 NS 和邻居通告消息 NA,可以获取同一链路上邻居节点的链路层地址 (与 IPv4 的 ARP 功能相同)。
首先,节点 B 以组播方式发送 NS 消息。NS 消息的源地址是节点 B 的接口 IPv6 地址,目的地址是节点 A 的被请求节点组播地址,消息内容中包含了节点 B 的链路层地址和请求的目标地址。


接着,节点 A 收到 NS 消息后,判断报文的目标地址是否为自己的 IPv6 地址。如果是,则节点 A 可以学习到节点 B 的链路层地址,并以单播方式返回 NA 消息,其中包含了自己的链路层地址。


最后,节点 B 从收到的 NA 消息中就可获取到节点 A 的链路层地址。
2. 重复地址检查
当节点获取到一个 IPv6 地址后,需要使用重复地址检查功能确定该地址是否已被其他节点使用 (与 IPv4 的免费 ARP 功能相似),避免冲突。通过 NS 和 NA 实现重复地址检测的过程为:
首先,节点 A 发送 NS 消息,NS 消息的源地址是未指定地址::,目的地址是待检测的 IPv6 地址对应的被请求节点组播地址,消息内容中包含了待检测的 IPv6 地址。


如果节点 B 已经使用这个 IPv6 地址,则会返回 NA 消息,其中包含了自己的 IPv6 地址。
节点 A 收到节点 B 发来的 NA 消息,就知道该 IPv6 地址已被使用。反之,则说明该地址未被使用,节点 A 就可使用此 IPv6 地址。

节点 A 收到重复地址检查的NA消息,如果设备上没有表项,不会进行学习;如果自己已有表项,则进行更新。
3. 邻居可达性检测
在获取到邻居节点的链路层地址后,通过邻居请求消息 NS 和邻居通告消息 NA 可以验证邻居节点是否可达。
首先,节点发送 NS 消息,其中目的地址是邻居节点的 IPv6 地址。

如果收到邻居节点的确认报文,则认为邻居可达;否则,认为邻居不可达。

IPv6 邻居状态迁移
RFC4861 定义了 5 种 IPv6 邻居状态,分别是:Incomplete、Reachable、Stale、Delay、Probe,其中只有 Stale 状态是稳定状态。
- Incomplete (未完成状态):表示正在解析地址,但邻居链路层地址尚未确定。
- Reachable (可达状态):表示地址解析成功,该邻居可达。
- Stale (失效状态):表示可达时间耗尽,未确定邻居是否可达。
- Delay (延迟状态):表示未确定邻居是否可达。Delay 状态不是一个稳定的状态,而是一个延时等待状态。
- Probe (探测状态):节点会向处于 Probe 状态的邻居持续发送 NS 报文。
邻居状态变化过程如下图所示:

当没有表项时,如果有流量触发建立新的邻居表项,设备将发送 NS 报文去获取邻居 MAC 地址,此时建立的邻居表项是 Incomplete 状态,MAC 全零。
发送 NS 报文探测对端邻居是否可达后,若尝试 3 次对端都不响应,则删除表项,探测间隔默认 1s。
若目的邻居可达并回复了正确的 NA 报文,则本端邻居表项状态刷新为 Reachable,并更新 MAC。Reachable 状态将维持 30s,之后自动切换成 Stale 状态。
Stale 状态维持的时间又称为老化时间,默认是 240min,老化后表项切换成 Delay 状态。Delay 状态延时 5s,自动切换为 Probe 状态。
邻居表项为 Probe 状态时,发送 NS 报文探测对端是否可达,若尝试 3 次对端不响应,则删除表项。若邻居可达并回复 NA 报文,则本端邻居表项状态刷新为 Reachable。
一文解释 NDP 协议(IPv6 邻居发现协议)& ICMPv6
里晓山已于 2022-05-07 14:29:44 修改
一、前言介绍
NDP 协议是 IPv6 的基础协议,类似于 IPv4 中的 ICMP、ARP 和 DHCP 协议。在 IPv6 网络中,NDP 协议能够实现这些功能。
1.1 NDP 简单说明
NDP(Neighbor Discovery Protocol,邻居发现协议)依赖 ICMPv6 协议来实现。在抓包时,无法直接捕获 NDP 报文,但可以捕获 ICMPv6 报文。NDP 是 IPv6 的关键协议之一,它整合了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等协议,并进行了改进。作为 IPv6 的基础性协议,NDP 提供了前缀发现、邻居不可达检测、重复地址检测、地址自动配置等功能。NDP 利用了 ICMPv6 的部分功能。
1.2 ICMPv6 - Internet 控制报文协议
ICMPv6 是 IPv6 的基础协议之一,用于向源节点传递报文转发的信息或错误。协议类型号(即 IPv6 Next Header)为 58。ICMPv6 不仅提供了 ICMPv4 的对应功能,还具备其他一些功能的基础,例如邻居发现、无状态地址配置、重复地址检测、PMTU 发现等。

消息类型:

1.3 IPv6 和 IPv4 相比有哪些优势?
- IPv4 使用 ARP 广播进行地址解析和重复地址检测。
- IPv6 使用组播形式,减轻设备性能压力。
- IPv6 在三层完成地址解析,适用于更多的链路层(介质独立性)。
- IPv6 在三层完成解析,可以使自身的 IPsec 安全认证机制提高安全性,避免类似 IPv4 中的 ARP 欺骗。
二、IPv6 邻居发现协议 – NDP 详解
在 IPv4 中,当主机需要与目标主机通信时,必须先通过 ARP 协议获得目的主机的链路层地址。在 IPv6 中,同样需要从 IP 地址解析到链路层地址的功能。邻居发现协议实现了这个功能。
ARP 报文直接封装在以太网报文中,以太网协议类型为 0x0806,普遍认为 ARP 定位为第 2.5 层的协议。NDP 本身基于 ICMPv6 实现,以太网协议类型为 0x86DD,即 IPv6 报文,IPv6 下一个报头字段值为 58,表示 ICMPv6 报文。由于 NDP 协议使用的所有报文均封装在 ICMPv6 报文中,一般来说,NDP 被看作第 3 层的协议。在三层完成地址解析,主要带来以下几个好处:
- 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
- 可以使用三层的安全机制避免地址解析攻击。
- 使用组播方式发送请求报文,减少了二层网络的性能压力。
(该协议使用 ICMPv6 协议实现),Wireshark 抓不到 NDP 报文,只能抓到 ICMPv6 报文。
NDP 使用的 ICMPv6 的相关报文 Type 字段
| NDP 报文类型 | 英文全称 | ICMPv6 Type 字段值 | 核心功能 |
|---|---|---|---|
| 路由器请求报文(RS) | Router Solicitation | 133 | 主机主动请求路由器发送配置信息 |
| 路由器通告报文(RA) | Router Advertisement | 134 | 路由器周期性通告网络前缀、网关等配置信息 |
| 邻居请求报文(NS) | Neighbor Solicitation | 135 | 地址解析、重复地址检测(DAD) |
| 邻居通告报文(NA) | Neighbor Advertisement | 136 | 响应 NS 请求、主动通告链路层地址 |
NDP 功能点:
- 路由发现 —— 发现链路上的路由器,获得路由器通告的信息 RS、RA 报文。
- 无状态自动配置 —— 通知路由器通告的地址前缀,终端自动生成 IPv6 地址 NS、NA 报文。
- DAD —— 获得地址后,进行地址重复检测,确保地址不存在冲突 NS、NA 报文。
- 地址解析 —— 请求目的网络地址对应的数据链路层地址,类似 IPv4 的 ARP NS、NA 报文。
- 邻居状态跟踪 —— 通过 NDP 发现链路上的邻居并跟踪邻居状态 NS、NA 报文。
- 前缀重编址 —— 路由器对所通告的地址前缀进行灵活设置实现网络重编址。
- 路由重定向 —— 告知其他设备,到达目标网络的更优下一跳。
| 功能名称 | 核心作用 | 依赖报文 | 实现逻辑简要说明 |
|---|---|---|---|
| 路由发现 | 发现链路上的路由器,获取网关配置 | RS、RA | 主机发送 RS 请求,路由器回复 RA 通告网关信息 |
| 无状态自动配置 | 主机基于 RA 前缀自动生成 IPv6 地址 | RA、NS、NA | RA 提供网络前缀,主机结合接口标识生成地址 |
| 重复地址检测(DAD) | 验证生成的 IPv6 地址是否存在冲突 | NS、NA | 主机向目标地址的组播地址发送 NS,检测冲突 |
| 地址解析 | 从 IPv6 地址解析出对应的链路层(MAC)地址 | NS、NA | 类似 IPv4 ARP,通过 NS 请求、NA 响应实现 |
| 邻居状态跟踪 | 维护邻居节点的可达状态,确保通信有效性 | NS、NA | 定义 5 种邻居状态,通过报文交互实现状态迁移 |
| 前缀重编址 | 灵活调整网络前缀,实现网络地址规划变更 | RA | 路由器更新 RA 中的前缀信息,主机自动适配 |
| 路由重定向 | 告知主机到达目标网络的更优下一跳 | ICMPv6 重定向报文 | 网关检测到更优路径时,向主机发送重定向指令 |
注:NDP 中用于地址解析、DAD 的组播地址均以
FF02::1:FF为前缀,称为“被请求节点组播地址”。
被请求节点组播地址,都是以 FF02::1:FF 开头。
2.1 IPv6 地址解析
- IPv6 的地址解析不再使用 ARP,也不再使用广播方式,而是使用组播进行发送(原来 IPv4 是使用广播进行发送 “who is XXX?”)。
- 地址解析在三层完成,针对不同的链路层协议可以采用相同的地址解析协议。
- 通过 ICMPv6(类型 135 的 NS 及类型 136 的 NA 报文)来实现地址解析。
- NS 报文发送使用组播方式,报文的目的 IPv6 地址为被请求的 IPv6 地址对应的 “被请求节点组播地址”,报文的目的 MAC 为组播 MAC。
- 采用组播的方式发送 NS 消息相比于广播的方式更加高效,也减少了对其他节点的影响和对二层网络的性能压力。
- 可以使用三层的安全机制(例如 IPsec)避免地址解析攻击。
查看 IPv6 邻居表:
IPv6 不像 IPv4 那样使用 ARP 表来缓存 IP 与 MAC 地址的映射,而是维护一个 IPv6 邻居表。
在华为数通设备上,使用 display ipv6 neighbors 查看 IPv6 邻居表。
在 Windows 系统 CMD 中,使用 netsh interface ipv6 show neighbors 查看 IPv6 邻居表。
IPv6 的地址解析:
地址解析过程中使用了两种 ICMPv6 报文:邻居请求报文 NS(Neighbor Solicitation)和邻居通告报文 NA(Neighbor Advertisement)。
- NS 报文:Type 字段值为 135,Code 字段值为 0,在地址解析中的作用类似于 IPv4 中的 ARP 请求报文。
- NA 报文:Type 字段值为 136,Code 字段值为 0,在地址解析中的作用类似于 IPv4 中的 ARP 应答报文。


流程解析:
① R1 要向 R2 发送 ping 包,但不知道对方地址(即 R1 想要知道 R2 的 MAC 地址),所以 R1 会发送 NS 邻居请求报文(源为 R1 的 IPv6 地址),目的地址是(R2 的被请求节点组播地址)(想请求 2001:2 设备的 MAC 地址,即需要解析的目标是 R2 的 IPv6 地址),同时需要指出的是在 NS 报文的 Options 字段中还携带了一个 R1 的 MAC 地址。
② 当 R2 收到 NS 报文后,就会回应 NA 报文,其中源地址为 R2 的 IPv6 地址,目的地址是 R1 的 IPv6 地址(使用 NS 报文中的 R1 的 MAC 地址进行单播),R2 的 MAC 地址被放在 Options 字段中,这样就完成了一个地址解析的过程。
2.1.1 邻居请求(Neighbor Solicitation)NS
- Type = 135,Code = 0
- Target Address 是需要解析的 IPv6 地址,因此该处不准出现组播地址。
- Option 中携带了一个自己源的 MAC 地址


2.1.2 邻居通告(Neighbor Advertisement)NA

- Type = 136,Code = 0
- R 标志(Router flag)表示发送者是否为路由器,如果为 1 则表示是;
- S 标志(Solicited flag)表示发送邻居通告是否是响应某个邻居请求,如果为 1 则表示是(0 例如路由器或 PC 重启后主动发送 RA 邻居通告,类似免费 ARP);
- O 标志(Override flag)表示邻居通告中的消息是否覆盖已有的条目信息,如果为 1 则表示可以覆盖,如果是 0 则表示不可覆盖;
- Target Address 表示所携带的链路层地址对应的 IPv6 地址。
- Options 携带了自己作为源的 MAC 地址

2.2 路由发现(地址解析使用的是 NS 与 NA,路由发现使用 RA 与 RS)
路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。
在 IPv6 中,IPv6 地址可以支持无状态的自动配置,即主机通过机制获取网络前缀信息,然后主机自己生成地址的接口标识部分。路由器发现功能是 IPv6 地址自动配置功能的基础,主要通过以下两种报文实现:
- 路由器通告 RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送 RA 报文,RA 报文中会带有网络前缀信息,及其他一些标志位信息。RA 报文的 Type 字段值为 134。
- 路由器请求 RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送 RS 报文,网络上的设备将回应 RA 报文。RS 报文的 Type 字段值为 133。
地址自动配置:
IPv4 使用 DHCP 实现自动配置,包括 IP 地址,缺省网关等信息,简化了网络管理。IPv6 地址增长为 128 位,且终端节点多,对于自动配置的要求更为迫切,除保留了 DHCP 作为有状态自动配置外,还增加了无状态自动配置。无状态自动配置即自动生成链路本地地址,主机根据 RA 报文的前缀信息,自动配置全球单播地址等,并获得其他相关信息。
IPv6 主机无状态自动配置过程:
- 根据接口标识产生链路本地地址。
- 发出邻居请求,进行重复地址检测。
- 如地址冲突,则停止自动配置,需要手工配置。
- 如不冲突,链路本地地址生效,节点具备本地链路通信能力。
- 主机会发送 RS 报文(或接收到设备定期发送的 RA 报文)。
- 根据 RA 报文中的前缀信息和接口标识得到 IPv6 地址。
2.3 DAD 重复地址检测
重复地址检测 DAD(Duplicate Address Detect)是在接口使用某个 IPv6 单播地址之前进行的,为了探测是否有其他节点使用了该地址。

一个 IPv6 单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。
此时该接口不能使用这个试验地址进行单播通信,但仍然会加入两个组播组:ALL-NODES 组播组和试验地址所对应的 Solicited-Node 组播组。
IPv6 重复地址检测和 IPv4 中的免费 ARP 类似:节点向试验地址所对应的 Solicited-Node 组播组发送 NS 邻居请求报文。NS 报文中目标地址即为该试验地址。如果收到某个其他站点回应的 NA 报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通信。
2.4 跟踪邻居状态
通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。
RFC2461 中定义了 5 种邻居状态:
- INCOMPLETE 未完成,邻居请求已经发送到目标节点的请求组播地址,但没有收到邻居的通告;
- REACHABLE 可达,收到确认,不再发包确认;
- STALE 陈旧,从收到上一次可达性确认后过了超过 30s;
- DELAY 延迟,在 stale 状态后发送过一个报文,并且 5s 内没有可达性确认;
- PROBE 探查,每隔 1s 重传邻居请求来主动请求可达性确认,直到收到确认。
| 状态名称 | 英文全称 | 状态含义 |
|---|---|---|
| INCOMPLETE | 未完成 | 已向目标节点的组播地址发送 NS 请求,但未收到 NA 响应 |
| REACHABLE | 可达 | 已收到 NA 响应,确认邻居可达,无需额外发送检测报文 |
| STALE | 陈旧 | 自上次确认可达后,超过 30s 未进行可达性验证,邻居状态未知 |
| DELAY | 延迟 | STALE 状态下向邻居发送数据后,5s 内未收到可达性确认 |
| PROBE | 探查 | DELAY 状态超时后,每隔 1s 发送单播 NS 请求,主动验证邻居可达性 |
邻居状态之间具体迁移过程:

- A 先发送 NS 报文,并生成缓存条目,此时,邻居状态为 Incomplete。
- 若 B 回复 NA 报文,则邻居状态由 Incomplete 变为 Reachable,否则固定时间后邻居状态由 Incomplete 变为 Empty,即删除表项。
- 经过邻居可达时间,邻居状态由 Reachable 变为 Stale,即未知是否可达。
- 如果在 Reachable 状态,A 收到 B 的非请求 NA 报文,且报文中携带的 B 的链路层地址和表项中不同,则邻居状态马上变为 Stale。
- 在 Stale 状态若 A 要向 B 发送数据,则邻居状态由 Stale 变为 Delay,并发送 NS 请求。
- 在经过一段固定时间后,邻居状态由 Delay 变为 Probe,其间若有 NA 应答,则邻居状态由 Delay 变为 Reachable。
- 在 Probe 状态,A 每隔一定时间间隔发送单播 NS,发送固定次数后,有应答则邻居状态变为 Reachable,否则邻居状态变为 Empty,即删除表项。
从以上的机制可以看出 IPv6 的邻居关系优于 IPv4 的 ARP,IPv6 的邻居关系维护机制确保通讯发起之前邻居是可达的,而 ARP 本身是做不到的,仅仅通过老化机制来实现。
关于邻居状态的维护以及状态迁移可以参考 RFC2461。
注意 1:像 ARP 报文一样,业务报文并不能刷新邻居表项,邻居表项只能靠 NDP(ICMPv6 报文)刷新。
注意 2:即使一直通信,状态仍然会变迁到 stale-delay,只是这个过程是短暂的,因为发送 NS 请求后,一旦对方回复了 NA 则状态又被刷新到 Reachable。
注意 3:如果一直通信,则双方链路正常,则会一直在 Reachable → stale → Delay 状态循环变迁,只是停留在 Stale 和 Delay 状态时间很短。
注意 4:邻居状态是 Reachable、Stale、Delay、Probe 时,表项依然有效,依然可以按邻居表封包发包,Incomplete 不可用。
特点:IPv6 的邻居关系维护机制确保通讯发起之前邻居是可达的,而 ARP 本身是做不到的,仅仅通过老化机制来实现。
2.5 重定向过程(和 IPv4 机制相同)
- 当网关路由器知道更好的转发路径时,会以重定向报文的方式告知主机,添加主机路由,下次就会用更好的转发路由。
- 重定向报文的结构如下:

PMTU(就是整条路径上的最小接口 MTU)
IPv6 报文在转发过程中是不进行分片的,IPv6 报文仅在源节点进行分片,在目的节点进行组装。
国际组织规定 PMTU 最小为 1280 字节(IPv6 要求链路层所支持的 MTU 最小为 1280 字节)。
最大的 PMTU 由链路层决定,如隧道,可以支持很大的 MTU。

icmp error: 包太大,请用 MTU = 1300 发送
via :
- 当交换机正确获取到 IPv6 地址之后,是如何与 IPv6 邻居进行通信_获取到 ipv6 地址但是无法通讯 - 优快云 博客 *Drizzlejj 于 2021-03-03 18:08:29 发布 *
https://blog.youkuaiyun.com/Drizzlejj/article/details/114326857 - 一文解释 NDP 协议(IPv6 邻居发现协议)&ICMPv6-优快云 博客
https://blog.youkuaiyun.com/qq_33162707/article/details/124625008
2285

被折叠的 条评论
为什么被折叠?



