为了响应不断增长的建立越来越大的基于IP的网络需要,IETF成立了一个工作组专门开发一种开放的、基于大型复杂IP网络的链路状态路由选择协议。由于它依据一些厂商专用的最短路径优先(SPF)路由选择协议开发而成,而且它是开放性的,因此称为开放式最短路径优先(Open Shortest Path First,OSPF)协议,和其他SPF一样,它采用的也是Dijkstra算法。OSPF协议现在已成为最重要的路由选择协议之一,主要用于用一个自治系统(AS)。
OSPF协议采用了“区域”的设计,提高了网络可扩展性,并且加快了网络汇聚时间。也就是将网络划分成为许多较小的区域,每个区域定义一个独立的区域号并将此信息配置给网络中的每个路由器。从理论上来说,通常不应该采用实际地域来划分区域,而是应该本着使不同区域间的通信量最小的原则进行合理分配。
OSPF是一种典型的链路状态路由协议。采用OSPF的路由器彼此交换并保存整个网络的链路信息,从而掌握全网的拓扑结构,独立计算路由。因为RIP路由协议不能服务于大型网络,所以IETF的IGP工作组特别开发链路状态协议——OSPF。目前广为使用的是OSPF的第二版,最新标准为RFC2328。
1、OSPF路由协议概述
OSPF作为一种内部网关协议,用于在同一个自治域(AS)中的路由器之间发布路由信息。区别于距离矢量协议(RIP),OSPF具有支持大型网络、路由收敛快、占用网络资源少等优点。
1)基本概念和术语
(1)链路状态。
OSPF路由器收集其所在网络上各路由器的连接状态信息-即链路状态信息(Link-State),生成链路状态数据库(Link-State Database)。路由器掌握了该区域上所有路由器的链路状态信息,也就等于了解了整个网络的拓扑状态。OSPF路由器利用“最短路径优点算法(SPF)”,独立地计算出到达任意目的地的路由。
(2)区域。
OSPF协议引入“分层路由”的概念,将网络分割成一个“主干”连接的一组相互独立的部分,这些相互独立的部分称为“区域”,“主干”的部分称为“主干区域”。每个区域如同一个独立的网络,该区域的OSPF路由器只保存该区域的链路状态。每个路由器的链路状态数据库都可以保持合理的大小,路由计算的时间、报文数量都不会过大。
(3)OSPF网络类型。
根据路由器所连接的物理网络不同,OSPF将网络划分为4种类型:广播多路访问型(Broadcast MultiAccess)、非广播多路访问型(None Broadcast MultiAccess,NBMA)、点到点型(Ponit-to-Point)、点到多点型(Point-to-MultiPoint)。
广播多路访问型网络,如Ethernet、Token Ring、FDDI。
NBMA型网络,如Frame Relay、X.25、SMDS。Point-to-Point型网络,如PPP、HDLC。
(4)指派路由器(DR)和备份指派路由器(BDR)。
在多路访问网络上可能存在多个路由器,为了避免路由器之间建立完全相邻关系而引起的大量开销,OSPF要求区域中选举一个DR。每个路由器都与之建立完全相邻关系。DR负责收集所有的链路状态信息,并发布给其他路由器。选举DR的同时也选举一个BDR,在DR失效时,BDR担负起DR的职责。
当路由器开启一个端口的OSPF路由时,将会从这个端口发出一个Hello报文,以后他也将以一定的间隔周期性地发送Hello报文。OSPF路由器用Hello报文来初始化新的相邻关系以及确认相邻的路由器邻居之间的通信状态。
对广播型网络和非广播型多路访问网络,路由器使用Hello协议选举出一个DR。在广播型网络里,Hello报文使用多播地址224.0.0.5周期性广播,并通过这个过程自动发现路由器邻居。在NBMA网络中,DR负责向其他路由器逐一发送Hello报文。
2)操作
OSPF协议操作总共经历了建立邻接关系、选举DR/BDR、发现路由器、选择适当的路由器、维护路由信息等。
(1)建立路由器的邻接关系。
所谓“邻接关系”(Adjacency)是指OSPF路由器以交换路由信息为目的,在所选择的相邻路由器之间建立一种关系。路由器首先发送拥有自身ID信息(Loopback端口或最大的IP地址)的Hello报文。与之相邻的路由器如果收到这个Hello报文,就将这个报文内的ID信息加入到自己的Hello报文内。
如果路由器的某端口收到从其他路由器发送的含有自身ID信息的Hello报文,则它根据该端口所在网络类型确定是否可以建立邻接关系。
在点对点网络中,路由器将直接和对端路由器建立邻接关系,,并且该路由器将直接进入到步骤(3)操作:发现其他路由器。若为MultiAccess网络,该路由器将进入选举步骤。
(2)选举DR/BDR。
不同类型的网络选举DR/BDR的方式不同。MultiAccess网络支持多个路由器,在这种状况下,OSPF需要建立起作为链路状态和LSA更新的中心节点。选举利用Hello报文内的ID和优先权(Priority)字段值来确定。优先权字段值大小为0~255,优先权值最高的路由器称为DR。如果优先权值大小一样,则ID值最高的路由器选举DR,优先权值次高的路由器选举为BDR。优先权值和ID值都可以直接设置。
(3)发现路由器。
在这个步骤中,路由器与路由器之间首先利用Hello报文的ID信息确认主从关系,然后主从路由器相互交换部分链路状态信息。每个路由器对信息进行分析比较,如果收到的信息有新的内容,路由器将要求对方发送完整的链路状态信息。这个状态完成后,路由器之间建立完全相邻关系,同时邻接路由器拥有自己独立的、完整的链路状态数据库。
在MultiAccess网络内,DR与BDR互换信息,并同时与本地子网内其他路由器交换链路信息。
在Point-to-Point或Point-to-MultiPoint网络中,相邻路由器之间互换链路状态信息。
(4)选择适当的路由器。
当一个路由器拥有完整独立的链路状态数据库后,它将采用SPF算法计算并创建路由表。OSPF路由器依据链路状态数据库的内容,独立地用SPF算法计算到每一个目的网络的路径,并将路径存入路由表中。
OSPF利用量度(Cost)计算目的路径,Cost最小者即为最短路径。在配置OSPF路由器时可以根据实际情况,如链路带宽、时延或经济上的费用设置链路Cost大小。Cost越小,则该链路被选为路由的可能性越大。
(5)维护路由信息。
当链路状态发生变化时,OSPF通过Flooding过程通告网络上其他路由器。OSPF路由器接收到包含新消息的链路状态更新报文,将更新自己的链路状态数据库,然后用SPF算法重新计算路由表。在重新计算过程中,路由器继续使用旧路由表,知道SPF完成新的路由表计算。新的链路状态信息将发送给其他路由器。值得注意的是,即使链路状态没有发生改变,OSPF路由信息也会自动更新,默认时间为30分钟。
2、OSPF路由协议的基本特征
为了更好地说明OSP路由协议的基本特征,将OSPF路由协议与距离矢量路由协议之一的RIP比较如下:
RIP中用于表示目的网络远近的唯一参数为跳(Hop),即到达目的网络所要经过的路由器的个数。在RIP路由协议中,该参数被限制最大为15,即RIP路由信息最多能传递至第16个路由器;对于OSPF协议,路由表中表示目的网络的参数为Cost,该参数为一虚拟值,与网络中链路的带宽等相关,即OSPF路由信息不收物理跳数的限制,因此OSPF比较适合于大型网络中。
RIPv1路由协议不支持变长子网屏蔽码(VLSM),被认为是RIP路由协议不适用与大型网络的又一个重要原因。采用变长子网屏蔽码可以在最大限度上节约IP地址。OSPF路由协议对VLSM有良好的支持性。
RIP路由协议路由收敛较慢。RIP路由协议周期性地将整个路由表作为路由信息广播至网络中,该广播周期为30s。在一个较为大型的网络中,RIP会产生很大的广播信息,占用较大的网络带宽资源。由于RIP协议30s的广播周期,影响了RIP路由协议的收敛,甚至出现不收敛的现象。OSPF是一种链路状态的路由协议,当网络比较稳定时,网络中的路由信息时比较少的,并且其广播也不是周期性地,因此OSPF路由协议即使在大型网络中也能够较快地收敛。
在RIP中,网络是一个平面的概念,并无区域及边界等的定义。随着无极路由CIDR概念的出现,RIP协议就明显落伍了。在OSPF路由协议中,一个网络,或者说是一个路由域可以划分为多个区域,每一个区域通过OSPF边界路由器相连,区域间可以通过路由汇聚来减少路由信息,减小路由表,提高路由器的运算速度。
OSPF路由协议支持路由验证,只有互相通过路由验证的路由器之间才能交换路由信息。而且OSPF可以对不同的区域定义不同的验证方式,提高网络的安全性。
3、建立OSPF邻接关系过程
OSPF路由协议通过建立交换关系来交换路由信息,但并不是所有相邻的路由器都会建立OSPF交互关系。下面简要介绍OSPF建立adjacency的过程。
OSPF协议是通过Hello协议数据包来建立及维护相邻关系的,同时也用其来保证相邻路由器之间的双向通信。OSPF路由器会周期性地发送Hello数据包,当这个路由器看到自身被列于其他路由器的Hello数据包里时,这两个路由器之间会建立双向通信。在多接入的环境中,Hello数据包还用于发现指定路由器(DR),通过DR来控制与那些路由器建立交换关系。
两个OSPF路由器建立双向通信之后的第二个步骤是进行数据库的同步,数据库同步是所有链路状态路由协议的最大的共性。在OSPF路由协议中,数据库同步关系仅仅在建立交换关系的路由器之间保持。
OSPF的数据库同步是通过OSPF数据库描述数据包(Database Description Packets)来进行的。OSPF路由器周期性地产生数据库描述数据包,该数据包是有序的,即附带有序列号,并将这些数据包对相邻路由器广播。相邻路由器可以根据数据库描述数据包的序列号与自身数据库的数据作比较,若发现接收到的数据比数据库内的数据序列号大,则相邻路由器会对序列号大的数据发出请求,并用请求得到的数据来更新其链路状态数据库。
将OSPF相邻路由器发送Hello数据包,建立数据库同步至建立完全的OSPF交互关系的过程分成几个不同的状态,如下所述:
(1)Down:这是OSPF建立交互关系的初始化状态,表示在一定的时间之内没有接收到从某一相邻路由器发送来的信息。在非广播型的网络环境中,OSPF路由器还可能对处于Down状态的路由器发送Hello数据包。
(2)Attempt:该状态仅在NBMA环境,如帧中继、X.25或ATM环境中有效,表示在一定时间内没有接收到某一相邻路由器的信息,但是OSPF路由器仍必须通过以一个较低的频率向该相邻路由器发送Hello数据包来保持联系。
(3)Init:在该状态时,OSPF路由器意见接收到相邻路由器发送来的Hello数据包,但自身的IP地址并没有出现在该Hello数据包内,也就是说,双方的双向通道还没有建立起来。
(4)2-way:这个状态可以说是建立交互方式真正的开始步骤。在这个状态,路由器看到自身以处于相邻路由器的Hello数据包内,双向通信已经建立。指定路由器及备份指定路由器的选择正是在这个状态完成的。在这个状态,OSPF路由器还可以根据其中的一个路由器是否指定路由器或根据链路是否点对点或虚拟链路来决定是否建立交互关系。
(5)Exstart:这个状态是建立交互状态的第一个步骤。在这个状态,路由器要决定用于数据交换的初始的数据库描述数据包的序列号,以保证路由器得到的永远是最新的链路交换信息。同时,在这个状态路由器还必须决定路由器之间的准备关系,处于主控地址的路由器会向处于备份地位的路由器请求链路状态信息。
(6)Exchange:在这个状态,路由器向相邻的OSPF路由器发送数据库描述数据包来交换链路状态信息。每一个数据包都有一个数据包序列号。在这个状态,路由器还有可能向相邻路由器发送链路状态请求数据包来请求其相应数据。从这个状态开始,可以说OSPF处于Flood状态。
(7)Loading:在Loading状态,OSPF路由器会就其发现的相邻路由器的新的链路状态数据及自身的已经过期的数据向相邻路由器提出请求,并等待相邻路由器的回答。
(8)Full:这是两个OSPF路由器建立交互关系的最后一个状态,这时建立起交互关系的路由器之间已经完成了数据库同步的工作,它们的链路状态数据库已经一致。
4、OSPF的DR和BDR
在DR和BDR出现之前,每一台路由器和他的所有邻居成为完全网状的OSPF邻接关系,这样5台路由器之间将需要形成10个邻接关系,同时将产生25条LSA。并且在多址网络中,还存在自己发出的LSA从邻居的邻居发回来,导致网络上产生很多LSA的拷贝。所以基于这种考虑,产生了DR和BDR。
1)完成的工作内容
DR将完成以下工作:
(1)描述这个多址网络和该网络上剩下的其他相关路由器。
(2)管理这个多址网络上的flooding过程。
(3)同时为了冗余性,还会选取一个BDR,作为双备份之用。
2)选取规则
DR BDR选取规则:以接口状态机的方式触发。
(1)路由器的每个多路访问接口都有个路由优先级,8位长的一个整数,范围是0~255,Cisco路由器默认的优先级是1,优先级为0的话将不能选举为DR/BDR。优先级可以通过命令ip ospf priority进行修改。
(2)Hello包里包含了优先级的字段,还包括了可能成为DR/BDR的相关接口的IP地址。
(3)当接口在多路访问网络上初次启动的时候,它把DR/BDR地址设置为0.0.0.0,同时设置等待计时器(Wait Timer)的值等于路由器无效间隔。
3)选取过程
DR BDR选取过程:
(1)路由器X在和邻居建立双向(2-way)通信之后,检查邻居的Hello包中Priority,DR和BDR字段,列出所有可以参与DR/BDR选举的邻居。
(2)如果有一台或多台这样的路由器宣告自己为BDR(也就是说,在其Hello包中将自己列为BDR,而不是DR),选择其中拥有最高路由器优先级的成为BDR;如果相同,选择拥有最大路由器标识的。如果没有路由器宣告自己为BDR,选择列表路由器拥有最高优先级的成为BDR(同样排除宣告自己为DR的路由器),如果相同,再根据路由器标识。
(3)按如下计算网络上的DR。如果有一台或多台路由器宣告自己为DR(也就是说,在其Hello包中将自己列为DR),选择其中拥有最高路由器优先级的成为DR;如果相同,选择拥有最大路由器标识的。如果没有路由器宣告自己为DR,将新选举出的BDR设定为DR。
(4)如果路由器X新近成为DR或BDR,或者不再成为DR或BDR,重复步骤(2)和(3),然后结束选举。这样做事为了确保路由器不会同时宣告自己为DR和BDR。
(5)需要注意的是,当网络中已经选举了DR/BDR后,又出现了1台新的优先级更广告高的路由器,DR/BDR是不会重新选举的。
(6)DR/BDR选举完成后,DRother只和DR/BDR形成邻接关系。所有的路由器将组播Hello包到AllSPFRoutes地址244.0.0.5以便它们能跟踪其他邻居的信息,即DR将泛洪update packet到224.0.0.5;DRouter只组播update packet到AllDRouter地址224.0.0.6,只有DR/BDR监听这个地址。
4)筛选过程
(1)优先级为0的不参与选举。
(2)优先级高的路由器为DR。
(3)优先级相同时,以router ID大为DR;router ID以回环接口中最大IP为准;若无回环接口,以真实接口最大IP为准。
(4)默认条件下,优先级为1。
5、OSPF路由器类型
OSPF路由器类型如下图所示:
(1)区域内路由器(Internal Routers)。
该类路由器的所有接口都属于同一个OSPF区域。
(2)区域边界路由器ABR(Area Border Routes)
该类路由器可以同时属于两个以上的区域,但其中一个必须是骨干区域。ABR用来连接骨干区域或非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。
(3)骨干路由器(Backbone Routers)。
该类路由器至少有一个接口属于骨干区域。因此,所有的ABR和位于Area0的内部路由器都是骨干路由器。
(4)自治系统边界路由器(AS Boundary Routers,ASBR)。
与其他AS交换路由信息的路由器称为ASBR。ASBR并不一定位于AS的边界,它可能是区域内路由器,也可能是ABR。只要一台OSPF路由器引入了外部路由的信息,它就成为ASBR。
6、OSPF LSA类型
随着OSPF路由器种类概念的引入,OSPF路由协议又对其链路状态广播数据包(LSA)做出来分类。OSPF将链路状态广播数据包主要分成以下6类,如下表所示:
类型代码 | 描述 | 用途 |
Type1 | 路由器LSA | 由区域内的路由器发出的 |
Type2 | 网络LSA | 由区域内的DR发出的 |
Type3 | 网络汇总LSA | ABR发出的,其他区域的汇总链路通告 |
Type4 | ASBR汇总LSA | ABR发出的,用于通告ASBR信息 |
Type5 | AS外部LSA | ASBR发出的,用于通告外部路由 |
Type7 | NSSA外部LSA | NSSA区域内的ASBR发出的,用于通告本区连接的外部路由 |
(1)1类LSA:每台路由器都通告1类LAS,描述了与路由器直连的所有链路(接口)状态,只能在本区域内扩散。
(2)2类LSA:只有DR才有资格产生,只能在本区域内扩散,描述了多路访问网络的所有路由器和链路的子网掩码。
(3)3类LSA:只有ABR可以产生,能在整个OSPF自治系统扩散,描述了目的网络的路由。
(4)4类LSA:仅当区域中有ASBR中,ABR才会产生,该LSA标识了ASBR,提供了一条前往该ASBR的路由。
(5)5类LSA:只能由ASBR产生,描述了前往OSPF自治系统外的网络的路由,被扩散到整个AS。
(6)7类LSA:只能由NSSA ASBR产生,只能出现在NSSA,而NSSA ABR将其转换为5类LSA并扩散到整个OSPF自治系统。
7、OSPF区域类型
根据区域所接收的LSA类型不同,可以将区域划分为以下几种类型:
(1)标准区域:默认的区域类型,它接收链路更新、汇总路由和外部路由。如下图所示:
(2)骨干区域:骨干区域为Area0,其他区域都与之相连以交换路由信息,该区域具有标准区域的所有特征。
(3)末节区域:不接收4类汇总LSA和5类外部LSA,但接收3类汇总LSA,使用默认路由到AS外部网络(自动生成),该区域不包含ASBR(除非ABR也是ASBR)。
(4)绝对末节区域:这个是Cisco专用。它不接收3类、4类汇总LSA和5类外部LSA,使用默认路由到AS外部网络(自动生成),该区域不包含ASBR(除非ABR也是ASBR)。
(5)NSSA:不接收4类汇总LSA和5类外部LSA,但接收3类汇总LSA且可以有ASBR,使用默认路由前往外部网络,默认路由是由与之相连的ABR生成的,但默认情况下不会生成,要让ABR生成默认路由,可使用命令area area-id nssa
default-information-originate。
(6)绝对末节NSSA:这个是Cisco公司专用。它不接收3类、4类汇总路由LSA和5类外部LSA且可以有ASBR,使用默认路由到AS外部网络,默认路由是自动生成的。
每一种区域中允许泛洪的LSA总结如下:
区域类型 | 1&2 | 3 | 4&5 | 7 |
骨干区域 | 允许 | 允许 | 允许 | 不允许 |
非骨干区域,非末梢区域 | 允许 | 允许 | 允许 | 不允许 |
末节区域 | 允许 | 允许 | 不允许 | 不允许 |
绝对末节区域 | 允许 | 不允许* | 不允许 | 不允许 |
NSSA | 允许 | 允许 | 不允许 | 允许 |
绝对末节NSSA | 允许 | 不允许 | 不允许 | 允许 |
注:*为ABR路由器使用一个类型3的LSA通告默认路由。
8、虚链路
在OSPF路由协议中存在一个骨干区域,该区域包括属于这个区域的网络及相应的路由器,骨干区域必须是连续的,同时也要求其余区域必须与骨干区域直接相连。骨干区域一般为区域0,其主要工作是在其余区域间传递路由信息。所有的区域,包括骨干区域之间的网络结构情况是互不可见的,当一个区域的路由信息对外广播时,其路由信息是先传递至区域0,再有区域0将该路由信息向其余区域作广播。
在实际网络中,可能会存在骨干区域不连续或某一个区域与骨干区域物理不相连的情况,在这两种情况下,系统管理员可以通过设置虚拟链路的方法来解决。
(1)骨干区域不连续虚链路
(2)与骨干区域物理不相连虚链路
虚拟链路设置在两个路由器之间,这两个路由器都有一个端口与同一个非骨干区域相连。虚拟链路被认为是属于骨干区域的,在OSPF协议看来,虚拟链路两端的两个路由器被一个点对点的链路连在一起。在OSPF协议中,通过虚拟链路的路由信息是作为域内路由来看待的。
9、OSPF配置命令汇总
命令 | 用途 |
router ospf 进程号 | 进入OSPF路由进程 |
network network inverse-mask area area-id | 宣告网络 |
router-id ip-address | 指定Router-ID |
ip cost priority priority | 指定接口优先级,0~255,默认为1 |
ip ospf hello-interval hello-time | 配置hello-interval |
ip ospf dead-interval dead-time | 配置dead-interval |
redistribute protocol [metrc metrc-value] [metric-type type-value] [subnets] | 重分发路由命令 |
area area-id stub | 配置区域为末节区域 |
area area-id nssa | 配置区域为NSSA区域 |
area area-id range network mask | 配置区域间路由汇总 |
Summary-address network mask | 配置外部路由汇总 |
area area-id virtual-link router-ID | 配置虚链路 |
show ip route | 查看路由表信息 |
show ip route ospf | 只查看OSPF学习到的路由 |
show ip protocol | 查看OSPF协议配置信息 |
show ip ospf | 查看在路由器上OSPF是如何配置的 |
show ip ospf database | 查看LSDB内的所有LSA数据信息 |
show ip ospf interface | 接口上OSPF配置的信息 |
show ip ospf neighbor | 查看OSP邻居和邻接的状态 |
show ip ospf neighbor detail | 查看OSPF邻居的详细信息(包括DR/BDR) |
show ip ospf adj | 查看路由器邻接的整个过程 |
show ip ospf packet | 查看每个ospf数据包的信息 |
clear ip route | 清空路由表 |
10、OSPF配置实例
如下图所示,该网络中有0和1两个区域,其中R1的S1端口、R2的S0端口属于区域0;而R3、R1的S0端口、R2的S1端口则属于区域1。
下面列出三个路由器配置OSPF的指令:
R1 # config terminal
R1(config)# router ospf 100 (进入OSPF协议配置子模式)
R1(config-router)# network 172.16.10.1 0.0.0.0 area 0 (设置邻接网络)
R1(config-router)# network 172.16.11.1 0.0.0.0 area 1 (指定区域0)
R1(config-router)# network 192.168.2.1 0.0.0.0 area 1
R2(config)# router ospf 200 (进入OSPF协议配置子模式)
R2(config-router)# network 172.16.0.0 0.0.255.255 area 0 (设置邻接网络)
R2(config-router)# network 192.168.3.0 0.0.0.255 area 1
R3(config)# router ospf 300 (进入OSPF协议配置子模式)
R3(config-router)# network 192.0.0.0 0.255.255.255 area 1 (设置邻接网络)
可以看出,在配置OSPF时可以将子网进行合并,以减少条目,提高效率。R3的邻接子网有192.168.1.0、192.168.2.0、192.68.3.0三个,因此可以合并为192.0.0.0/255.0.0.0或者192.168.0.0/255.255.0.0。