问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

OSPF协议基本原理

创作时间:
作者:
@小白创作中心

OSPF协议基本原理

引用
1
来源
1.
https://info.support.huawei.com/hedex/api/pages/EDOC1100277650/AZM1016J/04/resources/vrp/feature_0003995223.html

OSPF(Open Shortest Path First)协议是目前应用最为广泛的链路状态路由协议之一,主要用于大型企业网络和互联网服务提供商的骨干网络中。本文将详细介绍OSPF协议的基本原理,包括邻接关系的建立过程、路由计算等核心内容。

OSPF协议路由的计算过程

OSPF协议路由的计算过程可简单描述如下:

  1. 建立邻接关系,过程如下:

    1. 本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
    2. 两端设备进行主/从关系协商和DD报文交换。
    3. 两端设备通过更新LSA完成链路数据库LSDB的同步。
  2. 路由计算: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是不稳定状态。不稳定状态是在转换过程中瞬间存在的状态,一般不会超过几分钟。

图1 OSPF邻居状态机

状态机
含义
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之间只形成邻居关系。

图2 在广播网络中建立OSPF邻接关系

如图2所示,在广播网络中建立OSPF邻接关系的过程如下:

  1. 建立邻居关系
    1. RouterA的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个Hello报文(使用组播地址224.0.0.5)。此时,RouterA不确定DR是哪台路由器(DR=0.0.0.0),也不确定邻居是哪台路由器(Neighbors Seen=0)。
    2. 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。
    3. RouterA收到RouterB回应的Hello报文后,将邻居状态机置为2-way状态,下一步双方开始发送各自的链路状态数据库。

在广播网络中,两个接口状态是DR Other的路由器之间将停留在此步骤。

  1. 主/从关系协商、DD报文交换

    1. RouterA首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号Seq=x。I=1表示这是第一个DD报文,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文。
    2. 为了提高发送的效率,RouterA和RouterB首先了解对端数据库中哪些LSA是需要更新的,如果某一条LSA在LSDB中已经存在,就不再需要请求更新了。为了达到这个目的,RouterA和RouterB先发送DD报文,DD报文中包含了对LSDB中LSA的摘要描述(每一条摘要可以唯一标识一条LSA)。为了保证在传输的过程中报文传输的可靠性,在DD报文的发送过程中需要确定双方的主从关系,作为Master的一方定义一个序列号Seq,每发送一个新的DD报文将Seq加一,作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的Seq。
    3. RouterB在收到RouterA的DD报文后,将RouterB上和RotuerA关联的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RouterB的Router ID较大,所以在报文中RouterB认为自己是Master,并且重新规定了序列号Seq=y。
    4. RouterA收到报文后,同意了RouterB为Master,并将RouterA上和RouterB关联的邻居状态机改为Exchange。RouterA使用RouterB的序列号Seq=y来发送新的DD报文,该报文开始正式地传送LSA的摘要。在报文中RouterA将MS=0,说明自己是Slave。
    5. RouterB收到报文后,将RouterB上和RotuerA关联的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,此时RouterB将报文的序列号改为Seq=y+1。
    6. 上述过程持续进行,RouterA通过重复RouterB的序列号来确认已收到RouterB的报文。RouterB通过将序列号Seq加1来确认已收到RouterA的报文。当RouterB发送最后一个DD报文时,在报文中写上M=0。
  2. LSDB同步(LSA请求、LSA传输、LSA应答)

    1. RouterA收到最后一个DD报文后,发现RouterB的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RouterB也收到了RouterA的最后一个DD报文,但RouterA的LSA,RouterB都已经有了,不需要再请求,所以直接将和RouterA关联的邻居状态机改为Full状态。
    2. RouterA发送LSR报文向RouterB请求更新LSA。RouterB用LSU报文来回应RouterA的请求。RouterA收到后,发送LSAck报文确认。
    3. 上述过程持续到RouterA中的LSA与RouterB的LSA完全同步为止,此时RouterA将和RouterB关联的邻居状态机改为Full状态。当路由器交换完DD报文并更新所有的LSA后,此时邻接关系建立完成。

在NBMA网络中建立OSPF邻接关系

NBMA网络和广播网络的邻接关系建立过程只在交换DD报文前不一致,如图3中的蓝色标记。在NBMA网络中,所有路由器只与DR和BDR之间形成邻接关系。

