IPv6邻居发现机制
邻居发现协议(Neighbor Discovery Protocol)是IPv6协议的一个基本组成部分,使用了下表中的五种类型ICMPv6消息:
使用表格中的五种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状态是稳定状态。
1. Incomplete (未完成状态):表示正在解析地址,但邻居链路层地址尚未确定。
2. Reachable (可达状态):表示地址解析成功,该邻居可达。
3. Stale (失效状态):表示可达时间耗尽,未确定邻居是否可达。
4. Delay (延迟状态):表示未确定邻居是否可达。Delay状态不是一个稳定的状态,而是一个延时等待状态。
5. 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。