路由配置与管理——OSPF路由配置与管理1

OSPF路由配置与管理

Ospf(开放式最短路径优先)是一个基于链路状态进行路由计算的动态路由协议,主要用于大中型网络。AR G3系列路由器支持OSPFv2和OSPFv3两种版本,OSPFv2仅支持IPv4,OSPFv3同时支持IPv4和IPv6。

OSPF显著特点就是不仅可以在一台路由器上运行多种OSPF路由进程,还可把一个AS(自治系统)划分成多个不同的Area(区域),然后基于路由器的位置和功能划分多种不同的OSPF路由器类型和OSPF路由类型,同时支持不同类型网络的连接。OSPF是一种IGP(内部网关协议)类型动态路由协议,所以OSPF路由也只用于一个AS内部。OSPF是通过LSA(链路状态通告)报文进行路由信息交互,通过5种报文(Hello、DBD、LSR、LSU、LSAck)进行邻居和邻接关系的建立以及同一区域内部各路由器间的LSDB(链路状态数据库)信息的同步,最终形成统一的区域内拓扑数据库。

OSPF基础

OSPF(OpenShortest Path First,开放式最短路径优先)协议是IETF开发的一个基于链路状态的AS内部的IGP(内部网关协议),广泛应用在接入网和城域网中。

一、OSPF的几个重要概念

OSPF几个非常重要的基本概念:自治系统(AS)、区域(Area)、路由器类型和路由类型。首先,一台运行OSPF协议路由器中的每个OSPF进程必须指定一个用于标识本地路由器的RouterID(路由器ID)。RouterID是一个32比特无符号整数。在一个AS中每个路由器ID必须唯一,但同一路由器的不同进程中的路由器ID可以相同

1、AS

AS(自治系统)也就是通常所讲的“路由域”(Routing Domain),是由运行同一种路由协议并且被同一组织机构管理的一组路由器组成同一个AS中的所有路由器必须运行相同的路由协议,且必须彼此相互连接(中间不能被其他协议路由域所间断),分配相同的AS

在OSPF网络中,只有在同一AS中的路由器才会互相交互链路状态信息;在同一个AS中,所有的OSPF路由器都维护一个相同AS结构描述(就是AS中各区域间的连接关系)的数据库。该数据库中存放的是路由域中相应链路的状态信息,OSPF通过这个数据库计算出其OSPF路由表。OSPF路由配置都是针对同一个AS内部的路由器之间进行配置的,不涉及不同AS之间的路由器间的路由。

2、Area

Area(区域)是OSPF的一个非常重要的特征,就是在一个AS内部划分的多个不同位置,或者不同角色的一组路由器单元,每个OSPF路由器只能在所属区域内部学习到完整的链路状态信息。在大型网络中,路由器非常多,如不进行区域划分,则整个网络中的所有设备都要彼此学习路由信息,最终路由信息数据库会很庞大。区域的划分也不是随意进行的,是根据这些路由器在网络中承担的作用和位置来划分的


如上图为Area与AS之间的关系示意图,即一个AS中可以包括多个区域,不同的协议路由域使用不同的AS。但只有OSPF和IS-IS协议路由域中的AS可以划分多个区域。不同路由域(也即不同AS)中的路由需经过BGP协议进行连接。

区域是从逻辑上将网络中的不同路由设备划分为不同的组,每个组用区域号(Area ID)来标识。要注意的是,OSPF的区域的边界是设备接口,而不是链路。即一个网段(链路)只能整个属于同一个区域,即路由器间直接相连的链路两端接口必须属于同一个区域。如下图:


划分了区域后,可以在区域边界路由器上进行路由聚合,不同区域之间仅向外通告其聚合路由,大大减少通告到其他区域的LSA(链路状态通告)数量,还可以最小化由于网络拓扑变化带来的影响。

    与OSPF同为链路状态协议的IS-IS在区域边界方面就与OSPF完全相反,IS-IS区域的边界是链路,而不是设备接口,即两台路由器相连的链路两端接口是分属于不同区域的

在OSPF中,除了可以划分多个普通区域外,还可以配置多种特殊区域类型,如骨干区域(固定为Area0)、Stub(末梢)区域、Totally Stub(完全末梢)区域、NSSA(非纯末梢)区域和Totally NSSA(完全非纯末梢)区域。

3、路由器类型

由于OSPF把一个AS划分成多个区域,这就使得OSPF网络中不同路由器的角色可能会有所不同,根据路由器在AS中的不同位置,可以分为4类(见图12-2):

①区域内路由器(InternalRouters,IR):该类设备的所有接口都在同一个OSPF区域内。

②区域边界路由器(Area BorderRouters,ABR):该类设备接口可以分别属于不同区域,但其中一个接口必须连接骨干区域。ABR用来连接骨干区域和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接(“虚连接”)。

③骨干路由器(BackboneRouters,BR):该类设备至少有一个接口属于骨干区域。所有的ABR和位于骨干区域的内部设备都是骨干路由器

④自治系统边界路由器(ASBoundary Routers,ASBR):与其他AS中的设备交换路由信息的设备成为ASBR。虽然ASBR通常是位于AS的边界,但也可以是区域内设备,也可以同时是ABR。只要一台OSPF设备引入了外部路由(包括直连路由、静态路由、RIP、IS-IS路由、BGP路由,或者其他OSPF进程路由等)的信息,它就成为ASBR。

4、路由类型

划分区域的目的就是想减少LSA的数量,减少路由器上依据LSA形成的路由数量,这就自然会对在区域内部,或区域之间,甚至从其他AS外入的路由进行分类。OSPF中,把路由分为4类:

①区域内(Intra Area)路由:仅用于区域内IR路由器之间的路由,用于IR设备间的互联,不向区域外通告。

②区域间(Inter Area)路由:仅用于区域间ABR之间的路由,用于骨干区域与其他区域相互通告路由信息。