图3 在NBMA网络中建立OSPF邻接关系

如图3所示,在NBMA网络中建立OSPF邻接关系的过程如下:

  1. 建立邻居关系
    1. RouterB向RouterA的一个状态为Down的接口发送Hello报文后,RouterB的邻居状态机置为Attempt。此时,RouterB认为自己是DR路由器(DR=2.2.2.2),但不确定邻居是哪台路由器(Neighbors Seen=0)。
    2. RouterA收到Hello报文后将邻居状态机置为Init,然后再回复一个Hello报文。此时,RouterA同意RouterB是DR路由器(DR=2.2.2.2),并且在Neighbors Seen字段中填入邻居路由器的Router ID(Neighbors Seen=2.2.2.2)。
    3. RouterB收到RouterA发送的Hello报文后,将邻居状态机置为2-way。然后发送一个Hello报文回应给RouterA,并且在报文中的Neighbors Seen字段中填入RouterA的Router ID(Neighbors Seen=1.1.1.1),表示已收到RouterA的Hello报文。
    4. RouterA收到RouterB回应的Hello报文后,将邻居状态机置为2-way状态,下一步双方开始发送各自的链路状态数据库。

在NBMA网络中,两个接口状态是DROther的路由器之间将停留在此步骤。

  1. 主/从关系协商、DD报文交换过程同广播网络的邻接关系建立过程。
  2. LSDB同步(LSA请求、LSA传输、LSA应答)过程同广播网络的邻接关系建立过程。

在点到点/点到多点网络中建立OSPF邻接关系

在点到点/点到多点网络中,邻接关系的建立过程和广播网络一样,不同的是不需要选举DR和BDR。对于点到点网络,DD报文是组播发送的。对于点到多点网络,由于DD报文需要和指定邻居交换LSDB,所以DD报文是单播发送的。

路由计算

OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。

OSPF协议使用链路状态通告LSA描述网路拓扑,即有向图。Router LSA描述路由器之间的链接和链路的属性。路由器将LSDB转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。各个路由器得到的有向图是完全相同的。如图4所示。

图4 由LSDB生成带权有向图

每台路由器根据有向图,使用SPF算法计算出一棵以自己为根的最短路径树,这棵树给出了到自治系统中各节点的路由。如图5所示。

图5 最短路径树

当OSPF的链路状态数据库LSDB发生改变时,需要重新计算最短路径,如果每次改变都立即计算最短路径,将占用大量资源,并会影响路由器的效率,通过调节SPF的计算间隔时间,可以抑制由于网络频繁变化带来的占用过多资源。缺省情况下,SPF时间间隔为5秒钟。

具体的计算过程如下:

  1. 计算区域内路由。
    Router LSA和Network LSA可以精确的描述出整个区域内部的网络拓扑,根据SPF算法,可以计算出到各个路由器的最短路径。根据Router LSA描述的与路由器的网段情况,得到了到达各个网段的具体路径。

在计算过程中,如果有多条等价路由,SPF算法会将所有等价路径都保留在LSDB中。

  1. 计算区域外路由。
    从一个区域内部看,相邻区域的路由对应的网段好像是直接连接在ABR上,而到ABR的最短路径已经在上一过程中计算完毕,所以直接检查Network Summary LSA,就可以很容易得到这些网段的最短路径。另外,ASBR也可以看成是连接在ABR上,所以ASBR的最短路径也可以在这个阶段计算出来。

如果进行SPF计算的路由器是ABR,那么只需要检查骨干区域的Network Summary LSA。

如果存在多个到ASBR的路径,需要注意各设备类型上intra和inter类型ASBR的优选规则是否一致,如果存在不一致可能发生环路。

RFC1583兼容模式和不兼容模式会影响选路规则,另外在相同模式下,不同厂商设备对该场景的选路规则的也可能存细微差异,在已知选路规则存在差异的情况下,本产品提供了命令行对ASBR在RFC1583兼容模式和不兼容模式的选路规则进行调整,可以在一定程度上避免环路。

  1. 计算自治系统外路由。
    由于自治系统外部的路由可以看成是直接连接在ASBR上,而到ASBR的最短路径在上一过程中已经计算完毕,所以逐条检查AS External LSA就可以得到到达各个外部网络的最短路径。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号