一、DOWN :
双方没有进行任何交互活动。

二、INIT :

收到对方的hello包,但是还没收到含有自己RID的hello包,即对方没有收到自己的hello包。

这个时候发送 hello(224.0.0.5)中DR字段为全零,因为还没有选出 DR。


Hello包的参数:


1、自己RID  2、Area ID  3、hello-interval  4、hello-deadinterval  5、网络掩码  6、优先级 7、DR/BDR  8、邻居RID  9、认证信息


只有hello包中的2、3、4、5、9字段一致,才能形成邻居。如有一项不相同的丢弃。


hello包TTL值是 1,在E1中每 10 秒发送一次。



三、TWO-WAY: 

两个OSPF路由器都从对端发来的hello包中发现自己的RID。建立邻邻居关系。


建立邻居关系后,邻居路由器之间会判断是否需要建立邻接关系

  

1、 如果是point-to-point链路,需要建立邻接关系

2、 如果是point-to-multipoint链路,需要建立邻接关系

3、 如果网络类型是虚链路,需要建立邻接关系

4、 本地路由器是网段上的DR,需要建立邻接关系

5、 本地路由器是网段上的BDR,需要建立邻接关系

6、 邻居路由器是网段上的DR,需要建立邻接关系

7、 邻居路由器是网段上的BDR,需要建立邻接关系


广播网络这个阶段选举DR/BDR。


DR/BDR选举步骤:


step1:根据ospf路由器的接口的优先级选举DR/BDR(每个接口默认的优先级都是1)其中优先级最大的成为DR,次大的成为BDR,其它的都是DR-Other。

如果有路由器的pri为0,表示放弃DR/BDR的选举。(priority:设置命令 route(config-if)#ip ospf cost {priority} 0~255)


priority:1--255 (串口默认没有优先级,因为它默认是POINT_TO_POINT,不需要选举DR/BDR的。)


step2:如果接口的优先级相同,将使用router-id来决定DR/BDR的选举:其中router-id最大的成为DR,次大的成为BDR,其他的都是DR-other。


DR 一旦当选,除非路由器故障,否则不会更换,即使后来的路由器priority 更高


为什么DR和BDR的选举根据同一网段而不是同一区域

HELLO包在广播和P2MP网络中是以组播形式发送的,而在NBMA和P2P网络中是以单播发送,都是三层转发。OPSF在广播型网络和NBMA网络中需要选举DR/BDR。如果DR/BDR的选举是根据同一区域而不是同一网段,也就是说可以跨路由器进行选举,那么,首先组播就不能跨路由,其次既然DR/BDR都还没选出来,跨网段的路由也是没有的,单播也自然无法通过。这样一来,由于HELLO包根本无法传到,何谈选举DR/BDR?(一句话:由于HELLO包只能在邻居间交互,而邻居间必须是同一网段,所以DR/BDR选举也要在同一网段进行)。



四、EXSTART :


预启动状态,OSPF路由器建立主从关系,然后由主确定一个发送DD的序列号。


选主从原则:RID大的为主。


选主从原因:传输DD之前,先由主确定一个序列号,并且只能有主对序列号进行修改。为确定唯一的DD序列号,让数据可靠到达。因为 ip 是不可靠传输,采用确认+超时重传。


头两个 dd 报文为空,不包含 lsa 的数据,用于协商序列号。这时候都认为自己是主。

在EX-START状态开始进行Master、Slave的协商。协商M/S的目的是为了决定在后续的LSA交互中,谁来决定DD(Database Description)报文的序列号(Sequence Number),而Router-ID大的那个OSPF路由器的接口将会成为Master,由它来决定DD Sequence Number,对端则成为slave。


这里要注意Master不是DR,要注意与DR的概念进行区分。这个协商过程,是由交互DBD包实现的,使用的是空的DBD包,也就是不包含任何LSA头部的DBD包,这个包当中,有三个位非常关键:I、M、MS。用于ex-start阶段协商Master/Slave的DBD包,I位(或叫做init位)都是置0的,另外MS位如果置1,表示DBD报文始发路由器认为自己的Master,当然起初大家都这么认为,在一系列DBD交换后,就会得到选举结果,被选举为Slave的OSPF接口会将发送的DBD包MS位置为0;另外M位表示More,如果一个OSPF接口发送的DBD包M位置1,在表示这不是最后一个DBD,后续还有DBD包待发送。



五、EXCHANGE:


交换状态。DRother和DR 开始交换数据,主先发送LSDB报文,此报文只是一个index(如同一本书的目录)不包含实际的路由数据,从也发送报文,发送主没有的。


DD包信息:


1、I-bit (intial-bit)


标示位,如果置1,则只有1个DD包,如果是子DD包,则置0.


2、M-bit  (more-bit)


如置1,表示该DD包不是最后一个。如置0,表示其为最后一个。DD包发送结束。


3、MS-bit  (master/slave-bit)


如置1,表示该包为主发的包,置0表示从发的包。


4、DD sequence number


DD包序列号



六、LOADING: 


装入状态。从DD 报文中查看那个是自己需要的路由数据,发送LSR 请求发送数据,对端发送LSU,此报文包含所需的全部数据。 


LSR信息:


1、link state type 。总共有11种,但是思科公司未实现全部。


常见:

1)router lsa:LID为RID。描述路由器与OSPF区域接口的信息,只在本区域内flooding。


