正文
当 OSPF接口收到一个DBD包且其中I 位置 0的时候,它就知道与该邻居的ex-start阶段已经过去了,于是将邻居的状态置为ex-change ,并存储对端发来的DBD包所包含的 LSA 头部,当然,他自己也发送关于自己OSPFDB的摘要给邻居。如此一来,双方都能通过DBD的交互,了解到对方OSPFDB中的摘要情况。在这个过程中,可能交互数个DBD报文,并要注意,这些报文的I位都置 0,且M位一般也置1,除非这是某个OSPF接口发送的最后一个DBD包。
当 Router A收到一个 M 位置 0的 DBD包的时候,它就知道,这是邻居发来的最后一个DBD包了,如果它搜集完这个邻
居(假设是 B)发来的 DBD并且发现,这些 DBD里有它感兴趣的LSA,它期望更详细的 LSA信息时,它将B置为Loading 状态,并且开始发送LSR报文去请求特定LSA的详细信息。B收到这个 LSR后,会以LSU进行回应,其中就包含了对方请求的 LSA详细信息,因此,只有在LSU报文中,才能看到LSA的完整信息。收到 LSU后,A将LSU中所包含的LSA放 进自己的LSDB,并且给 B 发一个 Lsack 进行确认。当OSPF接口上所有的待请求的LSA全部收到更新后,它会将邻居置
为 FULL。至此,OSPF邻接关系的建立达到全毗邻。
在这里我们有个地方需要留意,我们通常说,OSPF路由器A与B进入了 xx 状态,其实这句话并不严谨,原因之一,是因为 OSPF是接口敏感型协议,许多的操作都是以OSPF接口作为立足点去考虑的,譬如邻居关系的建立,再如DR和 BDR,我们不能说一台路由器是DR,准确的说,应该是某路由器的某个接口是DR;再者,说两台路由器之间是xx 状态, 这个也不严谨,所谓的邻居状态,必须是以某台路由器为观察点,在其某个接口上观察到的某个邻居的状态,因此可能出现的一个情况是,在A 上,看到的B的状态为 Loading,但是在 B 上, A的状态已经是FULL了 。
下面是关于状态机的详细解释: