OSPF状态机详细过程

一、邻居关系建立

   状态含义:

Down:这是邻居的初始状态,表示没有从邻居收到任何信息。

Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己的Router ID不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。

2-Way:在此状态下,路由器发现自己的Router ID存在于收到的Hello报文的邻居列表中,已确认可以双向通信。

邻居建立过程如下:

OSPF状态机详细过程

1、RTA和RTB的Router ID分别为1.1.1.12.2.2.2。当RTA启动OSPF后,RTA会发送第一个Hello报文。此报文中邻居列表为空,此时状态为DownRTB收到RTA的这个Hello报文,状态置为Init。

2、RTB发送Hello报文,此报文中邻居列表为空,RTA收到RTBHello报文,状态置为Init。

3、RTB向RTA发送邻居列表为1.1.1.1Hello报文,RTA在收到的Hello报文邻居列表中发现自己的Router ID,状态置为2-way。

4、RTA向RTB发送邻居列表为2.2.2.2的Hello报文,RTB在收到的Hello报文邻居列表中发现自己的Router ID,状态置为2-way

因为邻居都是未知的,所以Hello报文的目的IP地址不是某个特定的单播地址。邻居从无到有,OSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)。


二、LSDB同步(一)

状态含义:

ExStart(信息交换初始状态):邻居状态变成此状态以后,路由器开始向邻居发送DD报文。Master/Slave关系是在此状态下形成的,初始DD***也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。

Exchange(信息交换状态):在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。

Loading(加载):在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。

Full:LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。

LSDB同步过程如下:

OSPF状态机详细过程

1、RTARTBRouter ID分别为1.1.1.12.2.2.2并且二者已建立了邻居关系。当RTA的邻居状态变为ExStart后,RTA会发送第一个DD报文。此报文中,DD***被随机设置为XI-bit设置为1,表示这是第一个DD报文,M-bit设置为1,表示后续还有DD报文要发送,MS-bit设置为1,表示RTA宣告自己为Master。

2、当RTB的邻居状态变为ExStart后,RTB会发送第一个DD报文。此报文中,DD***被随机设置为YI-bit=1M-bit=1MS-bit=1,含义同上)。由于RTBRouter ID较大,所以RTB将成为真正的Master。收到此报文后,RTA会产生一个Negotiation-Done事件,并将邻居状态从ExStart变为Exchange

3、当RTA的邻居状态变为Exchange后,RTA会发送一个新的DD报文,此报文中包含了LSDB的摘要信息,***设置为RTB在步骤2中使用的***Y(隐式确认I-bit=0,表示这不是第一个DD报文,M-bit=0,表示这是最后一个包含LSDB摘要信息的DD报文,MS-bit=0,表示RTA宣告自己为Slave。收到此报文后,RTB会产生一个Negotiation-Done事件,并将邻居状态从ExStart变为Exchange

4、当RTB的邻居状态变为Exchange后,RTB会发送一个新的DD报文,此报文包含了LSDB的摘要信息,DD***设置为Y+1, MS-bit=1,表示RTB宣告自己为Master

5、虽然RTA不需要发送新的包含LSDB摘要信息的DD报文,但是作为SlaveRTA需要对Master发送的每一个DD报文进行确认。所以,RTARTB发送一个新的DD报文,***为Y+1,该报文内容为空。发送完此报文后,RTA产生一个Exchange-Done事件,将邻居状态变为LoadingRTB收到此报文后,会将邻居状态变为Full(假设RTBLSDB是最新最全的,不需要向RTA请求更新)。


三、LSDB同步(二)

OSPF状态机详细过程

1、RTA开始向RTB发送LSR报文,请求那些在Exchange状态下通过DD报文发现的、并且在本地LSDB中没有的链路状态信息。

2、RTBRTA发送LSU报文,LSU报文中包含了那些被请求的链路状态的详细信息。RTA在完成LSU报文的接收之后,会将邻居状态从Loading变为Full

3、RTARTB发送LSAck报文,作为对LSU报文的确认。RTB收到LSAck报文后,双方便建立起了完全的邻接关系。

从建立邻居关系到同步LSDB的过程较为复杂,错误的配置或设备链路故障都会导致无法完成LSDB同步。为了快速排障,最关键的是要理解不同状态之间切换的触发原因。


四、整体流程图

OSPF状态机详细过程

 

这是形成邻居关系的过程和相关邻居状态的变换过程。

Down:这是邻居的初始状态,表示没有从邻居收到任何信息。在NBMA网络上,此状态下仍然可以向静态配置的邻居发送Hello报文,发送间隔为PollInterval,通常和Router DeadInterval间隔相同。

Attempt:此状态只在NBMA网络上存在,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为HelloInterval。如果Router DeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。

Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。在此状态下的邻居要被包含在自己所发送的Hello报文的邻居列表中。

2-Way Received:此事件表示路由器发现与邻居的双向通信已经开始(发现自己在邻居发送的Hello报文的邻居列表中)。Init状态下产生此事件之后,如果需要和邻居建立邻接关系则进入ExStart状态,开始数据库同步过程,如果不能与邻居建立邻接关系则进入2-Way。

2-Way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的*状态。

1-Way Received:此事件表示路由器发现自己没有在邻居发送Hello报文的邻居列表中,通常是由于对端邻居重启造成的。

ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送DD报文。主从关系是在此状态下形成的;初始DD***是在此状态下决定的。在此状态下发送的DD报文不包含链路状态描述。

Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。

Loading:相互发送LS Request报文请求LSA,发送LS Update通告LSA。

Full:两台路由器的LSDB已经同步。