在上一篇文章中,我们针对距离矢量路由协议的代表RIP动态路由协议作了分析,今天我们看一个链路状态协议的代表:OSPF。
OSPF:Open Shortest Path First
开放最短路径优先协议,它是IETF组织开发的一个基于链路状态的内部网关协议。大家从Open这个词就可以看出来,这个协议是公开的,可以支持不同厂家的设备,而我们下面要讲到的EIGRP就是思科所独有的。OSPF目前使用的是版本2,可适应大规模网络,因为OSPF没有RIP的跳数限制,并且由于引进了区域的概念也比EIGRP支持的网络规模大。OSPF已经被广泛的用在网络、企业网络、电力网络、金融网络、是一个支持大规模网络的IGP路由协议,最多可支持几百台路由器的网络规模。
下面咱们来看一下OSPF的优点:
路由变化收敛速度快:OSPF的路由是经过路由器存储在本地的数据库计算出来的,当发生网络更新的时候不需要被动的询问邻居路由器,所以OSPF相对来说收敛速度比较快。
无路由环路:OSPF路由协议采用的是最短路径优先算法(SPF),而且路由器用Router ID来表示,所以可以保证在一个区域内没有环路,由于 使用直连骨干区域的设计,所以可以保证即使在多载的情况下无环路出现。注意,这里所说的无环路的意思是当网络仅使用OSPF路由协议时没有环路,如果出现其他路由协议或静态路由的参与,就不能保证没有环路了。
支持CIDR和VLSM:我们前面所讲的RIP路由协议不支持CIDR和VLSM,这被认为是RIP路由不适用于大型网络的又一个重要原因,采用CIDR和VLSM可以在最大限度上节约IP地址。
层次区域划分:在OSPF中,一个网络可以被划分为很多个区域Area,其中分为两种:骨区域(area 0)和常规区域,其中常规区域可以支持42亿个,2的32次方个区域,绝对够用。但是要求所有的常规区域必须与骨干区域相连,一个区域通过OSPF边界路由器相连,区域间可以通过路由汇总(Summary)来减少路由信息,减小路由表,提高路由器的运算速度。
组播地址发送协议报文:使用专用的组播地址发送协议报文,因为是在小范围内通讯,所以可以减少对网络中非OSPF设备的影响。
下面咱们要介绍OSPF中一个重要但是很不算复杂的概念:Router ID(RID)
一台路由器如果要运行OSPF协议,就必须存在Router ID。Router ID的作用其实很简单,就是唯一标示一台OSPF路由器,如果没有配置ID号,系统会从当前接口的IP地址中自动选一个作为路由器的ID号。选择顺序通常是优先从loopback地址中选择一个作为路由器的ID号;也可以从接口地址中选择,这时如果同时存在多个接口,则将接口中最大的IP地址作为路由器的ID号。也就是说如果有逻辑接口也就是Loopback接口,则使用Loopback地址作为自己的RID,那如果没有逻辑接口,只有物理接口,则会使用物理接口IP地址比较大的那个作为自己的RIP。那么哪些是物理接口如:Serial口,Ethernet口,ATM口等等,但是如果有两个逻辑接口,则也是逻辑接口中IP地址较大的那个为RID。
通常建议先Router ID再配置OSPF路由协议,否则如果先启动了OSPF而路由器自己选举的Router ID又不是你希望的,那么重新重新配置Router ID就需要重启动一次OSPF路由进程了。为什么使用Loopback IP地址来优先配置Router ID?因为早期的路由器操作(IOS)中使用物理接口IP地址充当Router ID,如果物理接口出现问题而down了,那么Router ID也就跟着消失了。这样很容易OSPF路由协议的不稳定。虽然现在路由器操作系统已经改掉了这个BUG,但路由器优先考比物理接口稳定的Loopback口IP地址成为了一个惯例。另外由于Loopback接口一般不参与路由工作,所以可以通过Loopback接口优先配置Router ID。
手动配置Router ID的好处:
因为OSPF协议以Router ID识别邻居路由器,所以当出现各川问题的时候管理员总是看到Router ID路由器有问题。那么在分配Router ID的时候,就可以考虑按照逻辑或物理的地址来进行分配。在Cisco路由器中还有一个特性是通过;架设DNS服务器来解析Router ID名称。这样当网络管理员监视网络状况的时候就可以直接看到对方路由器的名字了。
咱们了解了Router ID之后咱们就要接着来了解另外两个概述DR和BDR:因为Router ID直接影响到DB和BDR的选举,我们来详细看一下,我们先从一个图入手:
DR BDR的选举
那么如果在一个以太网环境中这五台路由器之间希望交换同步路由信息,它们之间使用的是网状的逻辑拓扑。如下图所示:
交换路由信息
这时如果希望它们之间能够迅速同步,需要多条链路,这样维护成本是比较大的。我们就想了,我们可以在网络上选择一个路由器出来,让它来当“老大”,然后规定其他的路由器如果希望与另一个路由器通讯,那么只要经过这个“老大”就可以了。所以如果我们把C当成“老大”,则拓扑就变成了下面这样:
选举过程
这样所有的路由器之间通讯都通过C路由器,就减少了路由信息在网络上的洪泛。节约了网络带宽。那么这个路由器C就是咱们所说的DR,指定路由器(Designated Rouer)
那关键是如果有一天这个路由器C坏了,怎么办?这和WINDOWS中的DC有点类似,为了实现冗余,我们再来指定一个BDR(Backup DR),如我们在这里再指定路由器D作为BDR,那么这个拓扑图又变了:
再次变化
其实也就是咱们网络拓扑中所说的部分互连。这样的话冗余实现了,成本也降低了。关键是网络上有这么多路由器,到底哪一个是DR,哪一个是BDR?
我们来看一下选举过程:
当选举DR/BDR的时候要比较hello报文中的优先级。那么什么又是hello报文中,简单来说这个hello报文中包括一些定时器的数值,DR,BDR,以及自己已知的邻居。也就是说每个路由器在和对方通讯时也是发hello报文,见面先打个照呼!在OSPF中默认每10秒中发一次Hello报文!如果40秒还没有收到的话,则宣称该邻居死亡。里面就包含了Router ID,Hello报文的时间间隔和死亡时间间隔,邻居信息,区域信息,路由器优先级,DR以及BDR的信息,验证信息以及根区域标记等。如图所示:
OSPF路由协议
其中要求打*的参数必须要完全一样,不然就不可能成为一个邻居。
那么当选举DR/BDR的时候就先比较Hello包中的优先级(priority)优先级最高的为DR,次高的为BDR,但是默认优先级都为1,所以这个意义不大!那么在优先级相同的情况下就开始比较我们刚刚介绍的一个东西了Router ID,RID值最高的为DR,次高的为BDR,当你把优先级设置为0以后,该路由器就不能成为DR或者是BDR,只能是DROther。
修改优先级可以使用命令: (config-if)#ip ospf cost 0-255 255最高
当选举完成后,DROther只和DR/BDR形成邻接关系也就是说在它们的眼里只有DR和BDR是它们的邻居,所有的路由器将组播Hello包到地址224.0.0.5以便它们能跟踪其他邻居的信息,即DR将洪泛LSU到224.0.0.5这个组播地址上;DROther 只能能过组播地址224.0.0.6将LSU(链路状态更新)到所有的DR上。只有DR/BDR监听这个组播地址。
如果两台路由器刚刚启动没有配置OSPF时,则相关的端口都是DOWN的。
没有启用路由协议
如果配置好OSPF,这个时候如果双方开始发送一个初始化状态,我们以Router1为例,此时它会宣告我是192.168.10.10 这其实就是它的RID,它会告诉对方我是192.168.10.10我现在没有任何邻居。这个时候Router2在自己的Fa0/0中收到了Router2 发过来的宣告信息就是把这个信息加到自己的邻居表里面并注明是通过Fa0/0中连接。,然后再反馈给Router1说我是192.168.10.20,我有一个邻居是192.168.10.10;此时Router1又收到Router2的宣告信息就会把Router2的地址加到自己的路由表中并注明是通过Fa0/0连接的。
这个状态称为:Two-way 状态,相对稳定状态但是还没有真正成为邻居关系。接下来进行 Exstart 状态,还没有真正进行信息交换呢,只是一个选举DR的过程:Router1会发出一个数据包说我来负责更新路由表,因为我的RID是192.168.10.10,但是Router2会说,不行,我不认可,因为我的RID比你大。所以经过协商,Roter2应该是BDR了。再往下就是一个Exchange 状态:交换双方LSDB中的链路状态数据库的摘要信息,注意仅仅是摘要信息,为同步双方的数据库做准备。
注意这里使用的不再是hello报文,是DD报文,也就是说Router1发出一个DD报文给对方,对方收到后会发出LSACK,大家一看ACK太熟悉了,好多地方我们都使用过ACK,如TCP建立连接,通讯,拆除连接过程中,DHCP的工作过程中等等,都用到达ACK这个词,在这里也是一个意思就是给对方一个确认,因为如果没有确认,对方会重传!再往下就进入了Load 状态,这才是真正根据需要来调整自己的链路状态数据库,没有的加进来,如果我已经有了,再做出比较应该不应该做更新,等等操作。
最后完全结束之后进行是一个FULL状态,完全状态。所有的链路状态数据库保持同步!那么如果又有网络链路发生改变了,则LSU的信息(LSU更新包中包含LSA状态信息)只会发给DR,然后由DR再通过组播洪泛到本区域的其他路由器上。其他路由器再根据链路状态重新计算出新的路由表出来。 这中间会用到链路状态树和最短路径树两个概念,我们简单看一下:
SPF算法
在OSPF中是用带宽作为metric的标准叫 cost,一般每个路由器都是以自己为根来计算到达对方所需要的一个开销,用10的8次方来除以带宽,越小说明带宽越大,路径最优,就放到路由表中也就是最短路径树中。
以上只是简单分析了一下OSPF的工作过程。在此给出一张截图供大家参考:
OSPF工作过程
OSFP虽然说理论知识很多,但是配置起来很简单,我们来看一下具体的配置:
启用 OSPF:
(Config)# router ospf 进程ID 范围是 1-65535
其中这个进程ID,用于区分不同的OSPF协议,这只是一个本地进程ID,随便取,也就是说只是区分一个路由器上的多个OSPF协议,跟别的路由器没有关系可以不同。
指定网段
(config-router)network 网络号 反向掩码 area 区域号
注意这里区域号必须要求一样
查看启用的路由协议:
Show ip protocols
查看当前路由表:
Show ip route
查直OSPF相关信息
Show ip ospf interface
同样我们还是通过一个实验来结束OSPF的学习:
Lab:: 动态路由协议OSPF
实验目的:通过OSPF路由协议使得网络中达到全网互通的目的
设备:三台Cisco系统路由器,2条V24线缆
拓扑图:
实验拓扑图
Router1上的配置:
Router>en
Router#conf t
Router(config)#hostname RA
RA(config)#interface s2/0
RA(config-if)#ip address 192.168.0.1 255.255.255.0
RA(config-if)#clock rate 64000
RA(config-if)#no shutdown
RA(config-if)#exit
RA(config)#interface fa 0/0
RA(config-if)#ip address 10.10.10.1 255.255.255.0
RA(config-if)#no shutdown
RA(config-if)#exit
RA(config)#router ospf 1
RA(config-router)#network 10.10.10.0 0.0.0.255 area 0
RA(config-router)#network 192.168.0.0 0.0.0.255 area 0
Router2的配置:
Router>enable
Router#conf t
Router(config)#hostname RB
RB(config)#interface s2/0
RB(config-if)#ip address 192.168.0.2 255.255.255.0
RB(config-if)#no shutdown
RB(config-if)#exit
RB(config)#interface s3/0
RB(config-if)#ip address 192.168.1.1 255.255.255.0
RB(config-if)#clock rate 64000
RB(config-if)#no shutdown
RB(config-if)#exit
RB(config)#router ospf 1
RB(config-router)#network 192.168.0.0 0.0.0.255 area 0
RB(config-router)#network 192.168.1.0 0.0.0.255 area 0
Router3的配置:
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#interface s2/0
Router(config-if)#ip address 192.168.1.2 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface fa 0/0
Router(config-if)#ip address 20.20.20.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#router ospf 1
Router(config-router)#network 192.168.1.0 0.0.0.255 area 0
Router(config-router)#network 20.20.20.0 0.0.0.255 area 0
Router(config-router)#exit
验证我们在PC2上去ping PC1:
验证
反之也可以通讯,在此不再测试。
我们可以使用show ip route,显示当前的路由表:
路由表
其中O代表的就是OSPF,在此不再详细介绍!
也可以使用show ip rotocols 显示当前正在运行的路由协议:
路由协议
关于OSPF我们就介绍到此,下一篇文章我们将介绍一个平衡混合路由协议的代表EIGRP,敬请期待。