一、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