互联网技术 · 2024年3月30日

深入解析OSPF路由协议

OSPF路由协议

开放式最短路径优先协议(OSPF)是基于开放标准的链路状态路由选择协议,它完成各路由选择协议算法的两大主要功能:路径选择和路径交换。Internet工程任务协会(IETF)于1988年开发了OSPF,其最近版本是OSPF版本2,在RFC 2328中进行了描述。

OSPF路由协议概述

OSPF是内部网关路由协议

在共同管理域下的一组运行相同路由选择协议的路由器的集合为一个自治系统(Autonomous system,AS)。在互联网中,一个自治系统是一个有权决定本系统使用哪种路由协议的单位,它可以是一个企业、一座城市或一个电信运营商。随着网络的发展,上述对AS的定义已经不是十分准确了,网络的发展使得网络之间经常出现网络合并情况,导致同一个自治系统中使用的路由协议也越来越多,所以自治系统的定义应该是在共同管理下的互联网络。

内部网关路由协议(IGP):用于在单一自治系统(Autonomous system,AS)内决策路由。内部网关路由协议包括RIP、OSPF等。

与内部网关路由协议相对应的叫做外部网关路由协议(EGP),外部网关路由协议用于在多个自治系统之间执行路由。BGP协议就是外部网关路由协议。

IGP是用来解决AS内部通信的,而EGP是解决AS间通信的。

OSPF是链路状态路由协议

链路状态路由协议通过与邻居路由器建立邻接关系,互相传递链路状态信息,来了解整个网络的拓扑结构。在链路状态信息中,包括有哪些链路,这些链路与哪个路由器相连,连接的路径成本是多少等信息,因此,在链路状态路由协议收敛后,一台路由器可以了解本区域完整的链路信息。

运行链路状态路由协议的路由器就好像各自”绘制”自己所了解的网段信息,然后通过与邻居路由器建立邻接关系,互相”交流”链路信息,学习整个区域内链路信息,来”绘制”出整个区域内的链路图。在一个区域内的所有路由器都保存着完全相同的链路状态数据库。

名词解释

邻居路由器:位于同一条物理链路或物理网段上的路由器。

链路状态数据库:也称为拓扑数据库,它包含所有路由器、路由器的链路以及这些链路的状态,还包含所有网络以及到这些网络的所有路径。

邻接关系:当两台运行OSPF协议的邻居路由器的链路状态数据库达到一致(同步)时,它们就是完全邻接的。

OSPF的工作过程

运行RIP的路由器只需要保存一张路由器,而使用OSPF路由协议的路由器需要保存三张表。

邻居表:列出每台路由器已经建立邻接关系的全部邻居路由器。

链路状态数据库(LSDB):列出网络中其他路由器的信息,由此显示了全网的网络拓扑。

路由表:列出通过SPF算法计算出的到达每个相连网络的最佳路径。

运行OSPF的路由器试图与邻居路由器建立邻接关系,在邻居之间互相同步链路状态数据库。使用最短路径算法(OSPF依据的算法是Dijkstra算法),从链路状态信息计算得到一个以自己为树根的”最短路径树”。到最后,每一台路由器都将从最短路径树中构建出自己的路由表。OSPF的路由器也仍然是依据路由表进行数据转发的。

OSPF的基本概念

OSPF区域

OSPF是一种链路状态型的路由协议,不会产生环路问题,因此不需要使用最大跳数等限制来防止环路的产生。

OSPF将自治系统分割成多个小的区域,OSPF的路由器只在区域内部学习完整的链路状态信息,而不必了解整个自治系统内部所有的链路状态。

区域0为骨干区域,它用来连接自治系统内部的所有其他区域。用来连接骨干区域和其他区域的路由器叫做区域边界路由器,它了解所连接的两个区域的完整的链路状态信息,并将链路状态信息汇总后发给区域内的其他路由器。这样,减小了路由器保存的链路状态数据库的大小,可以解决路由器内存容量有限的问题。

区域是通过一个32位的区域ID(Area ID)来标识的。

区域ID可以表示成一个十进制的数字,也可以表示成一个点分十进制的数字。在Cisco的路由器中这两种表示方式都可以使用。

区域0(或者区域0.0.0.0)是为骨干区域保留的区域ID号。OSPF的骨干区域(Backbone Area)是一个特殊的OSPF区域,它担负着区域间路由信息传播的重任。

RouteR ID

因为运行OSPF的路由器要了解每条链路是连接在哪个路由器上的,因此,就需要有一个唯一的标识来标记OSPF网络中的路由器,这个标识称为RouteR ID。

RouteR ID是在OSPF区域内唯一标识路由器的IP地址。Cisco路由器通过下面的方法得到它们的RouteR ID。

首先,路由器选取它所有Loopback接口上数值最高的IP地址。

如果路由器没有配置Loopback接口的IP地址,那么路由器就在所有活动物理端口中选取一个数值最高的IP地址作为路由器的RouteR ID。用作RouteR ID的路由器接口不一定非要运行OSPF协议。

使用Loopback接口作为RouteR ID的主要好处是Loopback接口比任何其他的物理端口都更稳定。一旦路由器启动成功,这个回环接口就会处于活动状态,只有整个路由器失效时它才会失效。

在OSPF协议中可以通过RouteR-id命令指定路由器的RouteR ID,所以网络管理员可以配置便于识别和记忆的RouteR ID值。

在实际工程中配置OSPF时都需要手工指定路由器的RouteR ID,这已经成为了一种标准配置。

四类路由器:

(1)区域内路由器(DR):

该类路由器的所有接口都属于同一个OSPF区域。

(2)骨干路由器(BDR)

该类路由器至少一个接口属于骨干区域。

因此,所有的ABR和位于Area 0的内部路由器都是骨干路由器。

(3)区域边界路由器ABR(Area Border Routers):

该类路由器可以同时属于两个以上的区域,但其中一个必须是骨干区域。

ABR用来连接骨干区域和非骨干区域,可以是实际连接,也可以是虚连接。

(4)自治系统边界路由器ASBR(AS Boundary Routers)

与其他AS交换路由信息的路由器称为ASBR。只要一台OSPF路由器引入了外部路由的信息,他就称为了ASBR,它有可能是ABR,区域路由器,不一定位于AS边界。

DR和BDR

DR和BDR的概念

运行OSPF的路由器通过与邻居路由器建立邻接关系,互相传递链路状态信息。如果每两个路由器之间都要建立邻接关系,那么,就会构成n(n-1)/2个邻接关系。每台路由器都要与其他所有的邻居路由器互相传递链路状态信息。

那么这种情况就会显得比较混乱,而且也会浪费许多不必要的网络资源。

为了避免这些问题的发生,可以在这个网段上选举一个指定路由器(designated Router,DR)。由DR同网络中的其他路由器建立邻接关系,并负责将网段上的变化告知它们。

网络上的每一台路由器都和DR构成一个邻接关系,那么只需要建立n-1个邻接关系就可以了。

为了实现冗余,当DR失效时,需要有一个新的指定路由器来接替它,这个路由器就是备份指定路由器(backup designated Router,BDR)。网络上所有的路由器将和DR、BDR同时形成邻接关系,DB和BDR之间也将形成邻接关系。如果DR失效了,BDR将成为新的DR。

DR和BDR的选举

可以由OSPF自动选择DR和BDR,也可以手工选择。

自动选择DR和BDR

网段上Router ID最大的路由器将被选举为DR,第二大的将被选举为BDR。这样的选举结果可能不是最佳的,例如:如果网段中有Cisco7200和3800系列路由器,那么3600路由器可能由于Router ID较大而被选举为DR。

手工选举DR和BDR。

