邻居发现协议的功能
(1)路由器和前缀发现
路由器必须无条件丢弃不满足有效性检查的路由器请求和路由器通告消息。
路由器发现功能用来标识与给定链路相连的路由器,并获取与地址自动配置相关的前缀和配置参数。
作为对请求消息的响应,路由器应周期地发送组播路由器通告消息,来通告链路上节点的可达性。每个主机从链路上相连的路由器上接收路由器通告消息,并建立默认路由器列表(当到达目的地的路径不可知时所使用的路由器)。如果路由器很频繁地产生路由器通告消息,那么主机就能在几分钟内学习到路由器的存在,否则就要使用邻居不可达检测。
路由器通告消息应包含用来确定在连接可达性的前缀列表。主机通过使用从路由器通告消息中提取的前缀,来确定目的地是否在连接,能否直接可达,或者是否非连接,还是仅通过一个路由器就可达。目的地是在连接的,但这个目的地没有被路由器通告消息学到的前缀覆盖,在这种情况下,主机认为目的地是非连接的,路由器发送重定向消息给发送者。
路由器通告消息应包含一些标志位,这些标志位通知主机怎样执行地址的自动配置,例如路由器能指定主机是使用有状态地址配置还是无状态地址配置。
另外,路由器通告消息中还应包含简化网络集中管理的参数,例如主机产生的数据包中使用的跳数限制参数的缺省值,或链路MTU值。
当主机向路由器发出路由器请求消息时,路由器应立刻发送路由器通告消息,通过这种方式能加速节点的配置过程。
(2)地址解析
IPv6节点通过邻居请求和邻居通告消息将IPv6地址解析成链路层地址,对组播地址不执行地址解析。
节点通过组播邻居请求消息来激活地址解析过程,邻居请求消息用来请求目标路由器返回它的链路层地址。源路由器在邻居请求消息中包含了它的链路层地址,并将邻居请求消息组播到与目标地址相关的请求节点组播地址,目标路由器在单播的邻居通告消息中返回它的链路层地址。这一对消息使源和目标路由器能解析出相互的链路层地址。
(3)重定向功能
当包必须发送到一个非连接的目的地时,需要选择转发包的路由器。当选择的路由器作为消息传送的下一跳并不是最好的下一跳时,路由器需产生重定向消息,通知源节点到达目的地存在一个更佳的下一跳路由器。
路由器必须能够确定每个邻居路由器的本地链路(1ink-local)地址,以保证重定向消息里的目标地址根据本地链路地址来识别邻居路由器。
在源端没有正确应答重定向消息,或者源端选择忽略没有被验证的重定向消息的情况下,为了节省频带和处理的费用,路由器必须限定发送重定向消息的速率。
在收到重定向消息时,路由器不能更新路由表。
(4)邻居不可达检测
任何时候通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点应该主动跟踪数据包发向邻居的可达性状态。
主机与邻居节点之间所有路径都应进行邻居不可达性检测,包括主机到主机、主机到路由器以及路由器到主机之间的通信,也可用于路由器之间,以检测邻居或邻居前向路径发生的故障。
如果路由器最近收到确认,邻居的IP层已经收到最近发送到它的数据包,那么该邻居是可达的。邻居不可达检测使用两种方法进行确认:一种是从上层协议来的提示,提供“连接正在处理”的确认;另一种是路由器发送单播邻居请求消息,收到了应答的邻居通告消息。为了减少不必要的网络流量,探测消息仅发送到邻居。
邻居不可达性检测与向邻居发送数据包同时进行。在邻居可达性确认期间,路由器继续向缓存链路层地址的邻居发送数据包;如果没有数据包发向邻居,则不发送检测。