IPv6的邻居发现技术( 三 )


如果知道了下一跳节点的IP地址,发送方就检查邻居缓存中有关邻居的链路层信息 。如果没有表项存在,发送方就创建一条,并设置其状态为“不完整性,同时启动地址解析,然后对没有完成地址解析的数据包进行排队 。对具有组播功能的接口来说,地址解析的过程是发送一个邻居请求信息,以及等待一个邻居通告 。当收到一个邻居通告应答时,链路层地址被表项在邻居缓存中,同时发送排队的数据包 。
在传输单播数据包期间每次读取邻居发现缓存的表项,发送方根据邻居不可达性检测的算法检查邻居不可达性检测的相关信息,但不可达性检测会使发送方发出单播邻居请求,以验证该邻居还是可达的 。
数据流第一次送往目的地时就执行下一跳确定的操作,随后该目的地如果仍能正常通信,目的地缓存的表项就可以继续使用 。如果邻居不可达算法决定在某一点终止通信,则需要重新执行下一跳确定,例如故障路由器的流量应该切换到正常工作的路由器,流向移动节点的数据流可能要重新路由到“移动代理 。
当节点重做下一跳确定时,不需要丢弃整个目的地缓存的表项,其中PMTU和往返计时器值的信息是很有用的 。
5、邻居发现协议的功能
(1)路由器和前缀发现
路由器必须无条件丢弃不满足有效性检查的路由器请求和路由器通告消息 。
路由器发现功能用来标识与给定链路相连的路由器,并获取与地址自动配置相关的前缀和配置参数 。
作为对请求消息的响应,路由器应周期地发送组播路由器通告消息,来通告链路上节点的可达性 。每个主机从链路上相连的路由器上接收路由器通告消息,并建立默认路由器列表(当到达目的地的路径不可知时所使用的路由器) 。如果路由器很频繁地产生路由器通告消息,那么主机就能在几分钟内学习到路由器的存在,否则就要使用邻居不可达检测 。
路由器通告消息应包含用来确定在连接可达性的前缀列表 。主机通过使用从路由器通告消息中提取的前缀,来确定目的地是否在连接,能否直接可达,或者是否非连接,还是仅通过一个路由器就可达 。目的地是在连接的,但这个目的地没有被路由器通告消息学到的前缀覆盖,在这种情况下,主机认为目的地是非连接的,路由器发送重定向消息给发送者 。
路由器通告消息应包含一些标志位,这些标志位通知主机怎样执行地址的自动配置,例如路由器能指定主机是使用有状态地址配置还是无状态地址配置 。
另外,路由器通告消息中还应包含简化网络集中管理的参数,例如主机产生的数据包中使用的跳数限制参数的缺省值,或链路MTU值 。
当主机向路由器发出路由器请求消息时,路由器应立刻发送路由器通告消息,通过这种方式能加速节点的配置过程 。
(2)地址解析
IPv6节点通过邻居请求和邻居通告消息将IPv6地址解析成链路层地址,对组播地址不执行地址解析 。
节点通过组播邻居请求消息来激活地址解析过程,邻居请求消息用来请求目标路由器返回它的链路层地址 。源路由器在邻居请求消息中包含了它的链路层地址,并将邻居请求消息组播到与目标地址相关的请求节点组播地址,目标路由器在单播的邻居通告消息中返回它的链路层地址 。这一对消息使源和目标路由器能解析出相互的链路层地址 。
(3)重定向功能
当包必须发送到一个非连接的目的地时,需要选择转发包的路由器 。当选择的路由器作为消息传送的下一跳并不是最好的下一跳时,路由器需产生重定向消息,通知源节点到达目的地存在一个更佳的下一跳路由器 。

推荐阅读