③第一类外部(Type1 External)路由:这是经由ASBR引入的外部路由,且通常是IGP类型(如直连路由、静态路由、RIP、IS-IS路由或其他OSPF进程路由)的外部路由,它们的开销值计算方法与OSPF的开销值计算方法具有可比性,可信度较高。到第一类外部路由的开销=本设备到相应的ASBR的开销+ASBR到该路由目的地址的开销

④第二类外部(Type2 External)路由:这也是经由ASBR引入的外部路由,且通常是EGP类型(如EGP路由)的外部路由,它们的开销值计算方法与OSPF不具可比性。OSPF协议认为,从ASBR到自治系统之外的开销远远大于在自治系统之内到达ASBR的开销,所以OSPF计算第二类外部路由的开销时只考虑ASBR到自治系统之外的开销,即到第二类外部路由的开销=ASBR到该路由目的地址的开销

二、OSPF网络的设计考虑

1、OSPF网络的设计规划

(1)确定需运行OSPF协议的路由器

在设计OSPF网络时,首先要确定的是哪些路由器的接口要启用OSPF路由进程。在一个自治系统内部各路由器上需运行相同的动态路由协议,所以绝大多数情况下自治系统内部的各个路由器上都要运行OSPF协议。

(2)合理划分OSPF区域

当一个大型网络中的路由器都运行OSPF协议时,LSDB(链路状态数据库)会占用大量存储空间,并使得运行SPF(Shortest Path First,最短路径优先)算法的复杂度增加,CPU负担增加。网络规模增大,拓扑结构变化概率增大,网络会经常处于“振荡”之中,造成大量OSPF协议报文传递,降低带宽利用率。每次变化还导致路由器重新进行路由计算。OSPF协议通过将一个自治系统划分为不同的区域来解决上述问题。按一般经验,在一个区域内路由器的数量不要超过50台,且当网络中路由器少于20台,可以只划分一个区域,即骨干区域。

根据OSPF协议规定,所有的其他区域均必须与骨干区域连接,所以应合理选择骨干区域的位置。通常将骨干区域置于网络的中央,这样可以使更多的其他区域与骨干区域直接连接。实在有不能直接与骨干区域连接的区域,则需要使用虚连接来解决。骨干区域中的路由器要负责整个OSPF网络各个区域的路由信息传输,负荷大,需要性能好的路由器承担。

(3)注意ABR和ASBR的性能要求

每个ABR需要负责所连接的两个或多个区域间的路由信息传输工作,需要保存每个连接区域的LSDB,而ASBR更是要负责两个或多个自治系统间的路由信息传输,保存每个连接自治系统的LSDB,需要高性能路由器承担。建议在一台ABR上一般最多连接3个区域,即一个骨干区域和两个普通区域,ASBR类似,不要连接太多自治系统。

2、OSPF区域划分原则

(1)按照地理区域或行政管理单位划分

因为OSPF网络主要应用于广域网系统,跨市、省、全国,最简单就是根据地理区域或行政区域划分。

(2)按照网络中的路由器性能来划分

路由器也可分为接入层、汇聚层和核心层,性能从低到高,按性能来划分

(3)按照IP网段来划分

好处是便于在ABR上配置路由汇聚,减少路由信息的数量。

(4)区域中路由器数量的考虑

一个区域中最好不要超过50台路由器。

三、OSPF  LSA类型

OSPF是一种典型的链路状态路由协议,采用OSPF的每个路由器通过向邻居路由器发送LSA(Link StateAdvertisement,链路状态通告)来实现彼此交换并保存整个网络的链路状态信息,从而掌握全网拓扑结构,并独立计算路由。划分区域后,OSPF路由器收集其所在网络区域上各路由器的链路状态信息,并生成链路状态数据库LSDB,也称拓扑数据库,它代表了对应区域中的网络拓扑结构。OSPF路由器根据自己的LSDB利用SPF(Shortest Path First)路由算法独立计算出到达任意目的地址的路由。LSA是OSPF计算路由的依据,在相当程度上代表了OSPF路由。

因为OSPF路由器按用途进行了分类,不同类型的OSPF路由器所发送的LSA的用途和可以通告的范围各不相同。OSPF将LSA分为以下几类:

(1)Type1 LSA:路由器LSA(Router LSA)

每个OSPF路由器都会产生路由器LSA,描述了对应设备物理接口所连接的链路或接口,并指明了各链路的状态、开销等参数。

(2)Type2 LSA:网络LSA(Network LSA)

网络LSA由DR(指定路由器)或者BDR(备份指定路由器)产生,描述了DR和BDR所在网段的链路状态,也仅在所属区域内传播因为DR和BDR仅在广播类型网络中存在,所以网络LSA也仅在广播类型网路中存在

(3)Type2 LSA:网络聚合LSA(Networksummary LSA)

网络汇总LSA由ABR产生,描述所连接的某个区域内某个网段的聚合路由(包括缺省路由),并通告非Totally Stub或NSSA区域(包括源网段所在区域,到达其他区域必须经过骨干区域转发该LSA),这样区域通信在到达区域边界ABR后都是采用聚合路由进行的,可大大减少区域内部路由器的路由表项数量。

(4)Type4 LSA:ASBR聚合LSA(ASBR summaryLSA)

ASBR聚合LSA也由ABR产生,描述从该ABR到达OSPF路由域中各个ASBR的路由,通告给整个路由域。但仅可向普通区域中泛洪,不能进入Stub区域、Totally Stub区域、NSSA区域和Totally NSSA区域。

(5)Type5 LSA:自治系统外部LSA(Autonomoussystem external LSA)

自治系统外部LSA由ASBR产生,描述到达AS外部的路由,也仅可向普通区域中泛洪,不能进入Stub区域、Totally Stub区域、NSSA区域和Totally NSSA区域。

(6)Type7 LSA:NSSA外部LSA(NSSAExternal LSA)

NSSA外部LSA也由ASBR产生,内容几乎和Type5LSA相同,但它专用于NSSA区域和Totally NSSA区域连接的ASBR向NSSA区域内泛洪外部AS的路由,然后经过NSSA区域ABR上转换成Type5 LSA向OSPF路由域内其他区域中传播。