2)  network lsa:LID为DR连接该区域的接口IP。有DR产生,描述本区域的路由器信息。是保证在广播网络中只产生一个network lsa 。


3)network summary lsa:LID为目的网络号。由ABR产生,描述其所知道的其他区域网络。


4)asbr las:LID为asba的RID。由ASBR产生,描述自己的位置,使其他路由器可以找到并到达它。


5)as external lsa :LID为外部网络号。由ASBR产生,描述到达外部网络的路由信息。


6)nssa external lsa:LID为外部网络号。由ASBR产生,描述nssa区的直连外部路由。它会被包含到第5类lsa中,以便可以被分发到支持第5类lsa的区域。


2、link id:


不同lsa的link id 不同。


3、advertising router :


发送lsa的RID。


LSU信息:


数据链路更新包,LAS包含在LSU中。


LSA (数据链路通告,LSA是包含在LSU中的)的传播更新规律 :


Step1:如果本路由器从来没有收到过此LSA,那么路由器就将其加入LSDB,并且转发/泛洪此LSA。


Step2:   如果本路由器,曾经收到描述同一个网络的LSA:


    2-1:   如果LSA的序号,与自己已有的相同,则丢弃此LSA。


    2-2:   如果LSA的序号,比自己的新,则同step1。


    2-3:   如果LSA的序号,比自己的旧,就将自己较新的LSA发送给源。



七、FULL:


收到LSU报文后发送确认,完成充满状态。 


存在DR/BDR时,DR收到LSU后是不发送LSAck的。因为当DR将LSU在该区域内flooding,当发送路由器侦听到该LSA时,就认为是一个确认。


当不存在DR/BDR时,接收路由器发送LSAck。


完成full状态,说明该区域中所有路由都拥有相同的LSDB了。


Full状态是DR/BDR和DRother连接的正常状态。而two-way状态是DRother之间连接的正常状态



从INIT--LOADING 是路由器第一次交换信息的时候才出现,到了 full 以后,如果在有路由变化那么就只发送lsu 


完成full状态后。路由器使用spf算法,以自己为根,计算出到达已知网络的最佳路径。



若出现无法建立邻居的情况:


1、检查物理链路

检查路由器之间IP地址是否正确,直连能否PING通,如果不通,看看接口有没有打开。

检查命令:show ip ospf interface bri



2、检查OSPF的配置

检查OSPF是否配置正确,相应的接口有没有宣告成功,或者宣告的地址是否匹配,或者是区域等不匹配,再或者是命令本身的错误。

检查命令:show run | s router ospf 



3、检查路由器之间OSPF是否有认证存在

可以使用debug ip ospf adj 来查看,可以自己使用不同的情况来验证,如果日志开启,也应该会有提示显示

检查命令:debug ip ospf adj 



4、检查OSPF宣告的区域类型是否匹配

区域类型通常有三种Stub/transit/NSSA,也可以通过DEbug来检查:

R1#debug ip ospf adj 



5、MTU是否不匹配

邻居建立过程中MTU需要匹配,通常MTU不匹配的情况下,邻居关系始终停留在EXSTART状态,MTU默认为1500,可以通过 

命令:Show ip ospf interface +接口来查看,也可以通过Debug。



6、检查是否有访问控制列表ACL禁止了OSPF流量,或者接口被PASSIVE

OSPF通常使用组播地址 224.0.0.5 来发送Hello包,如果被阻止,OSPF邻居无法建立。

检查命令有:show ip os int bri  , show ip os nei ,  show ip access-list .



7、两个路由器的Router id相同,

如果两个路由器的Router id相同,则ospf的master和slave关系不能确定。

检查命令: show ip os , show ip prot , show run | s router ospf



8、另外还有很多原因可导致OSPF邻居不能建立

如:Hello/dead 间隔不匹配  ; 

使用了第二地址secondary IP来建立OSPF adjacency