ospf使用邻居状态机制的目的在于在路由器之间交换路由信息,不是所有的路由器之间都会形成邻居关系,尤其在广播网络和NBMA网络中。邻居状态是通过hello报文建立和维护的。
路由器会周期性的发出hello报文到他的邻居。如果某路由器在其邻居的hello包中被列出,那么他们之间会成为two-way状态,在广播和NBMA网络中,周期性的发送hello报文用来选举DR和BDR。当two-way关系建立以后,路由器之间会考虑是否建立邻接关系,这决定于邻居路由器的状态以及网络的类型。如果网络的类型是广播或者非广播,那么仅仅会在DR和BDR路由器之间建立邻接关系。在其他类型的网络中(NBMA),邻接关系只会在邻居路由器之间建立。
形成邻接关系的第一步是进行路由器之间的数据库的同步,每个路由器通过DB报文描述它的LS数据库,但是在路由器之间交换的信息只包含LSA的报头信息,在交换的过程中会选举maste和slave,而且每个路由器都会对其接受的LSA做一个标记,在数据库同步完成的时候,路由器会发送ls的request数据包,来请求那些在数据库同步过程中被标记的那些lsa。邻居路由器会发送LSU数据包给对方,当对方收到LSU数据包之后,会发送LSack数据包给对方。此时,数据库同步完成。
ospf的状态机有以下几种状态:
-
Down
- Attempt
- Init
- 2-way
- Exstart
- Exchange
- Loading
- Full
下面我们对以上的几种状态进行详细的介绍。
1、Down State
如图,R1和R2上运行ospf,邻居状态显示为Down,这意味着在邻居之间没有任何信息进行交换。
2、Attempt State
这个状态在NBMA网络中也有效,如果一个邻居在这个状态下,这意味着不会从邻居路由器收到任何信息。但是在这个状态下,路由器会在每个hello interval发送hello包给邻居路由器,在上图中R1会发送hello包给R2,告知R1的数据库中没有任何数据,并且其不知道DR是哪个路由器。如图:
3、Init State
在这个状态下,R1会发送Hello数据包,在R2收到Hello包以后,会发送一个1-way状态,因为其在R1发送的数据包中看不到自己。如图:
4、2-way state
这种状态是在双方建立了双向的通信关系以后,会进入2-way状态,也就是说,R1和R2在彼此发送的Hello包中能发现自己。这个状态是OSPF邻接状态的开始,在广播网络或者NBMA网络中,DR和BDR就是在这个阶段产生的。在下图中,R2会发送数据包给R1表明R2在R1发送的数据包中发现了自己。并且选举自己(R2)为DR。
在这个状态被用来初始化ospf数据库的同步,Master和Slave会在这个阶段被选举出来。第一个swquence number也在这个阶段决定。如图:R1发送第一个DB数据包,R2也发送第一个DB数据包。拥有最高router ID的路由器将成为Master,在这个例子中R2的router ID较大,因此,R2成为了Master。如图:
6、Exchange State
在这个状态下,路由器会通过DD报文描述其本身所有的LSA的,每个LSA都以摘要的形式显示,即只显示LSA的header。在这个状态下,ospf会来请求其他的路由器发送新的LSA实例给自己,即我们常说的LSU。下图详细描述了这个状态:
在上图中我们可以看到,两个路由器会交换他们的lSA的数据库信息,最后一个箭头说明了在LSA包中的M位被置0,说明没有其他的数据可以交换了。R1也会把M位置1,说明其没有数据要交换了。到此数据库交换过程结束。
7、Loading State
在这个状态下,路由器会发送LSR来请求在exchange过程中没有被交换的LSA,在下图中我们可以看到,R1发送LSR以请求更多的LSA,从而达到更新Database的目的。
8、Full State
在这个状态形成了邻接关系。这个状态有一点需要注意,这个状态下之后hello,LSU,以及LSAck三种数据包在周期的发送。
阅读(252) | 评论(0) | 转发(0) |