(7)Type9/Type10/Type11LSA:Opaque LSA

Opaque LSA是一个被提议的LSA类别,是在标准的LSA头部后面加上特殊 应用的信息组成,可以直接由OSPF协议使用,或者由其他应用分发信息到整个OSPF域间接使用。Opaque LSA分为9、10、11三种类型,但是各自可泛洪的区域不同,Type9 LSA仅在接口所在网段范围内传播,Type10 LSA在区域内传播,Type11 LSA在自治系统内传播。

在OSPF中主要用到的就是Type1~Type5和Type7这6种LSA。

①在区域内部各路由器设备通过Type1LSA来获取彼此的路由信息,实现互相路由通信。

②在广播类型网络中,区域内非DR、非BDR路由器与DR、BDR路由器之间是通过Type2LSA获取路由信息的,实现非DR、非BDR路由器与DR、BDR路由器之间的路由通信;各非DR、非BDR路由器之间不相互获取路由信息,需全部通过DR或者BDR,以及该区域的ABR与其他区域进行通信。

③在区域内部路由器与区域ABR之间,通过所在区域的ABR以Type3 LSA向内发布本区域各网段聚合路由信息,实现区域内路由器与对应区域的ABR路由通信。

④在不同区域之间,通过各自区域的ABR以Type3 LSA向内、外发布的本区域和外部区域各网段聚合路由信息(中间还需要骨干区域进行LSA转发),实现不同区域的路由器间的路由通信。

⑤在区域内部路由器与外部AS之间,先通过各区域的ABR以Type4 LSA向内发布到达ASBR的聚合路由信息实现与ASBR的路由通信,然后通过对应ASBR向普通区域内部发布的Type5LSA或者向NSSA区域和Totally NSSA区域发布的Type7 LSA实现与外部AS的路由通信。

四、几种特殊的OSPF区域

在OSPF网络的区域中,除了Stub区域、TotallyStub区域、NSSA区域和Totally NSSA区域外,其他区域(包括骨干区域)都称为普通区域

1、骨干区域

骨干区域是普通区域中的一种特殊区域,它的区域号固定为0.0.0.0,也即区域0。骨干区域是连续的,或者通过“虚连接”(Virtual Link)连接两个或多个分离的骨干区域,但这些分离的骨干区域的区域号一样,均为0。同时,要求其他区域必须与骨干区域直接连接,或者通过“虚连接”虚拟连接。


如上图,普通区域2没有与骨干区域0直接连接(中间隔了一个区域1),这时就可以在区域1连接骨干区域0和普通区域2的两端ABR中配置“虚连接”。“虚连接”被认为是属于骨干区域(相当于骨干区域的延伸)的,在OSPF路由协议看来,虚连接两端的两个路由器被一个点对点的链路连在一起,这样原来没有与骨干区域连接的区域就变成直接连接了,成为普通区域了。通过虚连接连接两个非连续的骨干区域0的方法一样。

骨干区域作为区域间通信传输和分布路由信息的中心,在一个OSPF路由域中,无论有没有划分区域,总是至少有一个骨干区域。区域间的通信先要被路由到骨干区域,然后再路由到目的区域,最后被路由到目的区域中的主机。在骨干区域中的路由器(都是ABR)通告它们所连接的其他区域内的汇总路由到骨干区域中的其他路由器中。汇总通告在骨干区域内路由器传播,使得在骨干区域内部的每台路由器都有一个到达所有连接的其他区域ABR的可用路由表。

2、Stub(末梢)区域

Stub区域是一种专门为那些由性能较低的路由器组成、与AS外部没有太多路由通信的AS边缘区域简化区域内部路由器上的路由表而采取的一种优化措施。只有处于AS边缘,且只有一个连接其他区域的ABR,没有ASBR,没有虚连接穿越的非骨干区域才可配置为Stub区域,因为只有这样才能尽可能的减少区域内路由器的路由表项数量。

在Stub区域中是通过禁止与AS外部路由相关的Type4LSA和Type5 LSA通过ABR进入区域内泛洪来实现的,仅允许同一AS中其他区域的Type3 LSA通过ABR进入区域泛洪。这样在Stub区域内部路由器中仅有Type1LSA、Type2 LSA(广播网络中才有)和Type3 LSA存在,没有Type4LSA和Type5 LSA(更没有专用于NSSA和Totally NSSA区域的Type7 LSA),可在一定程度上减小区域内部路由器上的路由表规模。

在阻止了与AS外部相关的Type4LSA和Type5 LSA进入区域后,会代理啊一个问题,那就是Stub区域内部路由器不能获知外部AS的路由信息,不能与AS外部进行通信。有时的确需要与外部AS进行通信,于是新增了一条折中的解决方法,就是由Stub区域的ABR向本区域内部路由器泛洪一条指向自己的缺省路由(0.0.0.0),使Stub区域ABR作为区域内部路由器与外部AS通信的唯一出口

当一个OSPF的区域只存在一个区域出口点(只与一个其他区域连接)时,可以将该区域配置成为一个Stub区域。这时,该区域的ABR会对区域内通告缺省路由信息。需要注意的是,一个Stub区域中的所有路由器都必须知道自身属于该区域(也就是需要在其中的路由器启用这项功能),否则Stub区域的设置不会起作用。

3、Totally Stub区域

Totally Stub(完全末梢)区域是相对Stub区域的变形版本,也是为那些设备性能相当低的边缘区域而设计的,可以进一步减少区域内路由器的路由表项。Totally Stub区域所需满足的条件与Stub区域一样,即只有处于AS边缘,且只有一个连接其他区域的ABR,没有ASBR,没有虚连接穿越的非骨干区域才可配置为Totally Stub区域

在LSA的限制上,TotallyStub区域比Stub区域更加严格,除了不允许与AS外部路由相关的Type4LSA和Type5 LSA进入区域外,还不允许同一AS中其他区域的Type3LSA经由ABR向区域内部路由器泛洪。这样一来,在Totally Stub区域内部路由器中仅有Type1LSA和Type2 LSA(广播网络中才有),没有Type3 LSA、Type4 LSA和Type5 LSA(同样更没有Type7LSA),可进一步减少区域内部路由器的路由表项数量。