要手工选择DR和BDR,需要设置路由器的优先级。每台路由器的接口都有一个路由器优先级(Router Priority),用一个八位的无符号整数来表示,大小范围是0-255,数值越大,优先级越高。Cisco路由器上默认的优先级是1。接口优先级可以通过命令IP ospf priority来更改。如果路由器的优先级被设置为0,它将不参与DR和BDR的选举。

优先级越高,赢得选举的可能性越大。如果优先级相同,则需要比较Router ID。

DB和BDR的选举过程

当一台OSPF路由器启动并发现它的邻居路由器时,它将去检查有效的DB和BDR路由器。

如果DR和BDR路由器存在的话,这台路由器将接受已经存在的DR和BDR路由器。

如果BDR路由器不存在,将执行一个选举过程,选出具有最高优先级的路由器作为BDR路由器。如果存在多个路由器具有相同的优先级,那么Router ID最大的路由器将被选中。

如果没有有效的DR路由存在,那么BDR路由器将被提升为DR路由器,然后再执行一个选举过程选举BDR路由器。

这里需要注意的是,路由器的优先级可以影响一个选举过程,但是它不能强制更换已经存在的DR或BDR路由器。也就是说,在已经选举了DR和BDR路由器后,如果一台具有更高优先级的路由器接入网络,这台新的路由器并不会马上替换DR或BDR路由器中的任何一个。因此,在一个广播多路访问网络上,最先初始化启动的两台具有选举资格的路由器将成为DR和BDR路由器。

OSPF的组播地址

一旦DR和BDR路由器选举成功,其他路由器(成为DRother)将只与DR与BDR路由器形成邻接关系。组播地址224.0.0.5代表所有参与OSPF的路由器(All OSPF Router),而组播地址224.0.0.6只有DR和BDR路由器去侦听这个地址,但BDR只侦听不响应。在广播多路访问网络上,链路更新信息先发送到244.0.0.6,再由DR路由器使用组播地址244.0.0.5泛洪更新报文到其他所有路由器。

OSPF的度量值

OSPF的用来度量路径优劣的度量值称为Cost(开销),是指从该接口发送出去的数据包的出站接口开销。链路开销使用16位的无符号的整数表示,大小范围是1-65535。

Cisco公司使用的默认代价是108/BW,表示为一个整数,在这里BW是指在接口上配置的带宽,而108是Cisco路由器使用的参考带宽。

路由器接口的开销值可以通过命令IP ospf cost来改变,当在一个有多家厂商产品的网络环境中配置Cisco的路由器时,这个命令变得十分重要。例如:有些厂商的路由器在其所有的接口上使用的默认开销值是1。如果网络中所有的路由器没有使用同一种计算开销的方式来指定OSPF的开销,那么OSPF协议将不能正确的进行路由选择。

使用108作为接口的参考带宽在现代一些带宽高于100Mb/s的网络介质中会产生一个问题。108/110Mb/s=1,这就意味着更高带宽的传输介质在OSPF协议中将会计算出一个小于1的数,这在OSPF协议中是不允许的。因此,从iOS 11.2版开始,Cisco可以在OSPF进程模式下使用命令auto-costReference-bandwidth修正这个问题,这个命令允许管理者更改默认的参考带宽。

接口类型开销(108/BW)

FAst Ethernet1

Ethernet10

56K1785

OSPF邻接关系的建立

OSPF的数据包类型

OSPF信息不使用TCP或UDP,它承载在IP数据包内,使用协议号89(十进制)。

OSPF路由协议依靠五种不同类型的包来标识它们的邻居以及更新链路状态信息。这五种类型的包使得OSPF具备了高级和复杂的通信能力,如下表所示列出了OSPF常用的包类型。

OSPF的包类型描述

Hello包 用于发现和维持邻居关系,选举DR和BDR

数据库描述包(DBD) 用于向邻居发送摘要信息以同步链路状态数据库

链路状态请求包(LSR) 在路由器收

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.