在IPv6环境中,通过邻居或者到达邻居的通信,会因各种原因而中断。因此节点需要维护一张邻居表。在邻居表中,每个邻居都有相应的状态,并且状态之间可以迁移。
在RFC2461中定义了5种邻居状态,分别是:
未完成(Incomplete):表示正在解析地址,但邻居链路层地址尚未确定。
可达(Reachable):表示地址解析成功,该邻居可达。
陈旧(Stale):表示可达时间耗尽,未确定邻居是否可达。
延迟(Delay):邻居可达性未知。Delay状态不是一个稳定的状态,而是一个延时等待状态。
探测(Probe):邻居可达性未知,正在发送邻居请求探针以确认可达性.
邻居状态的具体迁移过程如下图所示:
下面以AR1、AR2两个邻居节点之间相互通信过程中AR1节点的邻居状态变化为例(假设AR1、AR2之前从未通信),说明邻居状态迁移的过程。
AR1先发送NS报文,并生成缓存条目,此时,邻居状态为Incomplete。
若AR2回复NA报文,则邻居状态由Incomplete变为Reachable,否则固定时间后邻居状态由Incomplete变为Empty,即删除表项。
经过邻居可达时间,邻居状态由Reachable(默认30s)变为Stale,即未知是否可达。
如果在Reachable状态,AR1收到AR2的非请求NA报文(MAC地址修改),且报文中携带的AR2的链路层地址和表项中不同,则邻居状态马上变为Stale。
在Stale状态若AR1要向AR2发送数据,则邻居状态由Stale变为Delay,并发送NS请求。
在经过一段固定时间后,邻居状态由Delay(默认5s)变为Probe(每隔1s发送一次NS报文,连续发送3次),其间若有NA应答,则邻居状态由Delay变为Reachable。
在Probe状态,AR1每隔一定时间间隔(1s)发送单播NS,发送固定次数(3)后,有应答则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。