与Stub区域类似,为了解决有时TotallyStub区域内部路由器需要与其他区域或AS外部进行通信的问题,由ABR向区域内泛洪一条缺省路由。

4、NSSA区域

Stub区域因为只存在于网络边缘,利用率不高,于是提出了一种新的概念NSSA(Not-So-Stubby Area,非纯末梢区域)。NSSA区域是对Stub区域概念的延伸,在必备条件方面有所放宽,即NSSA区域可以位于非边缘区域,可以有多个ABR(Stub区域仅允许有一个ABR),可以有一个或多个ASBR(Stub区域不允许有ASBR)。在LSA的限制方面:

允许从其直接连接的ASBR上引入的AS外部路由以Type7LSA进入NSSA区域中泛洪,然后在ABR上转换为Type5 LSA后以自己的身份发布到区域之外,因为Type7 LSA是专门为NSSA区域新定义的,非NSSA区域设备不可识别。

②与Stub区域一样,允许区域间的Type3 LSA进入区域内部泛洪,不允许与其他区域中ASBR连接的AS外部路由相关的Type4 LSA和Type5 LSA进入NSSA区域内泛洪

NSSA区域也限制了由其他区域中的ASBR所引入的AS外部路由进入区域内,但同样NSSA区域内部路由器有可能需要与其他区域连接的外部AS进行通信。为解决这一问题,NSSA区域仍采用缺省路由的方式来解决,就是在该区域的其中一个ASBR上(NSSA区域中可以有多个ASBR)向区域内部路由器泛洪一条指向自己的缺省路由,使该ABR作为区域内部路由器与其他区域所连接的外部AS进行通信的唯一路由。

在NSSA区域总存在Type1LSA、Type2 LSA(广播网络中才有)、Type3 LSA和Type7 LSA,但没有Type4 LSA和Type5 LSA

5、Totally NSSA区域

Totally NSSA区域可以说是TotallyStub区域和NSSA区域的结合体:

与NSSA区域一样,可以位于非边缘区域,可以有多个ABR和ASBR

与NSSA区域一样,允许区域中ASBR引入的AS外部路由以Type7 LSA进入区域内部泛洪,然后经由该区域内的ABR将转换成Type5 LSA向OSPF路由域中其他所有区域进行发布。但不允许其他区域中的ASBR引入的路由进入区域内部,即不允许Type4 LSA和Type5 LSA进入区域内部泛洪

与Totally Stub区域一样,不允许Type3 LSA进入区域内部泛洪(NSSA区域是允许的),这可进一步减少区域内部路由器的路由表规模。

Totally NSSA区域禁止了其他区域的Type3LSA和其他区域中ASBR连接的外部AS相关Type4 LSA和Type5 LSA进入区域内,Totally NSSA区域也采用缺省路由的方式,在区域中选择一个ABR和ASBR,在其中配置一条指向自己的缺省路由,然后在Totally NSSA区域内泛洪,使该ABR或ASBR作为区域内部路由器与其他区域或者其他区域中连接的外部AS进行通信的唯一出口。


五、OSPF的网络类型

OSPF协议支持多种不同类型的网络,当然必须都是运行IP协议的。根据链路层协议类型的不同将这些可支持的网络分为4种类型(不同类型网络的报文发送方式不一样)。

1、广播(Broadcast)类型

当链路层协议是Ethernet、FDDI时,OSPF缺省网络类型是广播(Broadcast)类型。在这种网络中,OSPF的各种报文发送方式如下:

①以组播形式(224.0.0.5,是运行OSPF设备的预留IP组播地址)发送Hello报文及所有源自DR(指定路由器)的选举报文。

②以组播形式(224.0.0.6,是OSPF DR的预留IP组播地址)向DR发送LSU(链路状态更新)报文,然后DR将该LSU报文发送到224.0.0.5。

③以单播形式发送DD(数据库描述)报文、LSR(链路状态请求)报文和所有重传报文。

④正常情况下,以组播形式(224.0.0.5)发送LSAck(链路状态应答)报文。当设备收到重复的LSA或达到最大生存时间的LSA被删除时,LSAck以单播形式发送。

2、NBMA(Non-BroadcastMulti-Access)类型

当链路层协议是帧中继、X.25时,OSPF缺省网络类型是NBMA。在该类型的网络中,以单播形式发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。

3、点到多点(point-to-multipoint,P2MP)类型

因为链路层协议中没有Point-to-Multipoint的概念,所以P2MP必须是由其他的网络类型强制更改的。在该类型的网络中,以组播形式(224.0.0.5)发送Hello报文,以单播形式发送DD报文、LSR报文、LSU报文、LSAck报文。

4、点到点P2P(point-to-point)类型

当链路层协议是PPP、HDLC和LAPB时,OSPF缺省网络类型是P2P。在该类型的网络中,以组播形式(224.0.0.5)发送各种OSPF协议报文。


OSPF报头及各种报文格式

OSPF把自治系统划分成逻辑意义上的一个或多个区域,通过LSA的形式发布路由信息,然后依靠在OSPF区域内各设备间各种OSPF报文的交互来达到区域内路由信息的统一,最终在区域内部路由器中构建成完全同步的LSDB,因为OSPF是专为TCP/IP网络设计的路由协议,所以OSPF的各种报文是封装在IP报文内的,可以采用单播或组播的形式发送。

一、OSPF协议报头格式

OSPF报文主要有5种:Hello报文、DD(DatabaseDescription,数据库描述)报文、LSR(LinkState Request,链路状态请求)报文、LSU(LinkState Update,链路状态更新)报文和LSAck(LinkState Acknowledgment,链路状态应答)报文。它们使用相同的OSPF报头格式(以OSPFv2版本为例):


①Version:版本字段,占1个字节,指出所采用的OSPF协议版本号,OSPFv2值为2,即0000 0010。

