02、OSPF协议基本原理
OSPF协议基本原理
OSPF协议路由的计算过程可简单描述如下:
- 建立邻接关系,过程如下:
-
本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
-
两端设备进行主/从关系协商和DD报文交换。
-
两端设备通过更新LSA完成链路数据库LSDB的同步。
-
- 路由计算
OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。
OSPF邻居状态机
在OSPF网络中,为了交换路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念:
-
邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
-
邻接关系:形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。
邻居和邻接状态是通过OSPF状态机表现的,OSPF共有8种邻居状态机,分别是Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full,如图1所示。Down、2-way、Full是稳定状态,Attempt、Init、Exstart、Exchange、Loading是不稳定状态。不稳定状态是在转换过程中瞬间存在的状态,一般不会超过几分钟。
状态机 |
含义 |
---|---|
Down |
邻居会话的初始阶段。表明没有在邻居失效时间间隔内收到来自邻居设备的Hello报文。 |
Attempt |
处于本状态时,定期向手工配置的邻居发送Hello报文。 说明:
Attempt状态只适用于NBMA类型的接口。 |
Init |
本状态表示已经收到了邻居的Hello报文,但是对端并没有收到本端发送的Hello报文。 |
2-way |
互为邻居。本状态表示双方互相收到了对端发送的Hello报文,建立了邻居关系。 如果不形成邻接关系则邻居状态机就停留在此状态,否则进入Exstart状态。 |
Exstart |
协商主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。 |
Exchange |
交换DD报文。本端设备将本地的LSDB用DD报文来描述,并发给邻居设备。 |
Loading |
正在同步LSDB。两端设备发送LSR报文向邻居请求对方的LSA,同步LSDB。 |
Full |
建立邻接。两端设备的LSDB已同步,本端设备和邻居设备建立了邻接状态。 |
本端设备和状态可能与对端设备的状态不相同。例如本端设备的邻居状态是Full,对端设备的邻居状态可能是Loading。
建立邻接关系
在上述邻居状态机的变化中,有两处决定是否建立邻接关系:
- 当与邻居的双向通讯初次建立时。
- 当网段中的DR和BDR发生变化时。
OSPF在不同网络类型中,OSPF邻接关系建立的过程不同,分为广播网络,NBMA网络,点到点/点到多点网络。
在广播网络中建立OSPF邻接关系
广播链路临界关系建立过程如图2所示。
在广播网络中,DR、BDR和网段内的每一台路由器都形成邻接关系,但DR other之间只形成邻居关系。
如所示,在广播网络中建立OSPF邻接关系的过程如下:
- 建立邻居关系
-
RouterA的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个Hello报文(使用组播地址224.0.0.5)。此时,RouterA认为自己是DR路由器(DR=1.1.1.1),但不确定邻居是哪台路由器(Neighbors Seen=0)。
-
RouterB收到RouterA发送的Hello报文后,发送一个Hello报文回应给RouterA,并且在报文中的Neighbors Seen字段中填入RouterA的Router ID(Neighbors Seen=1.1.1.1),表示已收到RouterA的Hello报文,并且宣告DR路由器是RouterB(DR=2.2.2.2),然后RouterB的邻居状态机置为Init。
-
RouterA收到RouterB回应的Hello报文后,将邻居状态机置为2-way状态,下一步双方开始发送各自的链路状态数据库。
在广播网络中,两个接口状态是DR Other的路由器之间将停留在此步骤。
-
- 主/从关系协商、DD报文交换
-
RouterA首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号Seq=x。I=1表示这是第一个DD报文,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文。
为了提高发送的效率,RouterA和RouterB首先了解对端数据库中哪些LSA是需要更新的,如果某一条LSA在LSDB中已经存在,就不再需要请求更新了。为了达到这个目的,RouterA和RouterB先发送DD报文,DD报文中包含了对LSDB中LSA的摘要描述(每一条摘要可以惟一标识一条LSA)。为了保证在传输的过程中报文传输的可靠性,在DD报文的发送过程中需要确定双方的主从关系,作为Master的一方定义一个序列号Seq,每发送一个新的DD报文将Seq加一,作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的Seq。
- RouterB在收到RouterA的DD报文后,将RouterA的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RouterB的Router ID较大,所以在报文中RouterB认为自己是Master,并且重新规定了序列号Seq=y。
- RouterA收到报文后,同意了RouterB为Master,并将RouterB的邻居状态机改为Exchange。RouterA使用RouterB的序列号Seq=y来发送新的DD报文,该报文开始正式地传送LSA的摘要。在报文中RouterA将MS=0,说明自己是Slave。
- RouterB收到报文后,将RouterA的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,此时RouterB将报文的序列号改为Seq=y+1。
上述过程持续进行,RouterA通过重复RouterB的序列号来确认已收到RouterB的报文。RouterB通过将序列号Seq加1来确认已收到RouterA的报文。当RouterB发送最后一个DD报文时,在报文中写上M=0。
-
- LSDB同步(LSA请求、LSA传输、LSA应答)
-
RouterA收到最后一个DD报文后,发现RouterB的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RouterB也收到了RouterA的最后一个DD报文,但RouterA的LSA,RouterB都已经有了,不需要再请求,所以直接将RouterA的邻居状态机改为Full状态。
-
RouterA发送LSR报文向RouterB请求更新LSA。RouterB用LSU报文来回应RouterA的请求。RouterA收到后,发送LSAck报文确认。
上述过程持续到RouterA中的LSA与RouterB的LSA完全同步为止,此时RouterA将RouterB的邻居状态机改为Full状态。当路由器交换完DD报文并更新所有的LSA后,此时邻接关系建立完成。
-
在NBMA网络中建立OSPF邻接关系
NBMA网络和广播网络的邻接关系建立过程只在交换DD报文前不一致,如图3中的蓝色标记。
在NBMA网络中,所有路由器只与DR和BDR之间形成邻接关系。
如图3所示,在NBMA网络中建立OSPF邻接关系的过程如下:
- 建立邻居关系
-
RouterB向RouterA的一个状态为Down的接口发送Hello报文后,RouterB的邻居状态机置为Attempt。此时,RouterB认为自己是DR路由器(DR=2.2.2.2),但不确定邻居是哪台路由器(Neighbors Seen=0)。
-
RouterA收到Hello报文后将邻居状态机置为Init,然后再回复一个Hello报文。此时,RouterA同意RouterB是DR路由器(DR=2.2.2.2),并且在Neighbors Seen字段中填入邻居路由器的Router ID(Neighbors Seen=2.2.2.2)。
在NBMA网络中,两个接口状态是DROther的路由器之间将停留在此步骤。
-
-
主/从关系协商、DD报文交换过程同广播网络的邻接关系建立过程。
-
LSDB同步(LSA请求、LSA传输、LSA应答)过程同广播网络的邻接关系建立过程。
在点到点/点到多点网络中建立OSPF邻接关系
在点到点/点到多点网络中,邻接关系的建立过程和广播网络一样,唯一不同的是不需要选举DR和BDR,DD报文是组播发送的。
路由计算
OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。
OSPF协议使用链路状态通告LSA描述网路拓扑,即有向图。Router LSA描述路由器之间的链接和链路的属性。路由器将LSDB转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。各个路由器得到的有向图是完全相同的,如图4所示。
每台路由器根据有向图,使用SPF算法计算出一棵以自己为根的最短路径树,这棵树给出了到自治系统中各节点的路由,如图5所示。
当OSPF的链路状态数据库LSDB发生改变时,需要重新计算最短路径,如果每次改变都立即计算最短路径,将占用大量资源,并会影响路由器的效率,通过调节SPF的计算间隔时间,可以抑制由于网络频繁变化带来的占用过多资源。缺省情况下,SPF时间间隔为5秒钟。
具体的计算过程如下:
- 计算区域内路由。
Router LSA和Network LSA可以精确的描述出整个区域内部的网络拓扑,根据SPF算法,可以计算出到各个路由器的最短路径。根据Router LSA描述的与路由器的网段情况,得到了到达各个网段的具体路径。
在计算过程中,如果有多条等价路由,SPF算法会将所有等价路径都保留在LSDB中。
- 计算区域外路由。
从一个区域内部看,相邻区域的路由对应的网段好像是直接连接在ABR上,而到ABR的最短路径已经在上一过程中计算完毕,所以直接检查Network Summary LSA,就可以很容易得到这些网段的最短路径。另外,ASBR也可以看成是连接在ABR上,所以ASBR的最短路径也可以在这个阶段计算出来。
如果进行SPF计算的路由器是ABR,那么只需要检查骨干区域的Network Summary LSA。
- 计算自治系统外路由。
由于自治系统外部的路由可以看成是直接连接在ASBR上,而到ASBR的最短路径在上一过程中已经计算完毕,所以逐条检查AS External LSA就可以得到到达各个外部网络的最短路径。