当OSPF邻居建立的过程之中,路由器在和邻居达到完全邻接关系之前,要经过几个状态。这些状态在OSPF RFC2328有相关的定义,这些状态分别是Down, Attempt, Init, 2-Way, Exstart, Exchange, Loading和Full。本文将介绍一下各种状态的详细工作内容。
Down
这是第一个OSPF邻居状态,在这个状态下路由器没有从邻居那收到任何信息(包括hello包),不过在这个状态下,路由器可以主动发出hello包给自己的邻居。
当路由器之间是Full状态的时候,如果在RouterDeadInterval时间段内(4倍的默认HelloInterval)没有从邻居收到任何hello包,或者手工配置的邻居信息被移除,那么邻居状态会从Full变为Down.
Attempt
Attempt状态仅仅存在与NBMA网络中手工配置邻居的情况下。在这个状态下,路由器发送单播的hello包给邻居而且在dead interval超时之前没有收到邻居发过来的hello包。
Init
Init状态说明了路由器已经收到了来自邻居发送的hello包,但是hello包中没有包含发送者的RID。当路由器从邻居接受hello包时,封包里面应该包含发送的RID信息,以确保这是一个可认知的hello包。
2-Way
2-Way状态说明了两台路由器之间已经建立了双向的链接,每一个路由器都已经收到了对方的hello包。这个状态发生在路由器收到了一个包含自己Router ID的hello包。在这个状态下,路由器决定是否要去跟邻居建立临接关系。在广播和NBMA网络类型中,一个路由器仅与designated router (DR) 和 backup designated router (BDR)建立Full状态关系,而和其他路由器最终停留在2-way状态。在点对点和电对多点网络类型中,路由器和所有相连接的路由器最终都达到Full状态。
在2-Way状态的结束之前,广播网络和NBMA网络类型中的DR和BDR选举出来。
注意:在init状态下接受到邻居发来的Database Descriptor (DBD)包也会导致路由器转变成2-way状态。
Exstart
一旦DR和BDR选举出来,真正的链路状态信息交换才会发生在路由器和DR,BDR之间。
在Exstart状态下,路由器和它的DR, BDR建立了一种master-slave的关系并且选择一个初始的sequence number来形成临接。拥有更高的Router ID的路由器将会成为master并且开始交换信息,同时master也是唯一一个可以增加sequence number的路由器。需要注意的是,逻辑上可以认为DR/BDR中拥有更高的Router ID的一个可以成为master。但是请记住,DR/BDR的选举可能会因为手工配置了priority而不一样,不仅仅依赖与Router ID。因此有可能DR会在这个状态下充当slave状态。
Exchange
在Exchange状态下,OSPF路由器交换database descriptor (DBD)包。DBD包含了链路状态通告(LSA)头部文件,并且描述了整个链路状态数据库的内容。每一个DBD报文都含有一个sequence number,并且这个号码会每一次被master增加。在Exchange状态下,路由器同时会发送链路状态请求报文(LSR)和链路状态更新报文(LSU)。接收到的DBD报文会和路由器链路状态数据库进行比较以确保是否有任何新的或者更多的链路状态信息是可用的。
Loading
在Loading状态下,发生的是真正的链路状态信息交换。基于DBD报文所提供的信息,路由器会发送链路状态请求报文。邻居会在链路状态更新报文中提供相应的链路状态信息。在临接关系下,如果一个路由器收到了一个过期或者丢失了LSA,它会发送一个LSR请求相应的LSA。所有链路状态更新数据包都会在这个状态下达到同步。
Full
在Full状态下,路由器和其邻居会达到完全临接状态。所有路由器和网络LSA都会交换并且路由器数据库达到同步。
Full状态是OSPF路由器的一个最常见的状态。如果一个路由器停留在另外一个状态,那么就说明了在路由器建立临接关系的过程中是存在问题的。唯一的例外是2-way状态,是在广播网络中常见的。在广播网络中,邻居之间(除了和DR,BDR之外)会最终处于2-way状态。