②Package Type:报文类型字段,标识对应报文的类型,取值为1~5的整数,分别对应Hello报文、DD报文、LSR报文、LSU报文、LSAck报文这5种OSPF报文。

③Package Length:包长度字段,占2字节,标识整个报文(包括OSPF报头部分和后面各报文内容部分)的字节长度。

④Router ID:路由器ID字段,占4个字节,指定发送报文的源路由器ID。

⑤Area ID:区域ID字段,占4字节,指定发送报文的路由器接口所在的OSPF区域号。

⑥Checksum:校验和字段,占2字节,是对整个报文(包括OSPF报头和各报文具体内容,但不包括下面的Authentication字段)的校验和,用于对端路由器校验报文的完整性和正确性。

⑦AuType:验证类型字段,占2字节,指定在进行OSPF报文交互时所需采用的验证类型,0为不验证,1为进行简单验证,2为采用MD5方式验证。

⑧Authentication:验证字段,占8个字节,具体值根据不同验证类型而定。验证类型为不验证时,此字段没有数据;验证类型为简单验证时,此字段为验证密码;验证类型为MD5验证时,此字段为MD5摘要消息。

二、OSPF Hello报文及格式

OSPF协议使用Hello报文来建立和维护相邻邻居路由器之间的邻接关系。Hello报文仅用来向邻居路由器证明自己的存在,就像人与人之间打招呼一样。RIP邻居路由器之间的邻居关系建立和路由更新都是通过发送Hello报文进行的,显然OSPF的这种Hello报文更简单,可大大减少网络中的报文传输流量。

在P2P和广播类型网络中,Hello报文是以HelloInterval为周期(缺省10s),以组播方式向224.0.0.5组播组发送一次;在P2MP和NBMA类型网络中,OSPF路由器是以PollInterval为周期(缺省60s),以单播方式向状态为Down的邻居发送一个Hello报文(其他类型的网络是不会把Hello报文发送给状态为Down的路由器的)。如果在设定的DeadInterval时间(通常至少是Hello报文发送时间间隔的4倍)内没有收到对方OSPF路由器发送来的Hello报文,则本地路由器会认为该对方路由器无效。

Hello报文内容包括一些定时器设置、DR、BDR以及本路由器已知的邻居路由器。



在OSPF路由器上可以配置Hello报文的发送时间间隔(是基于接口来配置的)。

三、OSPF DD报文及格式

DD报文用来描述本地路由器的链路状态数据库(LSDB),即在本地LSDB中包括哪些LSA。在两个OSPF路由器初始化连接时要交换DD报文,以便进行数据库同步。

DD报文内容部分包括DD报文序列号和LSDB中每一条LSA的头部等。对端路由器根据所收到的DD报文中的OSPF报头就可以判断出是否已有这条LSA。由于数据库的内容可能相当长,所以可能需要多个DD报文的交互来完成双方LSDB的同步。所以有三个专门用于标识DD报文序列的比特位,即DD报文格式中的I、M和M/S这三位。接收方对接收到的连续DD报文重新排序,使其能还原所接收的DD报文。



DD交换过程按询问/应答方式进行,在DD报文交换中,一台为Master(主)角色,另一台为Slave(从)角色。Master路由器向Slave路由器发送它的路由表内容,并规定起始序号,每发送一个DD报文,序号加1,Slave路由器则使用Master路由器的序号进行确定应答。显然,主、从之间的关系会因每个DD交换的不同而不同,因为双方可能都有对方没有的LSA,网络中的所有路由器会在不同时刻担当不同的角色。

四、OSPF LSR报文及格式

LSR报文用于请求相邻路由器链路状态数据库中的一部分数据。当两台路由器互相交换完DD报文后,知道对端路由器有哪些LSA是本LSDB所没有的以及哪些LSA是已经失效的,则需要发送一个LSR报文,向对方请求所需的LSA。

LSR报文内容包括所需的LSA摘要。



五、OSPF LSU报文及格式

LSU报文是LSR请求报文的应答报文,用来向对端路由器发送所需的真正LSA内容,可以是多条LSA完整内容的集合。LSU报文内容部分包括此次一共发送的LSA数量和每条LSA的完整内容。


LSU报文在支持组播和多路访问的链路上是以组播方式将LSA泛洪出去的,并且对没有收到对方确认应答(即LSAck报文)的LSA进行重传,但重传时的LSA是直接送到没有收到确认应答的邻居路由器上,而不是泛洪。

六、OSPF LSAck报文及格式

LSAck报文是路由器在收到对端发来的LSU报文后发出的确认报文,内容是需要确认的LSA头部(LSA Headers)。LSAck报文根据不同链路以单播或组播形式发送。


OSPF工作原理

OSPF中涉及许多具体技术原理,如OSPF路由计算原理、OSPF区域间的路由原理、OSPF路由更新原理,还有在广播网络中要进行的DR和BDR选举以及OSPF报文的验证原理等。

一、OSPF状态机

OSPF是一种链路状态路由协议,邻居设备间交换的是链路状态信息,OSPF路由也是依据由链路状态信息构成的链路状态数据库(LSDB)形成的。在OSPF中,建立设备间的邻居关系,交换彼此的LSDB显得格外重要。邻居关系建立的流程体现在OSPF接口的状态转换过程中。在OSPF中共有8种状态机,分别是:Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full。

①Down:邻居会话的初始阶段,表明没有在邻居失效时间间隔(DeadInterval)内收到来自邻居路由器的Hello报文。

②Attempt:该状态仅发生在NBMA网络中,表明在邻居失效时间间隔超时后仍然没有对端发来的Hello应答报文。此时路由器依然会以轮询Hello报文发送时间间隔(PollInterval)向对端发送Hello报文。

③Init:收到不包含自己路由器ID的Hello报文后状态转换为Init。

④2-way:收到包含有自己的路由器ID的Hello报文后则状态转换为2-way。

⑤Exstart:在进行DR、BDR选举后形成邻居关系,则从Init状态转换到Exstart状态,通过不带LSAHeader字段内容的DD报文协商主、从关系,并确定DD报文的序列号。

