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邻居状态机
表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协议路由的计算过程可简单描述如下:
- 建立邻接关系,过程如下:
- 本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
- 两端设备进行主/从关系协商和DD报文交换。
- 两端设备通过更新LSA完成链路数据库LSDB的同步。
此时,邻接关系建立成功。
- 路由计算
OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。
在广播网络中建立OSPF邻接关系
广播链路邻接关系建立过程如图2所示。
在广播网络中,DR、BDR和网段内的每一台路由器都形成邻接关系,但DR other之间只形成邻居关系。
解释:DR和BDR相当于老大和备份老大,如果在广播类型的网络中,例如一个交换机连接了5台路由器进行ospf,如果单纯的两两之间建立邻接关系并且维护,每一台路由器都会维护4条邻接关系,两两之间的交互报文和保活报文便会造成网络拥塞,所以选个老大出来解决问题,只需要跟老大商量就行了。
- 建立邻居关系
- 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报文后,将邻居状态机置为Exstart状态,下一步双方开始发送各自的链路状态数据库。
在广播网络中,两个接口状态是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(Non-broadcast multiple access)网络中建立OSPF邻接关系
NBMA网络和广播网络的邻接关系建立过程只在交换DD报文前不一致,如图3中的蓝色标记。
在NBMA网络中,所有路由器只与DR和BDR之间形成邻接关系。
- 建立邻居关系
- 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可以精确的描述出整个区域内部的网络拓扑,根据SFP算法,可以计算出到各个路由器的最短路径。根据Router LSA描述的与路由器的网段情况,得到了到达各个网段的具体路径。
说明:在计算过程中,如果有多条等价路由,SPF算法会将所有等价路径都保留在LSDB中。
- 计算区域外路由。
从一个区域内部看,相邻区域的路由对应的网段好像是直接连接在ABR上,而到ABR的最短路径已经在上一过程中计算完毕,所以直接检查Network Summary LSA,就可以很容易得到这些网段的最短路径。另外,ASBR也可以看成是连接在ABR上,所以ASBR的最短路径也可以在这个阶段计算出来。
说明:如果进行SPF计算的路由器是ABR,那么只需要检查骨干区域的Network Summary LSA。
- 计算自治系统外路由。
由于自治系统外部的路由可以看成是直接连接在ASBR上,而到ASBR的最短路径在上一过程中已经计算完毕,所以逐条检查AS External LSA就可以得到到达各个外部网络的最短路径。