之前我们介绍了距离矢量路由协议,路由器之间互相传递路由表来传递路由信息,距离矢量协议的路由器只知道某个网段可以通过那个下一跳到达和到达这个网络有多远等这样的信息,并不了解整个网络的拓扑结构。而今天所说的链路状态路由协议则通过与邻居路由器建立邻接关系,互相传递链路状态信息来了解整个网络拓扑结构。
运行链路状态路由协议的路由器就好像各自“绘制”自己所了解的网段信息,然后通过与邻居路由器建立邻接关系,互相“交流”链路信息,学习整个区域内的链路信息,来“绘制”出整个区域内的链路图。在一个区域内的所有路由器都保存着完全相同的链路状态数据库。
OSPF是基于开放标准的链路状态路由选择协议,它完成各路由选择协议算法的两大功能:路径选择和路径交换。
在共同管理域下的一组运行相同路由选择协议的路由器的集合为一个自治系统(AS)。在互联网中,一个AS是一个有权决定本系统使用哪种路由协议的单位,他可以是一个企业,一座城市或一个电信运营商。随着网络的发展,上述对AS的定义已经不是十分准确了,网络的发展使得网络之间经常出现网络合并情况,导致同一个AS中使用的路由协议越来越多,所以AS的定义应用是在共同管理下的互联网络。
内部网关路由协议(IGP),用于在单一AS内决策路由。内部网关路由协议包括RIP、OSPF等。
与内部网关路由协议相对应的是外部网关路由协议(EGP),外部网关路由协议用于在多个AS之间执行路由。
IGP是用来解决AS内部通信的,而EGP是用来解决AS间通信的。
运行RIP路由协议的路由器只需要保存一张路由表,而使用OSPF路由协议的路由器需要保存三张表:邻居列表、链路状态数据库、路由表。
OSPF路由协议与RIP相比,前者适合更大型的网络环境,因为OSPF是一种链路状态型的路由协议,不会产生环路问题,因此不需要使用最大跳数等限制来防止路由环路的产生。
OSPF将AS分割成多个小的区域,OSPF的路由器只在区域内部学习完整的链路状态信息,而不必了解整个AS内部所有的链路状态。
OSPF协议中有一个几个很重要的概念,如“Router ID”、“DR”、“BDR”,我们先来了解一下Router ID:
因为运行OSPF的路由器要了解每条链路是连接在哪个路由器上的,因此,就需要有一个唯一的标识来标记OSPF网络中的路由器,这个标识就是Router ID,Cisco路由器是这样来得到它们的Router ID的。
首先,路由器会选取它所有loopback接口上数值最高的IP地址。若没配置loopback接口的IP地址,那么路由器就在所有活动物理端口中选取一个数值最高的IP地址作为路由器的Router ID。用作Router ID的路由器接口不一定非要运行OSPF协议。
一般我们会在配置OSPF时,使用 “router-id“ 来指定路由器的Router ID,也可以把想要配置的Router ID配置为loopback地址,两种办法二选一即可,但一定要注意不可从物理端口中选举Router ID。因为该端口一旦down掉,便会影响网络中路由器之间的通信。
接下来便是“DR”和“BDR”:
运行OSPF的路由器通过与邻居路由器建立邻接关系,互相传递链路状态信息。如果每两个路由器之间都要建立邻接关系,那么就会构成n(n-1)/2个邻接关系,这时就有些混乱了,而且浪费了很多不必要的网络资源。
为了可以避免这些问题的发生,可以在该网段上选举一个指定路由器(Designated Router,DR )。由DR和网络中的其他路由器建立邻接关系,并负责将网段上的变化告知它们。
为了实现冗余,当DR失效时,需要有一个新的DR来接替DR的工作,这便是BDR(Backup Designated Router,BDR)。网络上所有的路由器将和DR和BDR同时形成邻接关系。DR和BDR之间也将形成邻接关系。
DR和BDR即可以自动选举,也可以手工选举。
自动选举:网段上router ID最大的路由器将被选举为DR,第二大的将被选举为BDR,这样的选举可能不是最佳的,如果网段中有Cisco 7200 和3800系列路由器,那么3800路由器可能会由于router ID较而被选为DR,所以若要采用自动选举,则必须要注意Router ID的配置。
手工选举DR和BDR:需要设置路由器的优先级,每台路由器的接口都有一个路由器优先级,优先级的大小范围是0~255,数值越大,优先级越高,Cisco路由器默认的优先级是1,接口优先级可以在接口模式中通过“ip OSPF priority”命令来更改,若路由器的优先级被设置为0,它将不参与DR和BDR。
DR和BDR的选举过程:
当一台OSPF路由器启动并发现它的邻居路由器时,它将会去检查有效的DR和BDR路由器,如果DR和BDR存在,这台路由器将会接受已经存在的DR和BDR路由器,如果不存在,将执行一个选举过程,选出具有最高优先级的路由器作为BDR路由器,如果多个路由器的优先级一样,那么Router ID最大的路由器将被选中。如果没有有效的DR路由器存在,那么BDR路由器将被提升为DR路由器,然后执行一个选举过程选举BDR路由器。
路由器的优先级可以影响一个选举过程,但是它不能强制更换已经存在的DR或BDR路由器,因此,在一个广播多路访问网络上,最先初始化启动的两台具有选举资格的路由器将成为DR和BDR路由器,若想让路由器根据自己配置的Router ID来选举DR和BDR,那么在所有路由器接入网络后,可以在特权模式下使用“clear ip ospf pro”来清除OSPF相关信息,让网络中的路由器进行重新选举,如果实际情况允许,也可重启网络中的路由器,但路由器都关机后,前两个运行起来的路由器,必须是自己想要作为DR和BDR的路由器。
OSPF的组播地址有两个224.0.0.5和224.0.0.6,用来发送链路更新消息,链路更新消息会先发送给DR和BDR侦听的地址224.0.0.6,但BDR只侦听不相应。然后DR路由器使用组播地址224.0.0.5泛洪更新报文到其他所有路由器。
OSPF邻接关系的建立需要经历两个阶段,七种状态:
OSPF的应用环境应考虑下以下几点:
OSPF单域的配置基本命令如下:
Router(config)#router ospf 1 #配置OSPF的进程号。进程号是本地路由器的进程号,用于标识一台路由器上的多个OSPF进程,其值可以在1~65535选取。
Router(config-router)#router-id 1.1.1.1 #指定Router ID,若已经配置loopback接口地址,则这条命令可以省略,将1.1.1.1配置为loopback地址时,掩码则最好为255.255.255.255
Router(config-router)#network 192.168.1.0 0.0.0.255 area 0 #配置运行OSPF协议的接口,也就是将与本路由器直连的网段声明,以便让别的路由器学习到该路由器上的直连网段。 “area”是指定区域,在单域配置中区域必须为0。
以上述同样格式的network命令声明该路由器上所有的直连网段,配置便完成了。不过需要注意的是,在声明网段时,网络地址后面跟的是反掩码。
查看邻居路由器的命令:
Router#show ip ospf neighbor
查看F0/0接口的数据结构:
Router#show ip ospf interface f0/0 #可以查看到该网段的DR和BDR,属于哪个区域等详细信息。
修改接口F0/0的优先级为2
Router(config)#in f0/0
Router(config-if)#ip ospf priority 2 #注意优先级为0的话将不参与DR和BDR的选举
Router(config-if)#ip ospf cost 2 #修改接口的cost值(cost值为路径选择的一种方式,值的取值范围为1~65535)
当网络环境中有多家厂商的产品,则应注意cost值,有些厂家默认的是1,如果网络中所有的路由器没有使用同一种计算cost的方式来指定OSPF的开销,那么OSPF协议将不能正确的进行路由选择。
查看邻居列表及其状态:
Router#show ip ospf neighbor
查看OSPF的配置
Router#show ip ospf #查看OSPF的配置