在上一章我们学习了动态路由协议RIP,但是对于某些应用来说,RIP路由协议还有些不足。例如:计算路径的成本以跳数作为唯一的度量值,不能根据带宽来计算成本;跳数最大为15跳,限制了网络的规模;收敛慢等。而OSPF适用于更大型的网络、收敛快、根据带宽计算路径成本等优点,因此在实际应用中,OSPF应用更广泛。
开放式最短路径优先协议(OSFP)是基于开放标准的链路状态路由选择协议,它完成各路由选择协议算法的两大主要功能:路径选择和路径交换。
OSPF路由协议概述
1. OSPF是内部网关路由协议
在共同管理域下的一组运行相同路由选择协议的路由器的集合为一个自治系统(Autonomous System,AS)。在互联网中,一个自制系统是一个有权决定本系统使用哪种路由协议的单位,它可以是一个企业、一座城市或一个电信运营商。随着网络的发展,上述对AS的定义已经不是十分准确了,网络的发展使得网络之间经常出现网络合并情况,导致同一个自治系统中使用的路由协议也越来越多,所以自治系统的定义应该是在共同管理下的互联网络。
内部网关路由协议(IGP):用于在单一自治系统(Autonomous System,AS)内决策路由。内部网关路由协议包括RIP、OSPF等。
与内部网关路由协议相对应的叫做外部网关路由协议(EGP),外部网关路由协议用于在多个自治系统之间执行路由。BGP协议就是外部网关路由协议。
IGP是用来解决AS内部通信的,而EGP是解决AS间通信的。
2. OSPF是链路状态路由协议
链路状态路由协议通过与邻居路由器建立邻接关系,互相传递链路状态信息,来了解整个网络的拓扑结构。在链路状态信息中,包括有哪些链路,这些链路与哪个路由器相连,连接的路径成本是多少等信息,因此,在链路状态路由协议收敛后,一台路由器可以了解本区域完整的链路信息。
运行链路状态路由协议的路由器就好像各自“绘制”自己所了解的网段信息,然后通过与邻居路由器建立邻接关系,互相“交流”链路信息,学习整个区域内链路信息,来“绘制”出整个区域内的链路图。在一个区域内的所有路由器都保存着完全相同的链路状态数据库。
邻居路由器:位于同一条物理链路或物理网段上的路由器。
链路状态数据库:也称为拓扑数据库,它包含所有路由器、路由器的链路以及这些链路的状态,还包含所有网路以及到这些网络的所有路径。
邻接关系:当两台运行OSPF协议的邻居路由器的链路状态数据库达到一致(同步)时,它们就是完全邻接的。
OSPF的工作过程
运行RIP的路由器只需要保存一张路由器,而使用OSPF路由协议的路由器需要保存三张表。
邻居表:列出每台路由器已经建立邻接关系的全部邻居路由器。
链路状态数据库(LSDB):列出网络中其他路由器的信息,由此显示了全网的网络拓扑。
路由表:列出通过SPF算法计算出的到达每个相连网络的最佳路径。
运行OSPF的路由器试图与邻居路由器建立邻接关系,在邻居之间互相同步链路状态数据库。使用最短路径算法(OSPF依据的算法是Dijkstra算法),从链路状态信息计算得到一个以自己为树根的“最短路径树”。到最后,每一台路由器都将从最短路径树中构建出自己的路由表。OSPF的路由器也仍然是依据路由表进行数据转发的。
SPF(Shortest Path Tree):最短路径优先算法。
Edsger Wybe Dijkstra(艾兹格W迪科斯彻):是Dijkstra最短路径算法的创造者。
OSPF的基本概念
1. OSPF区域
* OSPF是一种链路状态型的路由协议,不会产生环路问题,因此不需要使用最大跳数等限制来防止环路的产生。
* OSPF将自治系统分割成多个小的区域,OSPF的路由器只在区域内部学习完整的链路状态信息,而不必了解整个自治系统内部所有的链路状态。
区域0为骨干区域,它用来连接自治系统内部的所有其他区域。用来连接骨干区域和其他区域的路由器叫做区域边界路由器,它了解所连接的两个区域的完整的链路状态信息,并将链路状态信息汇总后发给区域内的其他路由器。这样,减小了路由器保存的链路状态数据库的大小,可以解决路由器内存容量有限的问题。
区域是通过一个32位的区域ID(Area ID)来标识的。
区域ID可以表示成一个十进制的数字,也可以表示成一个点分十进制的数字。在Cisco的路由器中这两种表示方式都可以使用。
区域0(或者区域0.0.0.0)是为骨干区域保留的区域ID号。OSPF的骨干区域(Backbone Area)是一个特殊的OSPF区域,它担负着区域间路由信息传播的重任。
名词解释:
区域:区域ID相同的一组逻辑上的OSPF路由器,区域中的所有路由器的链路状态数据库都相同。在OSPF配置中,区域是分别在各个接口上定义的。
2. 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,这已经成为了一种标准配置。
3. DR和BDR
(1) 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。
(2) 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路由器。
(3) OSPF的组播地址
一旦DR和BDR路由器选举成功,其他路由器(成为DRother)将只与DR与BDR路由器形成邻接关系。组播地址224.0.0.5代表所有参与OSPF的路由器(AIISPFRouter),而组播地址224.0.0.6只有DR和BDR路由器去侦听这个地址,但BDR只侦听不响应。在广播多路访问网络上,链路更新信息先发送到244.0.0.6,再由DR路由器使用组播地址244.0.0.5泛洪更新报文到其他所有路由器。
4. 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-cost reference-bandwidth修正这个问题,这个命令允许管理者更改默认的参考带宽。
OSPF邻接关系的建立
1. OSPF的数据包类型
OSPF信息不使用TCP或UDP,它承载在IP数据包内,使用协议号89(十进制)。
OSPF路由协议依靠五种不同类型的包来标识它们的邻居以及更新链路状态信息。这五种类型的包使得OSPF具备了高级和复杂的通信能力,如下表所示列出了OSPF常用的包类型。
2. OSPF邻接关系的建立
当两台或多台路由器同时启动运行OSPF路由协议时将开始建立邻接关系的过程,此过程将经历七种状态:
OSPF启动的第一个阶段是使用Hello报文建立双向通信的过程,如图:
(1) 失效(Down)状态
这是OSPF建立交互关系的初始化状态,路由器没有与任何邻居交换信息。
(2) 初始(Init)状态
路由器的各个接口通过224.0.0.5发送Hello报文,这里以R1发送Hello报文为例。当邻居路由器R2收到第一个Hello报文,这时就进入Init状态。在该状态时,路由器R2已经接收到Hello报文,但自身的ID并没有出现在该Hello报文内。
(3) 双向(2-Way)状态
路由器R2向路由器R1发送一个Hello回应报文,该Hello回应报文含有路由器R1的ID。当路由器R1收到该Hello回应报文,发现含有自身的ID,这是就进入2-Way状态,双向通信已经建立。DR和BDR的选举正是在这个状态完成的。
OSPF启动的第二个阶段是建立完全邻接关系,如图:
(4) 准启动(ExStart)状态
在选举出DR和BDR之后,路由器就被认为是处于ExStart状态。在该状态中,DR和BDR与网路中其他各路由器建立邻接关系。在这个过程中,两个邻接路由器之间建立起一个主/从(Master/Slave)关系,路由器ID大的作为主路由器,用来发起通信。
(5) 交换(Exchange)状态
主/从路由器之间交换一个或多个数据库描述包(DBD),路由器进入Exchange状态。DBD包含的是链路状态数据库中的LSA条目的摘要信息,主/从路由器之间交换DBD时要确保双方都接收到。
(6) 加载(Loading)状态
如果收到的DBD有更新的LSA条目的摘要信息,路由器将向对方发送链路状态请求包(LSR)请求更详细的信息,对方路由器用链路状态更新(LSU)回应该LSR,此过程称为Loading状态。链路状态更新包(LSU)需要对方确认收到。
(7) 完全邻接(Full)状态
当路由器之间完成了数据库同步,它们的链路状态数据库已经完全一致,此时就达到了Full状态。
到此,路由器中的链路状态数据库已经完全一致了,路由器可以根据这个一致的链路状态数据库通过最短路径优先算法(SPF)来计算到目的网络的最佳路径并形成路由表。
OSPF的网络类型
根据路由器所连接的物理网络不同,OSPF将网络划分为以下四种类型:
1. 点到点网络(Point-to-Point)
点到点网络连接单独的一对路由器。在点到点网络上的有效邻居总是可以形成邻接关系,不需要DR和BDR。在这些网络上的OSPF报文的目的地址也总是224.0.0.5。(s接口)
点到点网络一般采用PPP协议、HDLC协议等。
2. 广播多路访问网络(BMA)
广播多路访问网络,像以太网和光纤分布式数字网(FDDI)等,它们可以连接多于两台的设备。而且由于它们是广播型的,因而连接在这种网络上的所有设备都可以接收到传送的报文。在广播型网络上的OSPF路由器会选择DR和BDR。OSPF报文采用组播方式发送。(单播)
3. 非广播多路访问网络(NBMA)
NBMA网络,像X.25和帧中继等,可以连接两台以上的路由器,但是它们没有广播数据包的能力。在NBMA网络上的OSPF路由器需要手工配置邻居,选举DR和BDR,并且所有的OSPF报文都是单播的。(组播)
4. 点到多点网络(Point-to-MultiPoint)
点到多点网络是NBMA网络的一个特殊配置,可以被看作是一群点到点链路的集合。在这些网络上的OSPF路由器不需要选举DR和BDR,OSPF报文时组播的。
名词解释
* HDLC(High Level Data Link Control,高级数据链路控制):是常用的数据链路层协议之一。许多常用的数据链路层协议的封装方式都是基于HDLC的封装格式。HDLC是ISO组织制定的一个标准化规程,它适用于点到点和点到多点的数据链路。由于各个厂家对DHLC标准的实现不尽相同,所以一般不同厂家设备之间互连不能采用HDLC协议进行封装。Cisco路由器串口使用的默认协议时HDLC。
* PPP(Point to Point Protocol,点对点协议):是应用最广泛的广域网连接时使用的数据链路层协议。它支持多种网络层协议,并且支持用户认证。
OSPF的应用环境
1. 使用OSPF的原因
OSPF与RIP相比虽然有点很明显,但是一般情况下,并不是所有的网络都需要都需要使用OSPF,一些简单的,路由器配置较低的环境,仍然需要使用静态路由。当考虑以下几个方面的因素时,一般需要使用OSPF来搭建:
1)网络的规模
当网络中的路由器在十台以上或大中型规模的网络。
2)网络的拓扑结构
网络的拓扑结构为网状,并且任意两台路由器之间都有互通的需求。
3)其他特殊的需求
要求路由器变化时能够快速收敛,路由协议自身的网络开销尽量降低。
4)路由器自身的要求
运行OSPF协议时对路由器CPU的处理能力及内存的大小都有一定的要求,性能很低的路由器不推荐使用OSPF协议。
2. OSPF的特点
OSPF主要具有以下几个特点:
* 可适应大规模网络
* 路由变化收敛速度快
* 无路由环路
* 支持可变长子网掩码VLSM
* 支持区域划分
* 支持以组播地址发送协议报文
3. OSPF与RIP的比较
(1) 从网络结构看
RIP的拓扑简单,适用于中小型网络,没有区域、边界等概念。最大跳数为15跳,路由是依靠下一跳的个数来描述,无法体现带宽与网络延迟。
OSPF适用于较大规模的网络。它把自治系统(AS)分成若干个区域,通过对系统内部路由的不同处理,对区域内和区域间路由的不同处理,减少网络数据量的传输。OSPF对应RIP的“跳数”,引入了“开销(Cost)”的概念。OSPF还把其他路由协议或者静态路由作为AS的外部路由引入,处理能力相当强。
RIP的原始版本不支持变长子网掩码VLSM(RIP v2支持),OSPF支持可变长子网掩码(VLSM)。
(2) 协议运行有差别
运行RIP时,首先向邻居发送请求报文,其他运行RIP的路由器收到请求报文后,马上把自己的路由表发送过去;在没收到请求报文时,定期(30s)广播自己的路由表。
运行OSPF时,用Hello报文同邻居建立连接,然后迅速建立邻接关系,只在建立了邻接关系的路由器中发送路由信息;以后靠定期发送Hello报文来维持连接,相对RIP的路由表报文来说这个Hello报文要小得多,网络拥塞也就少了。Hello报文在广播网上一般每10s发送一次,若在一定时间内(4倍于Hello间隔)没有收到Hello报文,便认为对方已经死掉,从路由表中去掉,但在链路状态数据库中并没有真正的去掉,以备它在启用时减少数据传输量。但在它达到3600s(60分钟)时便真正去掉它。OSPF的LSA也会重发,重发间隔为1800s(30分钟)。
(3) 使用情况不同
一般来说,OSPF占用的实际链路带宽比RIP少,因为它的路由表是有选择的广播(只在建立邻接的路由器间),而RIP是邻居之间的广播。OSPF使用CPU的时间比RIP少,因为OSPF达到平衡后的主要工作是发送Hello报文,而RIP发送的是路由表(Hello报文比路由表小得多)。OSPF使用的内存比RIP大,因为OSPF有一个相对大的路由表。OSPF使用了邻接关系,其收敛速度快。
OSPF的基本配置命令
启动OSPF路由进程
与配置RIP不同的是,在配置OSPF的时候需要配置进程号,进程号是本地路由器的进程号,用于标识一台路由器上的多个OSPF进程,其值可以在1-65535之间选取。配置命令如下:
Router(config)# router ospf process-id
指定OSPF协议运行的接口和所在的区域,命令如下:
Router(config-router)# network address inverse-mask area area-id
其中,各参数分别表示如下含义:
address:网络号,可以是网段地址、子网地址或者一个路由器接口的地址。用于指出路由器所要通告的链路。
inverse-mask:反向掩码,用于精确匹配所通告的网络ID。
area-id:区域号,指明同网络号相关的区域,可以是0、1、2这样的数字,也可以是192.168.1.0这样的标识方法。
修改接口的优先级
Router(config-if)# ip ospf priority priority
其中,priority默认为1,范围是0-255。设置为0时,表示不参与DR和BDR的选举。
修改接口的Cost值,Cost值使用16位的无符号整数表示,大小范围为1-65535。
Router(config-if)# ip ospf cost cost
例如:
Router(config)# int f0/0 Router(config-if)# ip ospf cost 100
用于诊断的查看命令
查看路由表
Router# show ip route
查看邻居列表及其状态
Router# show ip ospf neighbor
查看OSPF的配置
Router# show ip ospf
查看OSPF接口的数据结构
Router# show ip ospf interface type number
OSPF单域的配置实例
实验环境
如上图所示为公司的路由器连接示意图,通过配置路由器实现公司内部全网互通,具体规划如下:
(1)R1和R2的互联地址为:10.1.1.0/30,R2和R3的互联地址为:20.2.2.0/30,R3和R4的互联地址为:30.3.3.0/30,R4和R1的互联地址为:40.4.4.0/30。
(2)使用路由器的Loopback接口地址作为Route ID,R1的Loopback0:1.1.1.1/32,R2的Loopback0:2.2.2.2/32,R3的Loopback0:3.3.3.3/32,R4的Loopback0:4.4.4.4/32
(3)PC1用户的IP地址段为192.168.1.0/24,PC2用户的IP地址段为192.168.2.0/24,PC3用户的IP地址段为192.168.3.0/24,PC4用户的IP地址段为192.168.4.0/24。
具体步骤:
1. 配置路由器的接口地址(略)
2. 配置OSPF协议,实现网络互通。
R1(config)# router ospf 1 //启动ospf进程 R1(config-router)# router-id 1.1.1.1 //配置Router ID R1(config-router)# network 192.168.1.0 0.0.0.255 area 0 R1(config-router)# network 10.1.1.0 0.0.0.3 area 0 R1(config-router)# network 30.3.3.0 0.0.0.255 area 0
R2(config)# router ospf 1 R2(config-router)# router-id 2.2.2.2 R2(config-router)# network 192.168.2.0 0.0.0.255 area 0 R2(config-router)# network 10.1.1.0 0.0.0.3 area 0 R2(config-router)# network 40.4.4.0 0.0.0.255 area 0
R3(config)# router ospf 1 R3(config-router)# router-id 3.3.3.3 R3(config-router)# network 192.168.3.0 0.0.0.255 area 0 R3(config-router)# network 20.2.2.0 0.0.0.3 area 0 R3(config-router)# network 30.3.3.0 0.0.0.255 area 0
R4(config-router)# router-id 4.4.4.4 R4(config-router)# network 192.168.4.0 0.0.0.255 area 0 R4(config-router)# network 20.2.2.0 0.0.0.3 area 0 R4(config-router)# network 40.4.4.0 0.0.0.255 area 0
3. 使用show ip route命令查看路由表。
4. 使用ping命令验证网络和OSPF协议通信正常。
在路由表条目中可以看到条目前面的标识,为O说明是通过OSPF学习到的路由,OSPF的管理距离为110,后面的2、3是开销值