⑥Exchange:主、从关系协商完毕后,主设备开始向从设备正式发送带有LSA Header字段内容的DD报文,此时双方状态转换为Exchange。

⑦Loading:DD报文交换完成后从设备状态转换为Loading。此时,通信双方可以LSR报文向对方请求LSA更新,而以LSU报文对对方请求进行应答。

⑧Full:当设备收到对端发来的,由自己所请求的LSA报文后向对端发送LSAck报文,同时发给对端的LSA后也收到了来自对端的LSAck报文,之后,则本地设备自动切换为Full状态。

二、OSPF邻接关系建立流程

OSPF邻居关系的建立和维持都是依靠Hello报文交互来实现的,OSPF邻接关系的建立则需要一个比较复杂的流程,也是邻居设备接口的状态机转换过程。

整个OSPF设备间邻接关系的建立过程分为4个主要阶段:邻居发现阶段、主从关系确立阶段、数据库同步阶段、完全邻接阶段。4个阶段中每个阶段都包含一种或多种状态机的转换。初始状态下,所有OSPF接口的邻居状态均为Down状态,表明没有与任何设备建立邻居关系,更没有与任何设备建立邻接关系邻居关系不等于邻接关系)。

以P2P和广播类型网络中的两台OSPF路由器为例学习建立双向邻接关系的流程,以及对应的OSPF状态机迁移过程(假设R1路由器先启动了OSPF进程)。


1、邻居发现阶段

①首先,当R1的OSPF接口启动路由进程后,会以组播方式(目的地址为组播地址224.0.0.5)向所连接的同网段所有直接连接的OSPF设备发送一个Hello报文。此时,因为R1还没有与其他任何设备建立邻居关系,不知道其他设备的路由器ID,所以在此Hello报文的RouterID字段中仅封装了本地OSPF路由器的路由器ID,在Neighbor字段中没有封装任何路由器ID。

②当R2收到来自R1的Hello报文后,将接收来自R1的Hello报文的接口转换成Init状态。同时R2从接收到的Hello报文中获取R1的路由器ID,添加到邻居列表中。然后在DeadInterval超时前,以组播方式向所连接的网段中的所有直接连接的OSPF设备发送一个在RouterID字段中封装本地设备R2的路由器ID,在Neighbor字段中封装R1的路由器ID的Hello报文。

③当R1收到来自R2的Hello报文,且发现里面有自己的路由器ID后,将接收来自R2的Hello报文的接口转换成2-way状态,同时R1从接收到的Hello报文中获取R2的路由器ID,添加到邻居列表中,然后在DeadInterval超时前,以组播方式向所连接的网段中的所有直接连接的OSPF设备发送一个在RouterID字段中封装了本地设备R1的路由器ID,在Neighbor字段中封装R2的路由器ID的Hello报文。

④当R2再次收到来自R1的Hello报文,且发现里面有自己的路由器ID后,将接收来自R1的Hello报文的接口转换成2-way状态。这时R1和R2就建立了双向的2-way邻居关系。

通过以上4步(其实是一个两次握手过程),R1和R2间就建立起了邻居关系,进入主从关系确立阶段。

2、主从关系确立阶段

①在双方都进入2-way状态后,R1和R2通过先前各自获取的Hello报文的信息进行DR、BDR选举,选举完成后双方都进入ExStart状态。

DR和BDR是由同一网段中所有路由器根据路由器优先级和路由器ID选举出来的,只有Hello报文中Rtr Pri(优先级)字段大于0的路由器才具有选举资格。具体的选举过程如下:

★在与一个或多个邻居之间的双向通信建立起来之后,本地路由器对每个邻居发送来的Hello包中的优先级、DR和BDR域进行检查。此时所有路由器都宣称自己为DR(将它们自己的接口地址置于Hello包的DR字段中);同时,所有路由器都宣称自己为BDR(将它们自己的接口地址置于Hello包的BDR字段中)。

★如果一个或多个备选路由器将它(们)自身的接口地址置于DR字段中,拥有最高优先级的邻居将被宣告为DR。如果路由器优先级一样,拥有最高路由器ID的邻居将被选举出来。

★然后将自身的接口地址置于BDR字段中的路由器中选择拥有最高优先级的路由器作为BDR。如果这些宣称自己为BDR路由器的优先级相等,则拥有最高路由器ID的邻居将被选举作为BDR。

★如果没有任何路由器被宣告为BDR,则拥有最高优先级的非DR邻居路由器将被宣告为BDR;如果有多个优先级相同的路由器,则拥有最高路由器ID的邻居将被选举为BDR。

②进入ExStart状态后,双方路由器开始以DD报文进行交互,确定双方的主从关系,确定用于数据交换的初始的DD报文的序列号,以保证路由器得到的永远是最新的链路状态信息。

在开始交互时,R1和R2双方都是在M/S字段设为1(代表自己为主设备),在DDSequence Number字段加上各自当前DD报文的序列号(每发送一次序列号加“1”),LSA Header字段为空的DD报文进行交互的。最终会根据双方的路由器ID来确定双方的主从关系,路由器ID大的成为主设备(此处假设为R2)。

确认好主从关系后,从设备R1以主设备R2的DD报文序列号向主设备发送DD报文,并且置M/S字段值为0(代表自己为从设备),同样里面的LSA Header字段为空,并转换自己接收DD报文的接口为Exchange状态。主设备R2在收到从设备R1的DD报文后也将自己接收DD报文的接口转换为Exchange状态。

通过以上两步,R1和R2邻接关系建立流程进入了数据库同步阶段。

3、数据库同步阶段

①主设备R2开始连续向从设备R1发送带有LSA Header字段的报文(其中第一个DD报文的I字段值为1,代表为连续DD报文中的第一个报文,其余连续DD报文的I字段值均为0),M字段为1(代表后面还有报文)对从设备R1进行数据库更新。但每发送一次DD报文,其序列号都要加“1”。从设备R1每次收到来自主设备R2的DD报文后均以收到的DD报文序列号进行响应(但里面的LSA Header字段为空)。

