OSPF报文类型

表1 OSPF报文类型



报文类型

报文作用

Hello报文

周期性发送,用来发现和维持OSPF邻居关系。

DD报文

(Database Description packet)

描述本地LSDB的摘要信息,用于两台路由器进行数据库同步。

LSR报文

(Link State Request packet)

用于向对方请求所需的LSA。

路由器只有在OSPF邻居双方成功交换DD报文后才会向对方发出LSR报文。

LSU报文

(Link State Update packet)

用于向对方发送其所需要的LSA。

LSAck报文

(Link State Acknowledgment packet)

用来对收到的LSA进行确认。



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邻居状态机




ospf 7种状态 ospf几种状态_ospf 7种状态


表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已同步,本端设备和邻居设备建立了邻接状态。


OSPF基本原理

介绍OSPF的基本原理,包括邻居状态机、邻居关系建立以及路由计算等。

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

  1. 建立邻接关系,过程如下:
  2. 本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
  3. 两端设备进行主/从关系协商和DD报文交换。
  4. 两端设备通过更新LSA完成链路数据库LSDB的同步。

此时,邻接关系建立成功。

  1. 路由计算

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

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

广播链路邻接关系建立过程如图2所示。

在广播网络中,DR、BDR和网段内的每一台路由器都形成邻接关系,但DR other之间只形成邻居关系。

解释:DR和BDR相当于老大和备份老大,如果在广播类型的网络中,例如一个交换机连接了5台路由器进行ospf,如果单纯的两两之间建立邻接关系并且维护,每一台路由器都会维护4条邻接关系,两两之间的交互报文和保活报文便会造成网络拥塞,所以选个老大出来解决问题,只需要跟老大商量就行了。


ospf 7种状态 ospf几种状态_智能路由器_02


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

在广播网络中,两个接口状态是DR Other的路由器之间将停留在此步骤。(如上红字显示)

  1. 主/从关系协商、DD报文交换
  2. 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。

解释:意思就是说,发的是摘要信息,并不是完整的,大致看一下,完整的在接下来的报文中请求

  1. RouterB在收到RouterA的DD报文后,将RouterA的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RouterB的Router ID较大,所以在报文中RouterB认为自己是Master,并且重新规定了序列号Seq=y。
  2. RouterA收到报文后,同意了RouterB为Master,并将RouterB的邻居状态机改为Exchange。RouterA使用RouterB的序列号Seq=y来发送新的DD报文,该报文开始正式地传送LSA的摘要。在报文中RouterA将MS=0,说明自己是Slave。
  3. RouterB收到报文后,将RouterA的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,此时RouterB将报文的序列号改为Seq=y+1。

上述过程持续进行,RouterA通过重复RouterB的序列号来确认已收到RouterB的报文。RouterB通过将序列号Seq加1来确认已收到RouterA的报文。当RouterB发送最后一个DD报文时,在报文中写上M=0。

  1. LSDB同步(LSA请求、LSA传输、LSA应答)
  2. RouterA收到最后一个DD报文后,发现RouterB的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RouterB也收到了RouterA的最后一个DD报文,但RouterA的LSA,RouterB都已经有了,不需要再请求,所以直接将RouterA的邻居状态机改为Full状态。
  3. RouterA发送LSR报文向RouterB请求更新LSA。RouterB用LSU报文来回应RouterA的请求。RouterA收到后,发送LSAck报文确认。

上述过程持续到RouterA中的LSA与RouterB的LSA完全同步为止,此时RouterA将RouterB的邻居状态机改为Full状态。当路由器交换完DD报文并更新所有的LSA后,此时邻接关系建立完成。

在NBMA(Non-broadcast multiple access)网络中建立OSPF邻接关系

NBMA网络和广播网络的邻接关系建立过程只在交换DD报文前不一致,如图3中的蓝色标记。

在NBMA网络中,所有路由器只与DR和BDR之间形成邻接关系。


ospf 7种状态 ospf几种状态_网络_03


  1. 建立邻居关系
  2. RouterB向RouterA的一个状态为Down的接口发送Hello报文后,RouterB的邻居状态机置为Attempt。此时,RouterB认为自己是DR路由器(DR=2.2.2.2),但不确定邻居是哪台路由器(Neighbors Seen=0)。
  3. RouterA收到Hello报文后将邻居状态机置为Init,然后再回复一个Hello报文。此时,RouterA同意RouterB是DR路由器(DR=2.2.2.2),并且在Neighbors Seen字段中填入邻居路由器的Router ID(Neighbors Seen=2.2.2.2)。

在NBMA网络中,两个接口状态是DROther的路由器之间将停留在此步骤。(最上面的红字描述)

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

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

在点到点/点到多点网络中,邻接关系的建立过程和广播网络一样,唯一不同的是不需要选举DR和BDR,DD报文是组播发送的。

路由计算

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

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


ospf 7种状态 ospf几种状态_OSPF_04


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


ospf 7种状态 ospf几种状态_智能路由器_05


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

  1. 计算区域内路由。

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

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

  1. 计算区域外路由。

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

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

  1. 计算自治系统外路由。

由于自治系统外部的路由可以看成是直接连接在ASBR上,而到ASBR的最短路径在上一过程中已经计算完毕,所以逐条检查AS External LSA就可以得到到达各个外部网络的最短路径。