IPv6邻节点不可到达检测学习(NUD)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IPv6邻节点不可到达检测学习(NUD)相关的知识,希望对你有一定的参考价值。

邻节点不可到达检测

邻节点不可到达检测方法有2种:

1. 通过发送单播邻节点请求报文和接收响应请求的邻节点公告报文来完成。

2. 借助上层协议确定可达性。(TCP

 

通过NS/NA报文进行NUD检测

响应请求的邻节点公告报文仅用于响应邻节点请求报文,响应请求的邻节点公告报文会将其报文中的请求标志置为1。(响应时,NA报文中请求标志位设为1)。

自发的邻节点公告报文或路由器公告报文并不能用于验证可达性。

邻节点请求报文和邻节点公告报文的交互仅能确认从发送邻节点请求报文的节点A到发送邻节点公告报文的节点B的可到达性,并不能验证从BA的可达性。

不可达检测是单向的。

借助上层协议进行NUD检测

当上层协议表示使用下一跳地址进行的通信正处于发送数据的过程中时,可以间接确定可到达性。对于TCP业务流来说,开始发送数据表明已经收到了对方节点发来的对发送数据请求的确认。由接收到的TCP确认所证实的端到端的可到达性,也同时暗示了通往目标的第一跳的可到达性。TCP协议模块根据现有的机制,把这些暗示提供给了IPv6协议模块。

邻节点缓存表项的状态

1. 未完成(INCOMPLETE )

使用请求节点多播邻节点请求报文的IPv6地址解析过程正在进行中。当创建一个新的邻节点高速缓存表项,但此节点相应的链路层地址还没有得到时,会进入未完成状态。在放弃地址解析并删除邻节点高速缓存表项之前可以发送的多播邻节点请求报文的数目可以由变量来设置。RFC2461使用MAX_MULTICAST_SOLICIT的变量,并建议此变量的值为3

个人理解:

也就是说,要添加一条邻居缓存表项,先进入INCOMPLETE状态,然后在发送MAX_MULTICAST_SOLICITNS请求前,如果获取到了节点相应的链路层地址,那么该条邻居缓存状态变化为REACHABLE。否则删除该条邻居缓存。

2. 可到达(REACHABLE)

通过接收响应请求的单播邻节点公告报文,可以确认邻节点的可到达性。邻节点高速缓存的表项会一直保持可到达REACHABLE状态,直到路由器公告报文的可到达时间字段中规定的时间(毫秒数)(或主机默认值)耗尽为止。

只要上层协议,比如TCP协议,表示传输数据的通信仍在进行中,则相关表项就会始终保持可到达状态。每当上层协议表示要开始传输数据时,表项中的可到达时间就会被刷新。

个人理解:

可到达可以保持一段时间,这段时间内,该条邻居缓存的状态一直是REACHABLE状态。

如果有上层协议TCP在通信,表项中的可到达时间就会被刷新。

3. 失效(STALE)

可到达时间(自从上次收到可到达确认后过去的时间)耗尽。当路由器公告报文的时间可到达时间字段中规定的时间(毫秒数)(或主机默认值)耗尽时,邻居缓存的表项进入失效STALE状态,并且一致保持该状态,直到有数据包发送给这个邻节点。

当主机收到一个公告自己链路层地址的自发邻节点公告报文(NA)时,与此邻节点对应的表项也会进入失效状态???

个人理解:

时间耗尽,邻居缓存表项状态变为STALE,直到有报文发送到该邻节点会发生变化。

4. 延迟(DELAY)

为等待上层协议提供可达性确认,在主机发送邻节点请求报文(NS)前,邻节点缓存表表项进入延迟DELAY状态,并且等待一段可以设定的时间。RFC2461中使用名为DELAY_FIRST_PROBE_TIME的变量,并建议此变量的值为5秒。如果在延迟时间结束时,还没有收到可到达性的确认,则此表项进入探测PROBE状态,并发送一个单播邻节点的请求报文。

个人理解:

在失效状态下,有报文要发送到一个邻节点,该邻居缓存的状态变换为延迟。

在延迟期内如果收到了可达性确认,则进入到REACHABLE状态。延迟期内没有收到可达性确认,发送一个单播邻节点的请求报文(NS),进入到探测阶段。

5. 探测(PROBE)

无论邻节点缓存的表项处于失效状态还是延迟状态,都表示正在进行可到达性的确认。主机按照一定的时间间隔发送单播邻节点请求报文(NS),这个时间间隔等于主机收到的路由器公告中的重传定时器字段的值(或默认值)。在放弃可达性检测并删除相应的邻节点缓存表项之前可以发送的邻节点请求报文的数目可以由变量来设置。RFC2461使用名为MAX_UNICAST_SOLICIT的变量,并建议此变量的值为3

个人理解:

探测阶段,还可以发送几次NS报文用来确认可达性。如果不能得到确认,删除该表项。

 

任何表项在任何时刻,都可以从任何状态进入无表项存在状态。(表项不存在,即删除之)。

 

如果不可达的邻节点是路由器,则主机可以从的默认路由器列表中选择另一个路由器,并且对新选择的这个路由器进行地址解析和邻节点不可到达检测。

如果路由器变成主机,则它应该发送路由器标志为0的多播邻节点公告报文。如果主机收到了从路由器发来的邻节点公告报文,并且其中的路由器标志为0,则主机将它的默认路由器列表中删除该路由器,如果需要,就再选择另一个路由器。


 


以上是关于IPv6邻节点不可到达检测学习(NUD)的主要内容,如果未能解决你的问题,请参考以下文章

Android -- WiFi的NUD检测机制浅析

Android -- WiFi的NUD检测机制浅析

Android -- WiFi的NUD检测机制浅析

Android -- WiFi的NUD检测机制浅析

值得学习的ICMPv6 协议

IPV6 组播学习理解