随着IPv6技术的广泛应用,其核心协议之一——邻居发现(Neighbor Discovery,ND)协议的重要性日益凸显。它并非ARP在IPv6中的简单复制,而是一个功能更强大、设计更完善的综合协议。如果你正在学习IPv6或从事网络相关工作,深入理解ND协议是构建扎实网络知识基础的关键一步。
什么是ND协议?
ND(Neighbor Discovery),中文称为邻居发现协议,是IPv6协议栈中的关键组成部分。它整合并改进了IPv4中多个独立协议的功能,例如我们熟知的ARP、ICMP路由器发现以及部分DHCP的功能。
ND协议主要提供了以下几项核心功能:
地址解析
这是ARP协议在IPv6中的等效替代。其作用是根据已知的网络层(IPv6)地址,确定其对应的数据链路层(MAC)地址。此外,ND协议还通过邻居不可达检测(NUD) 机制,持续维护邻居节点的可达性状态。
邻居不可达检测(NUD)
在获知邻居的MAC地址后,设备会通过发送NS(邻居请求)消息并等待邻居回复NA(邻居通告)响应,来动态验证邻居是否仍然可达。
地址重复检测(DAD)
无论是通过无状态地址自动配置(SLAAC)生成的地址,还是手工配置的静态地址,在正式使用前,设备都会执行DAD。其原理是向该候选地址发送一个特定的NS消息,如果收到NA回应,则说明地址已被占用,配置将失败。
无状态地址自动配置(SLAAC)
主机可以仅根据路由器发布的前缀信息,自动生成全局IPv6地址,无需依赖DHCPv6服务器。这是IPv6的一个重要特性,下文会详细讲解。
路由器重定向
当网关发现存在到达目标网络的更优路径时(例如目标主机就在同一链路),它会向源主机发送ICMPv6重定向消息,通知主机更新其路由表,后续数据包将通过更优的下一跳发送。
ND协议使用的报文
ND协议基于ICMPv6实现,工作在网络层(第3层),这使其能够独立于数据链路层技术,通用性更强。它主要使用五种类型的ICMPv6报文:
| 类型 |
英文全称 |
中文名称 |
主要作用 |
| RS |
Router Solicitation |
路由器请求 |
主机发送,请求链路上的路由器立即发送RA报文。 |
| RA |
Router Advertisement |
路由器通告 |
路由器发送,通告网络前缀、MTU、默认路由等信息。 |
| NS |
Neighbor Solicitation |
邻居请求 |
用于地址解析、DAD和NUD。 |
| NA |
Neighbor Advertisement |
邻居通告 |
响应NS,提供自身链路层地址,或主动通告地址变化。 |
| Redirect |
Redirect |
重定向 |
路由器通知主机存在更优的下一跳路径。 |
RS(路由器请求)
由主机发送给路由器(或所有路由器组播地址FF02::2),请求路由器立即回应RA报文,常用于主机启动后快速获取网络配置。
RA(路由器通告)
由路由器周期性广播或单播发送给主机,报文内携带网络前缀、地址生命周期、是否启用SLAAC、默认路由等关键信息。
NS(邻居请求)
核心报文,用于请求目标IPv6地址对应的MAC地址(地址解析),也用于DAD和NUD过程。
NA(邻居通告)
用于响应NS请求,携带自身的MAC地址。节点也可以在MAC地址变化时,主动发送NA报文以更新邻居的缓存。
Redirect(重定向)
由路由器发送给主机,指示主机对于特定目的地址,应使用另一个更优的下一跳地址(例如,同一链路上的目的主机本身)。
IPv6地址解析流程
IPv6的地址解析过程不仅获取MAC地址,还与邻居可达性状态管理紧密结合。其基本交互流程如下图所示:
![IPv6地址解析与邻居缓存建立流程图]()
整个流程可以分解为以下步骤:
【1】:节点A希望与节点B通信,但不知道B的MAC地址。A会构造一个NS报文,其目标地址为B的IPv6地址对应的请求节点组播地址,源地址为A的地址,并在报文选项中携带A自己的MAC地址。
【2】:节点B监听该组播地址,收到NS报文后,根据报文中的源IPv6地址和源MAC地址,在自己的邻居缓存表中为节点A创建一个表项(状态可能为STALE或DELAY)。
【3】:紧接着,节点B向节点A回送一个NA报文进行响应。该NA报文为单播,其源地址为B的地址,目标地址为A的地址,并在选项中携带B自己的MAC地址。
【4】:节点A收到NA报文后,从中提取B的MAC地址,并据此在自己的邻居缓存表中为节点B创建一个完整的表项,状态标记为REACHABLE(可达)。
当节点的网络接口卡(NIC)或MAC地址发生变化时(例如更换网卡或端口),它会向所有节点组播地址FF02::1 发送NA报文,通知链路上所有其他节点更新其邻居缓存中关于自己的记录。
邻居不可达检测(NUD)状态机
NUD通过一个精细的状态机模型来跟踪和管理每个邻居的可达性。状态机包含以下五种状态:
INCOMPLETE(未完成)、REACHABLE(可达)、STALE(陈旧)、DELAY(延迟)、PROBE(探测)
INCOMPLETE(未完成)
表示地址解析正在进行中,邻居的链路层地址尚未确定。通常在首次发送NS报文后进入此状态。
REACHABLE(可达)
表示邻居确认可达。此状态有一个定时器(REACHABLE_TIME),超时后状态将迁移至STALE。
STALE(陈旧)
表示自上次收到“可达性证实”后已过较长时间,邻居的可达性未知。这是一个稳定状态。当收到来自该邻居的、非请求的NA报文时,状态可能更新回REACHABLE。
DELAY(延迟)
这是一个临时状态。当有数据包要发给处于STALE状态的邻居时,状态会先变为DELAY,并启动一个短延时(DELAY_FIRST_PROBE_TIME)。在此延时内,如果收到任何来自该邻居的“可达性证实”(如上层的TCP ACK),则状态直接变为REACHABLE;否则,进入PROBE状态。
PROBE(探测)
在此状态下,节点会持续向邻居发送单播NS报文进行主动探测,直到收到NA响应(状态变为REACHABLE)或达到重试上限(可能删除邻居表项)。
![邻居不可达检测(NUD)状态机迁移图]()
IPv6无状态地址自动配置(SLAAC)
IPv6支持两种地址自动配置方式:有状态(如DHCPv6)和无状态(SLAAC)。SLAAC完全依赖于ND协议,是其最引人注目的应用之一。
![IPv6无状态地址自动配置(SLAAC)工作流程图]()
其工作流程清晰明了:
【1】:主机(如PCA)启动后,以其链路本地地址为源地址,向所有路由器组播地址FF02::2 发送RS报文,主动请求网络配置信息。
【2】:路由器(如RTA)收到RS后,会以其链路本地地址为源地址,向所有节点组播地址FF02::1 (或直接单播回复给主机)发送RA报文。RA报文中至关重要的一部分是“前缀信息选项”,其中包含了可用的全球单播地址前缀(如2001:db8::/64)。
【3】:主机收到RA报文后,提取其中的前缀信息,将其与自身接口标识符(通常由MAC地址派生)结合,自动生成一个或多个全球IPv6地址。同时,主机还会根据RA报文设置默认网关、跳数限制等参数。
通过以上讲解,我们可以看到IPv6 ND协议是一个设计精巧、功能完备的体系。它不仅是ARP的替代品,更是实现IPv6即插即用、增强鲁棒性的基石。掌握ND协议,对于深刻理解IPv6网络行为、进行高效网络排障至关重要。希望这篇梳理能帮助你建立起清晰的认知框架,更多深入的网络技术讨论,欢迎在云栈社区交流分享。