②当主设备R2向从设备R1发送最后一个DD报文时,将M字段置为0,代表为最后一个DD报文,同时LSA Header字段为空,并将接收到DD报文的接口转换为Loading状态。当从设备R1收到主设备R2带有M字段为0的DD报文后便知道这是最后一个DD报文了,此时也将接收DD报文的接口转换为Loading状态。

③当主设备R2发送完DD报文后,从设备R1开始依据所接收的DD报文中的LSA Header字段检查自己的LSDB,如果发现有些LSA在自己的LSDB中没有,则从设备R1会以LSR报文向主设备R2发出更新请求。当主设备R2收到LSR报文后会以LSU报文向从设备R1发送对应的LSA。从设备R1在收到来自主设备R2的LSU报文后,会以LSAck报文进行确认。

因为双方都可能有对方没有的LSA,或者一方的LSA版本更新,所以在DD报文交互中,主从角色不是固定的,双方都可以向对方发送LSR报文请求更新。

通过以上两步完成了链路状态数据库的同步,进入最后的完全邻接阶段。最终实现同一区域中每台OSPF区域内部路由器的LSDB是完全一致的,实现了整个区域内的拓扑结构同步。

4、完全邻接阶段

当双方的LSDB完全同步后,双方均转为Full状态,双方OSPF接口间正式建立了完全邻接的关系。

三、OSPF路由计算基本过程

OSPF网络是在一个AS中以区域为单位的分层结构,而且在区域中又分为两种不同角色:骨干区域和普通区域。这就决定了OSPF的路由也必定是分层的,分为区域内路由和区域间路由,而不像RIP路由那样是扁平的。

整个OSPF路由计算过程是在OSPF设备间建立了完全的邻接关系后进行的,依据的就是路由器为所连接的各个区域所保存的LSDB(每个连接区域都有一个专门的LSDB)。具体的路由计算中,又分区域内路由和区域间路由两个方面。

1、OSPF区域内路由计算

当网络重新稳定下来后,OSPF路由器会根据其各自的LSDB采用SPF(最短路径优先)算法——具体为Dijkstra算法)独立地计算到达每一个目的网路的路径,并将路径存入路由表中。路由表中包含该路由器到每一个可到达目的地址、开销和下一跳(next-hop)。OSPF区域内路由是由OSPF内部路由器使用最小开销的路径到达目的网络,且区域内的路由不被聚合。

在Dijkstra算法中,为了在一对给定的路由器节点之间选择一条最短(链路开销最小)路由路径,只需在通信子网拓扑图中找到在这起始和结束节点之间的中间节点串连起来后链路开销最短的路径即可。把最短路由的节点标识为工作节点,并且是永久性的节点,其到达源节点的距离值是不能改变的,其他的标识为临时性的节点,其到达源节点的距离可能随工作节点的不同而改变。

如下图,每个节点代表一台OSPF路由器,每条线段代表一条通信链路,线段上的数字代表对应链路的开销。现要使用Dijkstra算法计算节点A到节点D之间的最短路径。

在网路中路由器启动时,首先需要初始化,测量每条链路的开销。从A节点到达D节点的路由确定步骤如下:

①首先将源节点A标记为永久性工作节点(用箭头来特别标识),然后依次检查每一个与A节点直接连接的相邻节点,并且把它们与A节点之间的距离重新以(n,N)的方式进行标识,其中的n为与A节点相距的链路开销,N为最近的工作节点。

本示例中与节点A直接相邻的节点只有B和G,所以仅需要标识这两个节点与A节点之间距离。此时工作节点为A,B节点的标识为(2,A),G节点的标识为(6,A),其他与A节点不相邻的节点的距离标识为无穷远。如下图:


②比较B和G这两个节点与A节点之间距离,B节点的距离更短,于是把B节点改为工作节点(箭头移到B),同时变为永久性节点,其他节点(包括G节点)标注为临时节点。然后以B节点为工作节点,标记直接相邻的节点到源节点A的距离,对于前面已经计算过的节点将略过,如源节点A和G节点。

与B节点直接相邻的节点中,除了A节点外还有C、E两个节点。C节点到达A节点的距离就是C节点到B节点的链路开销7,加上B到A的链路开销2,所以C到A的距离为2+7=9,标识为(9,B)。同理E到A的距离为2+2=4,标识为(4,B)。其他节点仍为无穷远。


③同样经过比较得出,E到A的距离(4),比C到A的距离(9)近,所以把E改为工作节点(箭头移到E),同时标注E为永久性节点,其他节点(包括C)标注为临时节点。

同样标记与E节点直接相邻的节点(B、G、F)到E节点的距离,但对于前面已经计算过的永久性B节点不再重新计算,对原来已计算过,但为临时性节点的G以及F需重新计算。最终G标识为(5,E)(在此步以前为(6,A)),F标识为(6,E)。如下图


④同样的方法比较G节点和F节点到达A节点之间的距离,可以得出G节点更近,把G改为工作节点(箭头移到G),同时标注G为永久性节点,其他节点(包括F)标注为临时节点,如下图


再看G直接相邻的节点,包括A、E、H,但是A、E已经标识为永久性节点了,标识是不能更改的,这里只需对H节点计算到达A节点的距离,经计算得出为(9,G)。

这里要出问题了,按上面的计算,此时应该把H标识为下一个工作节点,但事实上,由H经G到达E的距离(4+1=5)要长于由H经F到达E的距离(2+2=4),前面把G标识为永久性节点是错误的,这时要把F节点标识为工作节点(箭头移到F),撤消G节点永久工作节点的资格,


⑤再检查与F相连接的相邻节点,除了已标识为永久性节点的E外,其余就是C和H,重新计算得到的值分别为9和8。这里要注意一个现象,对于C,本来属于临时节点,需重新计算距离值,可是经过F到A的距离与原来计算所得的经过B到达A的距离是一样的,所以距离值不需要改变。此时包H标识为工作节点(箭头移到H)和永久性节点。如下图:


