深入OSPF之论邻居与邻接 原创:wildlee
两台启用了OSPF协议的邻接路由器只有匹配了特定的条件才可以建立邻居关系,有了邻居关系之后在根据其网络类型确定与哪些邻居在建立邻接关系。启用了OSPF协议的路由器以目标IP224.0.0.5发送HELLO数据包,与该OSPF路由设备相邻接的路由器接收到此报文根据其报文内容字段区域ID、认证信息、网络掩码、HELLO时间间隔、邻居无效时间等信息决定是否与其建立邻居,当形成邻居的条件匹配则将该路由器加入到自己的邻居数据库,否则丢弃该HELLO报文最终邻居关系建立失败。邻居关系建立以后它的保持时间是4倍HELLO间隔时间,如果在此时间内没有收到该邻居的HELLO报文则解除邻居关系,如果收到一个HELLO报文其邻居字段有自己的ROUTE-ID则更新邻居无效时间。
不同的网络类型HELLO间隔时间不同,点到点与广播型网络HELLO间隔时间默认为10秒,邻居失效时间为40秒,而NBMA网络HELLO间隔时间默认为30秒。点到点与广播型网络以发送组播HELLO报文与邻接路由器建立邻居关系,而NBMA网络不具有广播能力,它以单播方式建立邻居关系。
参于OSPF进程的接口邻居状态机,所谓邻居状态机是指在自己的数据结构里体现出来的邻居的状态,是以自己的角度看邻居状态的,而不是两个邻接路由器之间的状态,两个邻接路由器的邻居状态机不具有同步性可言,此概念非常重要。当OSPF路由器在X接口上还没有发现邻居的时候,意思是还没有收到一个HELLO报文有条件与自己成为邻居关系,它的邻居状态是“DOWN”,当在X接口上收到一个HELLO报文且满足邻居建立条件,此时邻居状态转变为ONE-WAY状态也就是INIT状态,当在X接口上收到一个HELLO报文在其邻居字段看到自己的ROUTE-ID,此时邻居状态为TWO-WAY,这时要注意在邻居状态为DOWN的情况下,如果收到一个HELLO报文在其邻居字段有自己的ROUTE-ID,那么邻居状态跳过INIT状态直接进入TWO-WAY状态。
注:本文中的邻接路由器是指两个直连的路由器,是一种物理连接上的概念。而邻接关系是在形成了邻居关系后根据其网络类型与特定路由器形成邻接关系,针对与OSPF说的,不要搞混了。
理论性观点
在某种情况下某路由器与自己邻接的路由器形成了邻接关系,则该路由器则随即与邻接关系路由进行DBD报文交互,但是这种关系不具有双向性,只是站在自己的角度。在这种条件下极有可能面对的一个问题是,该路由器所邻接的路由器还没有与它形成邻接关系,因为在某个时刻该邻接路由器还没有收到该路由器发出去的HELLO报文且邻居字段里有该邻接路由器的ROUTE-ID。当一个路由器邻居状态为INIT状态时,此时如果收到一个DBD描述报文,则直接进入TWO-WAY状态。
点到点网络
点网络两个邻接路由器之间在初启动之下,经过短暂的时间通过四个HELLO报文的交互便形成了双向邻居关系,点到点网络建立邻居关系速度是非常快的。在点到点网络中当OSPF路由器收到一个邻接路由器发送的HELLO报文,如果该报文内容信息与自己建立邻居的条件匹配,该OSPF路由器则更新自己的邻居数据库然后随即以组播HELLO进行回复,这个HELLO报文与上一个HELLO报文的时间间隔不是一个HELLO报文时间间隔,这个时间可能不到1秒钟。点到点网络邻居关系建立后HELLO报文以HELLO间隔时间发送给邻居,提供了邻居保活机制。在点到点网络中,建立了邻居关系就等于建立了邻接关系,下一步工作是进行DBD交互。
广播型网络
广播网络的邻居与邻接关系不同于点到点网络,在广播网络中从参于OSPF进程的接口UP一刻起开始计时到选举BDR、DR路由器这段时间,这个时间为WAITING时间一般为40S是四倍的HELLO时间间隔,当WAITING时间超时,OSPF路由器从建立了邻居关系的邻接路由中选举出BDR、DR路由器,准备进行DBD交换。
在广播网络中会出现这种类型的HELLO报文[IMMEDIATELY HELLO],该HELLO包为单播,很多朋友认为是对邻居的确认,收到此HELLO报文后与邻接路由器形成邻居关系,在新版的NP书中说道所有邻接路由器接收到一个组播HELLO报文,其邻接路由器将其邻居状态转变为INIT状态,然后以一个单播HELLO报文回复其邻居字段有刚接收组播HELLO报文的路由器ID,当OSPF路由器收到回复的单播HELLO报文建立邻居关系其邻居状态为TWO-WAY状态。我想说明的是这个包根本不是什么邻居HELLO确认包,收到这个单播的HELLO报文也无法改变其OSPF路由器邻居状态。本人分别用H3C真机与GNS3模似器轻测验证,但是这个单播HELLO包文具体存在的意义我还不得而知。
此文形成非常感谢几位好友在OSPF技术方面的交流,其好友流逝风之影与我在很多技术细节上进行了详细的讨论分析,并提供了H3C真机用来测试OSPF细节问题。
转载请注明:爱开源 » 深入OSPF之论邻居与邻接