OSPF(Open Shortest Path First,开放最短路径优先)是IETF开发的一个基于链路状态的内部网关协议,目前在互联网上大量地使用。本章主要介绍OSPF协议的工作原理,包括其分层结构、网络类型、报文封装、邻居建立和维护等内容。
7.2 OSPF协议概述
7.2.1 OSPF协议特点
RIP协议是一个典型的距离矢量路由协议。在使用过程中,具有以下的限制:
网络扩展性不好:在RIP协议中,跳数为16跳的路由就被认为是不可达。因此,网络中使用RIP协议时,最大直径就被限制为15跳,这就决定了RIP协议只能在规模较小的网络中使用,不能适应大规模组网的需要。
周期性广播消耗了大量带宽资源:RIP协议在路由更新的时候,是通过广播(RIP-1)或者组播(RIP-2)的方式,向邻居通告全部路由信息。在路由条目较多的情况下,会消耗大量的有限链路带宽资源。
路由收敛速度慢:由于RIP协议采用周期性的路由更新方式,所以在网络拓扑发生变化时,需要经过较长的时间才能完成路由的重新收敛。所以,RIP协议并不适用于需要路由快速收敛的网络中。
以跳数作为度量值:RIP协议中,进行路由的度量值计算时只考虑了跳数的因素。而实际上,数据报文在多跳高速链路传输所花费的时间很可能要远比在单跳低速链路上要少。因此,仅仅将跳数作为度量值的因素,而不考虑链路带宽等其他因素,可能会导致协议选路的不合理。
存在路由环路:由于设计机制的原因,RIP协议无法彻底解决路由环路的问题,只能够通过毒性逆转、水平分割等方法降低路由环路产生的可能性。这在一定程度上,也限制了RIP协议的使用范围。
OSPF协议是典型的链路状态路由协议,和RIP协议有很大的不同。它具有以下特点:
支持较大规模的网络:OSPF协议无路由跳数限制,所以其适应范围广,支持网络规模更大。在特定的组网环境下,OSPF单区域甚至可支持几十台路由器。
组播触发式更新:OSPF协议在收敛完成后,会以触发方式发送拓扑变化的信息给其它路由器,从而占用了较少的链路带宽;同时,在某些类型的链路上以组播方式发送协议报文,减少对其他设备的干扰。
收敛速度快:在网络的拓扑结构发生变化后,OSPF会立即发送更新报文,从而使拓扑变化很快扩散到整个自治系统;同时,OSPF采用周期较短的Hello报文来维护邻居状态。
以开销(Cost)作为度量值:OSPF协议在设计时,就考虑到了链路带宽对路由度量值的影响。OSPF采用链路开销作为度量值,而链路开销与链路带宽成反比,即带宽越高,开销越小。这样,OSPF选路主要基于带宽因素。
协议设计避免路由环路:由于OSPF根据收集到的链路状态用最短路径树算法计算路由,从算法本身保证了不会生成自环路由。
应用广泛:目前在互联网有大量的应用实例,是使用最广泛的IGP之一。
7.2.2 OSPF基本原理
作为典型的链路状态型路由协议,OSPF协议的工作过程包含了邻居发现、路由交换、路由计算、路由维护阶段。主要涉及一下三张表:
邻居表:运行OSPF协议的路由器以组播方式(目的地址224.0.0.5)发送Hello报文来发现邻居。收到Hello报文的邻居路由器检查报文中所定义的参数,如果双方一致就会形成邻居关系。邻居表会记录所有的建立了邻居关系的路由器,包括相关描述和邻居状态。路由器会定时的向自己的邻居发送Hello报文,如果在一定的周期内,没有收到邻居的回应报文,就认为邻居路由器已经失效,将它从邻居表中删除。
链路状态数据库(LSDB):有时也被称作拓扑表。根据协议规定,运行OSPF协议的路由器之间并不是交换路由表,而是交换彼此对于链路状态的描述信息。交换完成之后,所有同一区域的路由器的拓扑表中都具有当前区域的所有链路状态信息,并且都是一致的。
路由表:运行OSPF协议的路由器在获得完整的链路状态描述之后,运用SPF算法进行计算,并且将计算出来的最优路由加入OSPF路由表中。
OSPF 基于Dijkstra算法,也称为SPF(Shortest Path First,最短路径优先)算法。这种算法的特点是,路由器收集网络中链路或接口的状态,然后将自己已知的链路状态向该区域的其他路由器通告。这样,区域内的每台路由器都建立了一个本区域的完整的链路状态数据库。然后路由器根据链路状态数据库来创建它自己的网络拓扑图,并计算生成路由。
OSPF路由的生成过程具体如下:
- 第一步:生成LSA描述自己的接口状态:
每台运行OSPF的路由器都根据自己周围的网络拓扑结构生成LSA(链路状态通告)。LSA中包含了接口状态(up或down)、链路开销、IP地址/掩码等信息。
OSPF链路开销值与接口带宽密切相关。缺省情况下,开销值与接口带宽成反比。此外,为了对协议选路的结果进行人工干预,路由器也支持通过命令来指定接口的开销值。
- 第二步:同步OSPF区域内每台路由器的LSDB
OSPF路由器通过交换LSA实现LSDB同步。
由于一条LSA是对一台路由器或一个网段拓扑结构的描述,整个LSDB就形成了对整个网络拓扑结构的描述。LSDB实质上是一张加权的有向图,这张图表示对整个网络拓扑结构的真实反映。显然,OSPF区域内所有路由器得到的是完全相同的图。
- 第三步:使用SPF计算出路由
IOSPF路由器使用SPF算法以自身为节点计算出一颗最短路径树。在这颗树上,由根到各节点的累计开销最小,即由根到各节点的路径在整个网络中是最优的,这样也就获得了由根去往各个节点的路由。计算完成后,路由器将加入OSPF路由表。当SPF算法发现有两条到达目标网络的路径cost都相同时,就会将这两条路径都加入osfp路由表,形成等价路由。
7.3 分层结构
7.3.1 骨干区域与非骨干区域
随着网络规模日益扩大,当一个大型网络中的路由器都运行OSPF路由协议时,路由器数量的增多会导致LSDB非常庞大,占用大量的存储空间,并使得运行SPF算法的复杂度增加,导致CPU负担很重。
在网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于不稳定状态之中,造成网络中有大量的OSPF协议报文在传递,降低了网络带宽的利用率。更为严重的是,每一次变化都会导致网络中所有的路由器重新进行路由计算。
OSPF 协议通过将自治系统划分成不同的区域(Area)来解决上述问题。区域是从逻辑上将路由器划分为不同的组,每个组用区域号(AreaID)来标识。区域的边界是路由器,而不是链路。一个网段(链路)只能属于一个区域,或者说每个运行OSPF的接口必须属于某个特定区域。
并非所有的OSPF区域都是平等的关系。其中有一个区域是与众不同的,它的区域号(Area ID)是0,通常被称为骨干区域。骨干区域负责区域之间的路由,非骨干区域之间的路由信息必须通过骨干区域来转发。对此,OSPF有两个规定:
所有非骨干区域必须与骨干区域保持连通;
骨干区域自身也必须保持连通。
OSPF协议的区域划分可以带来以下好处:
减少区域内LSA的数量:在进行了区域划分之后,OSPF路由器的LSDB就不需要维护所有区域的链路状态信息,而只需要维护本区域内的链路状态信息。LSDB所维护的LSA数量减少了,运行OSPF协议对于路由器性能的要求也降低了。这样对于性能不是很好的路由器来说,也同样可以运行OSPF协议。
便于管理:功能性和地理位置相同的路由器,往往有着相同的路由选择需求。例如,对于某国家骨干网来说,可以根据地理位置,将各个省份的路由器划分在不同的区域内,也可以根据功能性的需求,将服务器区、测试区、网管区等中的路由器划分在为不同的区域内,对于它们进行集中管理,同时进行路由控制。
减少路由震荡的影响:可以对部分区域进行特殊配置,或者在区域边缘设置路由聚合和路由过滤等策略,将路由震荡控制在区域内,减少对于自治系统内其他区域路由器的影响,降低其他区域路由器SPF算法反复计算的次数。
7.3.2 OSPF 路由器类型
根据其在AS中的不同位置,OSPF路由器可以分为以下四类:
区域内路由器(Internal Router):该类路由器的所有接口都属于一个OSPF区域。
区域边界路由器(ABR,Aera Border Router):该类路由器可以同时属于两个以上的区域,但其中一个必须是骨干路由器。ABR用来连接骨干区域和非骨干区域,他与骨干区域之间既可以是屋里连接,也可以是逻辑连接。
骨干路由器(Backbone Router):该类路由器至少有一个接口属于骨干区域。因此,所有的ABR和位于Area0的内部路由器都是骨干路由器。
自治区边界路由器(ASBR,Automous System Border Router):与其他AS交换路由信息的路由器成为ASBR。ASBR不一定位于AS的边界,它有可能是区域内的路由器,也可能是ABR。只要一台OSPF路由器引入了外部路由器的信息,他就是ASBR。
根据OSPF协议当中对路由器类型的定义,在上图所示网络中:
RTA RTF RTG所有接口都属于一个ospf区域内,为区域内路由器;
RTD和RTE同时属于两个以上的区域,而且均有一个接口处于骨干区域Area0,为ABR;
RTA RTB RTC RTD RTE都至少有一个接口属于Area0,为骨干路由器;
RTB 虽然有一个接口属于骨干路由器,但是该路由器引入了外部路由信息,为ASBR。
7.4 Router ID与网络类型
7.4.1 Router ID
Router ID(RID)是一个32位比特无符号整数,在大部分使用环境下,都可以用来在一个自制系统中唯一的标识一台路由器,以区分其他路由器。路由器在启动OSPF协议之前,会首先检查Router ID的配置。
如果没有通过相关命令配置RouterID,路由器会按照以下顺序自动选择一个Router ID:
如果存在配置IP地址的Loopback接口,则选择Loopback接口地址中最大的作为Router ID;
如果没有配置IP地址的Loopback接口,则从其他接口的IP地址中选择最大的作为Router ID(不考虑接口的up/down状态)。
一般情况下,建议配置Loopback接口,并且将loopback接口的ip地址配置为路由器的router id,以便统一管理和区分其他路由器。
RTA配置了Loopback接口,使能了OSPF协议后,优先选择Loopback接口的IP地址作为RouterID,也就是172.16.1.1,而不考虑其他任何物理接口的IP地址配置。
RTB没有配置Loopback接口,使能了OSPF协议后,三个物理接口的IP地址配置分别为:GE0/0192.168.1.1/24、GE0/1 192.168.2.1/24、GE1/0 192.168.3.1/24。尽管接口GE1/0处于down状态,但OSPF仍然选择了数值最大的IP地址,即192.168.3.1作为Router ID。
7.4.2 OSPF网络类型
OSPF 根据链路层协议类型将网络分为下列四种类型:
Broadcast:当链路层协议是Ethernet、FDDI时,OSPF缺省认为网络类型是Broadcast。在该类型的网络中,通常以组播形式(224.0.0.5和224.0.0.6)发送协议报文。
NBMA(Non-Broadcast Multi-Access,非广播多点可达网络):当链路层协议是帧中继、ATM或X.25时,OSPF缺省认为网络类型是NBMA。在该类型的网络中,以单播形式发送协议报文。
P2MP(Point-to-MultiPoint,点到多点):没有一种链路层协议会被缺省的认为是P2MP类型。点到多点必须是由其他的网络类型强制更改的。常用做法是将NBMA改为点到多点的网络。在该类型的网络中,以组播形式(224.0.0.5)发送协议报文。
P2P(Point-to-Point,点到点):当链路层协议是PPP、HDLC时,OSPF缺省认为网络类型是P2P。在该类型的网络中,以组播形式(224.0.0.5)发送协议报文。
NBMA网络是指非广播、多点可达的网络,较为典型的有ATP和帧中继网络。
对于接口的网络类型为NBMA的网络需要进行一些特殊的配置。由于无法通过报文的形式发现相邻路由器,必须手工为该接口指定相邻路由器的IP地址。
根据OSPF协议要求,NBMA网络必须是全连通的,即网络中任意两台路由器之间都必须有一条虚电路直接可达。如果部分路由器之间没有直接可达的链路时,应将接口配置成P2MP类型。如果路由器在NBMA网络中只有一个对端,也可将接口类型配置为P2P类型。
OSPF协议中,NBMA和P2MP网络之间的区别在于:
从定义上来看,NBMA网络是指那些全连通的、非广播、多点可达网络。而P2MP网络,则并不需要一定是全连通的。
NBMA是一种缺省的网络类型,如链路层协议是帧中继、ATM或X.25时,接口默认的网络类型就是NBMA。而P2MP网络必须是由其它的网络强制更改的。最常见的做法是将NBMA网络改为P2MP网络。
NBMA网络采用单播发送报文,需要手工配置邻居,否则无法正常建立邻居关系。P2MP网络采用组播方式发送报文,不需要手工配置邻居,可以依靠协议自身的机制建立邻居关系。
7.5 报文和封装
OSPF有五种类型的报文:
Hello报文:周期行的发送,用来发现和维持OSPF的邻居关系。内容包括一些定时器数值、DR(Designated Rrouter,指定路由器)、BDR(Backup Designated Router,备份指定路由器)以及自己已知的邻居。
DD(Database Description,数据库描述)报文:描述了本地LSDB中每一条LSA的摘要信息,用于两台路由器进行数据同步。
LSR(Link State Request,链路状态请求)报文:向对方请求所需的LSA。两台路由器交换DD报文之后,的值对端路由器有哪些LSA是本地LSDB缺少的,这时需要发送LSR报文向对方请求所需LAS。内容包括所需要的LSA摘要。
LSU(Link State Update,链路状态更新)报文:向对方发送其所需要的LSA。
LSAck(Link State Acknowledgement,链路状态确认)报文:用来对收到的LSA进行确认。内容是需要确认的LSA的Header(一个报文可对多个LSA确认)
OSPF报文是直接封装在IP报文之中的,其IP报文头的协议号为89。
一个正常的OSPF报文的封装顺序是:
第一步:将OSPF协议报文,如hello DD LSR LSU 和LSAck报文作为净荷封装在IP报文中,将协议号设置为89。
第二步:将收到的IP报文进行链路层封装,具体格式取决于通信的链路层协议。封装上相应的帧头和帧尾后,就构成一个完整的链路帧。
7.6 邻居建立和状态迁移
7.6.1 邻居发现和维护
OSPF协议中同一链路两台路由器是通过hello报文互相发现,并建立邻居关系的。
两台路由器分别以组播(224.0.0.5)发送OSPF的hello报文。hello报文中包含自己的router id以及相关参数的协商信息。
RTA和RTB根据自己受到的hello报文,判断协商的参数是否通过。如果验证、区域等参数都一致,那么互相认为邻居已经被发现。
邻居发现后,hello报文还起到维持邻居关系的作用:
邻居之间周期性的交换Hello报文,以确认邻居是否工作正常。在一定的时间间隔内,只要能够从邻居中收到Hello报文,就可以认为邻居工作正常,继续维持邻居关系。
如果在一定的时间间隔内,收不到邻居发来的Hello报文,就认为邻居已经失效,从邻居表中删除。
OSPF还定义了两个计时器:
Hello定时器:向邻居发送hello报文的时间间隔,ospf邻居之间的hello定时器的值保持一致,且应与路由收敛速度,网络负荷大小成反比。
邻居失效时间:在邻居失效时间内,如果接口还没有收到邻居发送的hello报文,路由器会 宣告该邻居无效。
7.6.2 DR/BDR的选举
在广播网和NBMA网络中,任意两台路由器之间都要传递路由信息。如果网络中有n台路由器,则需要建立n(n-1)/2个邻接关系。这使得任何一台路由器的路由变化都会导致多次传递,浪费了带宽资源。为解决这一问题,OSPF协议定义了DR(Designated Router,指定路由器),所有路由器都只将信息发送给DR,由DR将网络链路状态发送出去。
如果DR由于某种故障而失效,则网络中的路由器必须重新选举DR,再与新的DR同步。
这需要较长的时间,在这段时间内,路由的计算是不正确的。为了能够缩短这个过程,OSPF提出了BDR(Backup Designated Router,备份指定路由器)的概念
BDR实际上是对DR的一个备份,在选举DR的同时也选举出BDR,BDR也和本网段内的所有路由器建立邻接关系并交换路由信息。当DR失效后,BDR会立即成为DR。由于不需要重新选举,并且邻接关系事先已建立,所以这个过程是非常短暂的。当然这时还需要再重新选举出一个新的BDR,虽然一样需要较长的时间,但并不会影响路由的计算。
DR和BDR之外的路由器(称为DROther)之间将不再建立邻接关系,也不再交换任何路由信息。这样就减少了广播网和NBMA网络上各路由器之间邻接关系的数量。
在OSPF中,邻居(Neighbor)和邻接(Adjacency)是两个不同概念。
OSPF路由器启动后,便会通过OSPF 接口向外发送Hello报文。收到Hello报文的OSPF路由器会检查报文中所定义的参数,如果双方一致就会形成邻居关系。
形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有当双方成功交换DD报文
,交换LSA
并达到LSDB的同步
之后,才形成真正意义上的邻接关系。
DR和BDR是由同一网段中所有的路由器根据路由器优先级、Router ID通过Hello报文选举出来的,只有优先级大于0的路由器才具有选举资格。
进行DR/BDR选举时每台路由器将自己选出的DR写入Hello报文中,发给网段上的每台运行OSPF协议的路由器。当处于同一网段的两台路由器同时宣布自己是DR时,路由器优先级高者胜出。如果优先级相等,则Router ID大者胜出。如果一台路由器的优先级为0,则它不会被选举为DR或BDR。
此外,DR/BDR的选举机制还具有以下特点:
只有在广播或者NBMA网络中才会选举DR,在点到点或点到多点类型的接口上不需要选举DR。
DR是某个网段中的概念,是针对路由器接口而言,某一台路由器上一个接口可以是DR,在另一个接口上可能是BDR,或者是DR Other
路由器优先级影响一个选举过程,但是当DR/BDR已经选举完毕,就算一台具有更高优先级的路由器变为有效,也不会替换该网段中已经存在的DR/BDR成为新的DR/BDR。
DR并不一定就是优先级最高的路由器接口;同理BDR也并不一定是路由器优先级次高的路由器接口。
在上图的示例中,某一网段192.168.0.0/16中现有四台路由器RTA、RTB、RTC和RTD,它们的Router ID分别为192.168.1.1、192.168.2.1、192.168.3.1和192.168.4.1。
假设这四台路由器同时进行DR/BDR的选举。在没有对优先级进行配置的情况下,所有路由器的优先级都是一致的,那么对于这四台路由器的Router ID进行比较,RTD的Router ID最大,因此被选举为DR;RTC的Router ID仅次于RTD,因此被选举为BDR;RTA和RTB成为DRother。
网络中新增了一台路由器RTE,它的Router ID为192.168.5.1,此时DR的选举已经结束。虽然RTE的优先级与其他路由器一致,而它的Router ID比RTD、RTC都要大,但是出于网络稳定性的考虑,RTE只能成为DRother。
在上图所示网络中,RTD作为DR,RTC作为BDR,RTA、RTB和RTE都作为DRother。
假设RTD突然失效,此时作为BDR的RTC立刻成为DR。由于之前就已经和DRother路由器建立了邻接关系,因此不需要重新建立。
RTA、RTB、RTE这些DRother路由器需要重新选举一个BDR,以作为DR的备份。
在优先级一致的情况下,只需要比较Router ID的大小,从而将RTE选举成为BDR,以便和DRother 路由器建立邻接关系。
- 整个选举过程结束,网络重新稳定。此时如果RTD重新恢复,也不能改变整个DR/BDR的选举结果,只能成为DRother路由器。
7.6.3 邻接关系建立过程
RTA和RTB的RouterID分别为1.1.1.1和2.2.2.2,运行OSPF协议。它们建立邻接关系的过程如下:
第一步:初始情况下,邻居关系处于DOWN状态。之后RTA发送hello报文,由于没有发现任何邻居,因此它的表项是空的。并且DR字段设置为0.0.0.0;
第二步:RTB接收到RTA的hello报文后,将RTA添加到自己的邻居表中,同时将RTA的邻居状态设置为init状态。与RA比较routerid,由于RTB的router id比较大,所以在发送hello报文中,将DR字段设置为自己的Router ID。
第三步:RTA收到RTB发来的Hello报文,在邻居列表中发现了自己的RouterID,因而将邻居表中RTB的状态修改为2-way。RTA发送Hello报文,其中邻居列表添加RTB的Router。
第四步:RTB检查RTA的Hello报文,发现了自己的RouterID,从而将邻居表中的RTA状态也修改为2-way。如果当前链路上,RTA和RTB都是DRother路由器,它们之间的邻接状态就停留在2-way状态。如果RTA、RTB有一个是DR/BDR,它们还需要进一步建立邻接关系。
前文讲述了运行OSPF协议的路由器建立2-way状态的进程。如果这两台路由器还承担了DR或者BDR的角色,那么他们还需要进一步建立邻接关系。
第五步:RTA将邻居表中的RTB的状态设置为
ExStart
状态,并且发送一个不包含LSA摘要的DD报文,开始主从关系协商
。这个DD报文的序列号由RTA决定,设置为X;I位被设置为1,表明这是RTA发起的初始化报文;M位置被置为1,表明这不是最后一个DD报文;MS位被置为1,表明RTA首先判断自己是Master路由器。这里的Master路由器的作用主要是在交换DD报文时候,能够主动发送DD报文,并且控制修改报文序列号,对应的Slave路由器只能接受Master路由器使用的序列号,被动的发送DD报文。第六步:RTB收到RTA的DD报文之后,将邻居表中的RTA的状态也置为
ExStart
状态。由于RTB的router id数值要大于RTA,因此RTB认为自己应该作为Master 路由器,所以它发送的DD报文中同样将MS位置为1,用来表明自己Master路由器的身份。RTB使用的序列号为Y,同时将I位也置为1,分别表明这是初始化报文以及后续还有更多的DD报文。第七步:RTA同意RTB作为Master路由器,因此将MS设置为0,表明自己是Slave路由器身份,并采用RTB设置的序列号Y开始发送DD报文。这时DD报文中包含LSA摘要,RTA将邻居中的RTB状态修改为
Exchange
。第八步:RTB收到RTA发来的DD报文,将邻居表中的RTA的状态信息修改为Exchange,接下来采用Y+1的序列号和RTA交换LSA信息。
RTA和RTB对于DD报文中包含的LSA摘要信息,与自己的LSDB做比较。RTB发现所有的LSA信息在LSDB中都存在,因此直接进入Full状态。RTA比较之后,发现LSDB中缺少部分的LSA,需要向RTB请求这些LSA:
第9步:RTA将邻居表中RTB的状态设置为Loading,同时向RTB发送LSR报文,请求自己缺少的LSA,LSR报文中也仅仅包含LSA摘要。
第10步:RTB收到LSR报文,将请求的LSA全部内容以一条或者多条的LSU报文发送给RTA。
第11步:RTA将收到的LSA放入自己的LSDB,直到所有请求的LSA都获得之后,它将邻居表中的RTB的状态设置为FULL。
到这个时候,完整的邻接关系才算是建立完成。
7.6.4 OSPF邻居状态机
OSPF协议使用邻居状态机来表示邻居路由器的状态,主要有以下几种:
Down:上一个邻居状态失效时间内,当前接口没有收到任何hello报文。这个状态是状态机的第一个稳定状态。
Attempt:这个状态只存在NBMA(非广播型点到多点)网络中。当一台设设备试图通过Hello报文去联系自己的邻居,但是还没有收到回应报文时,就将它的邻居状态设置为
Attempt
状态。Init:一台路由器收到了其他路由器发来的hello报文,但是在hello报文中的邻居表中没有看到自己的Router ID。
2-way:一台路由器收到了其他路由器发来的hello报文,在hello报文中的邻居报文中看到自己的Router ID。这是状态机的第二个稳定状态。
ExStart:一台路由器与它的邻居在这个状态协商主从关系,并且Master路由器决定DD交换的序列号。
Exchange:在这个状态时,路由器邻居之间交换DD报文。
Loading:路由器比较DD报文和LSDB,如果发现DD存在LSDB中不具有的LSA,则向邻居发送LSU请求LSA。
Full:在这个状态,路由器结束更新自己的LSDB,具有完整的LSDB。这是状态的第三个稳定状态。
在这些状态机中,只有Down
、2-way
、Full
才是稳定状态,其他状态都是瞬时的中间状态。正常情况下,DR/BDR和DRother路由器的邻居状态应该稳定在Full状态,而DRother路由器之间的邻居状态应该稳定在2-way状态。
7.7 LSDB更新
当网络拓扑发生变化时,感知到变化的OSPF路由器会生成相应的LSA更新报文,发送到区域中。运行OSPF协议的路由器收到一条LSA更新报文的时候,其工作流程如下:
1)系统会首先在LSDB中查找这条LSA,如果查找不到,就认为这是一条新的LSA,加入LSDB
2)如果查找到了此条LSA,那么比较这条LSA的序列号,如果收到的LSA的序列号更大,那么认为这条LSA有了更新,将这条LSA的计时器刷新,同时更新序列号。
3)如果收到新的LSA的序列号等于或小于LSDB中的序列号,那么认为收到的LSA可能是由于网络拥塞或重传的陈旧的LSA,不会对LSDB的LSA做任何操作,并将其收到的LSA更新报文丢弃。
另外,为了保证LSDB及时刷新,LSDB里面的LSA都设定有老化时间,缺省为1小时。
如果1个小时LSA没有被更新,LSA将会老化同时被移除。
缺省情况下,LSDB每隔半个小时刷新一次所有的LSA。此时,LSA的序列号会加一,同时老化计时器会重置。
当路由器想把一条LSA从LSDB中删除,可以将老化时间设置为最大老化时间,然后向所有路由器发送更新。
为了节省网络带宽与降低路由器资源消耗,在广播和NBMA网络中,链路状态发生变化时,主要是通过DR路由器发送更新报文,以便其他路由器更新自己的LSDB。
在上图所示网络中,RTC和RTD分为作为DR和BDR,负责LSA更新报文的传播。
RTA发现链路状态发生变化,以组播方式(224.0.0.6),将LSU报文发送给RTC和RTD。组播地址224.0.0.6表示只有DR和BDR能够接收到这个报文。
RTC作为DR,收到报文后,发送LSAck报文确认;同时使用组播地址224.0.0.5,将LSU报文发送给所有的OSPF路由器。