因为H是直接与目的节点D相连的,无需再进行选举,直接标识D的距离为(10,H)。即从源节点A到D的最短距离为10,即2+2+2+2+2,如上图连线:A——>B——>E——>F——>H——>D。以上可以看到,Dijkstra算法虽然能得出最短路径,但遍历计算的节点很多,效率低,而且有些节点还不能一次标识正确。

2、OSPF区域间路由计算

OSPF路由器的ABR连接多个OSPF区域,所以它保存了多个区域的LSDB。但是在ABR,与所连区域内部路由器以及其他区域内路由器的通信都不是象区域内部那样是以具体的明细路由进行的,而是采用聚合路由进行。

在ABR上会以Type3  LSA(即网络聚合LSA)的方式向所连区域内以及其他区域通告所连区域的网络聚合路由,其他区域的路由也是以Type3 LSA方式向所连区域内通告的。所以区域内路由器与ABR以及ABR与其他区域的通信都是以网络聚合路由进行的。但要注意,两个非骨干区域之间是不能直接进行路由通信的,必须借助骨干区域进行转发,同样,两个非骨干区域之间是不能直接进行路由通信的,必须借助骨干区域的路由转发。所以在区域间的路由路径中一定会包括到达骨干区域对应路由器所连接网段的路由

OSPF区域间的路由将按照以下过程进行:

①在源区域内部的路由器按照到达最近ABR的开销最小的网络聚合路由进行通信。

②骨干区域按照到达连接到包含目的主机IP地址所在区域最近ABR的开销最小的网络聚合路由进行通信。

③包含目的主机IP地址的ABR按照到达目的主机的开销最小网络聚合路由进行通信。


如上图,由Area1中IP地址为192.168.1.10/26的HostA发往位于Area2中的IP地址为172.16.2.10/24的HostB的数据报文最先从Area1中的内部路由器以一个网路聚合地址(可以由管理员在R1上配置,假设为192.168.1.0/24)到达R1(ABR/骨干路由器),然后数据报文再通过骨干区域Area0中的路由器转发至R2。最后,数据报文通过聚合路由(也可以由管理员在R2上配置,假设为172.16.0.0/16)转发,然后通过Area2中的内部路由器到达目的主机。.

3、OSPF路由维护

当链路状态发生变化时,OSPF通过泛洪过程广播给网络上的其他路由器。OSPF路由器接收到包含新信息的链路状态更新报文,将更新自己的链路状态数据库,然后用SPF算法重新计算路由表。在重新计算过程中,路由器继续使用旧路由表,直到SPF完成新的路由表计算。新的链路状态信息将发送给其他路由器。要注意的是,即使链路状态没有发生改变,OSPF路由信息也会自动更新,缺省时间为30min。

四、理解OSPF进程

在动态路由协议中有一个路由进程的概念,一个路由器可以创建多个路由进程,多个进程有什么用?不同进程之间又有什么区别和联系

1、不同进程之间不相互交换路由信息,缺省是不通的

可以简单的把同一路由器上多个不同OSPF进程理解为多个不同的动态路由协议的进程不同路由协议下的路由信息是不能直接进行交换的,最终也造成通过不同路由协议学习到的动态路由都是不通的。OSPF上的不同进程也是如此,不同进程各自有不同的LSDB(链路状态数据库),彼此之间是不交换路由信息的,当然彼此之间的网络也就不会直接相通了。这相当于把一个物理网络划分成多个虚拟网络。但是不同OSPF进程的路由是可以引入的

假设有以下OSPF网络,R1、R2和R3均会运行OSPF协议,但R2上配置了10和20两个进程,如果没有配置两个OSPF进程互相进行路由引入的话,R1上连接的192.168.1.0/24网络是不能与R3上连接的192.168.4.0/24网络相通的,因为R2路由器的S1接口所学习到的R1路由器上的192.168.1.0/24网络路由是不会向R3路由器通告的,同样R2路由器的S0接口所学习到的R3路由器上的192.168.4.0/24网络路由是不会向R1路由器通告的。但是在R2上连接的两个网络还是可以直接通信的,因为它们在R2路由器上是直连路由,优先级最高,不需要OSPF协议的支持。


如果在R2路由器上将位于OSPF进程10的S1接口学习到的OSPF路由和直连路由引入到OSPF进程20,则R3路由器将学习到路由192.168.1.0/24和192.168.2.0/24网络。同理,如果在R2路由器上将位于OSPF进程20的S0接口学习到的OSPF路由和直连路由引入到OSPF进程10,则R1路由器将学习到路由192.168.3.0/24和192.168.4.0/24网络。

2、路由进程仅对本地路由器有意义,相连路由器的进程可以不同

理解OSPF进程的另一个重点是,不同的OSPF进程仅对本地路由器有意义,也就是它仅将本地路由器划分成多个虚拟网络。把各路由器接口划分到不同的路由进程后,对应接口只与相连路由器接口所在的OSPF进程中的各路由交换路由信息,但一定要注意的是,相连的两个路由器接口的路由进程号可以不一样,当然也可以一样,因为进程号仅对本地路由器有意义。如上图,R1路由器的S0接口的OSPF进程号可以与R2路由器的S1接口的OSPF进程号一样,即都是10,也可以不是10,如20、30等都可以。同理,R3路由器的S1接口OSPF进程号可以与R2路由器的S0接口的OSPF进程号一样,即都为20,也可以不一样。

3、同一个网络可以配置在多个OSPF进程中

在OSPF协议中,同一个直连网络可以发布在多个不同的路由进程中,也就是一个路由器接口所连接的网络可以在多个不同的OSPF进程中发布。这样做目的主要出于路由备份的考虑,使得在某一个进程下的网络不通时,对应的路由器接口所连接的网络仍然可以通过其他进程在网络中进行通信。如上图,R2路由器S0接口可以同时发布在10和20的进程中,这样当R3路由器失效时,它仍可以与R1路由器通信,或者通过R1路由器所连接的网络最终访问R3路由器所连接的网络。


阅读更多
换一批

没有更多推荐了,返回首页