第1章 OSPF路由协议
1.1 OSPF协议原理
OSPF 是 Open Shortest Path First(即“开放最短路由优先协议”)的缩写。它是 IETF (Internet Engineering Task Force)组织开发的一个基于链路状态的自治系统内部路由协议。在 IP 网络上,它通过收集和传递自治系统的链路状态来动态地发现并传播路由。当前OSPF协议使用的是第二版,最新的RFC是2328。OSPF协议具有如下特点:
适应范围: OSPF 支持各种规模的网络,最多可支持几百台路由器。
快速收敛: 如果网络的拓扑结构发生变化,OSPF 立即发送更新报文,使这一变化在自治系统中同步。
无自环: 由于 OSPF 通过收集到的链路状态用最短路径树算法计算路由,故从算法本身保证了不会生成自环路由。
子网掩码 : 由于 OSPF 在描述路由时携带网段的掩码信息,所以OSPF协议不受自然掩码的限制,对VLSM 提供很好的支持。
区域划分 : OSPF 协议允许自治系统的网络被划分成区域来管理,区域间传送的路由信息被进一步抽象,从而减少了占用网络的带宽。
等值路由 : OSPF 支持到同一目的地址的多条等值路由。
路由分级 : OSPF 使用 4 类不同的路由,按优先顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。
支持验证 : 它支持基于接口的报文验证以保证路由计算的安全性。
组播发送 : OSPF在有组播发送能力的链路层上以组播地址发送协议报文,即达到了广播的作用,又最大程度的减少了对其他网络设备的干扰。
1.2 OSPF基本概念
1. Router ID
OSPF协议使用一个被称为Router ID的32位无符号整数来唯一标识一台路由器。基于这个目的,每一台运行OSPF的路由器都需要一个Router ID。这个Router ID一般需要手工配置,一般将其配置为该路由器的某个接口的IP地址。由于IP地址是唯一的,所以这样就很容易保证Router ID的唯一性。在没有手工配置Router ID的情况下,一些厂家的路由器(包括Quidway系列)支持自动从当前所有接口的IP地址自动选举一个IP地址作为Router ID。
2. 协议号
OSPF 协议用IP 报文直接封装协议报文,协议号是89。
1.3 链路状态
OSPF协议计算路由是以本路由器周边网络的拓扑结构为基础的。每台路由器将自己周边的网络拓扑描述出来,传递给其他所有的路由器。
OSPF 将不同的网络拓扑抽象为以下四种类型:
该接口所连的网段中只有本路由器自己。(stub networks)
该接口通过点到点的网络与一台路由器相连。(point-to-point )
该接口通过广播或NBMA的网络与多台路由器相连。(broadcast or NBMA networks)
该接口通过点到多点的网络与多台路由器相连。(point-to-multipoint)
NBMA与点到多点的区别:
在OSPF协议中NBMA和点到多点都是指非广播多点可达的网络,但NBMA网络必须满足全连通(full meshed)的要求,即任意两点都可以不经转发而使报文直达对端。否则,我们称该网络是点到多点网络。
如上图所示:
RTA作为网络中的一台路由器,其周围的链路状态情况可归纳为以下四种:
通过 PPP 协议与另一台路由器RTB直接相连;
通过一个 X.25 网络与 RTC 和 RTD 相连(该网络是全连通的);
通过一个Frame Relay网络与RTE和RTF相连(该网络不是全连通的,RTE与RTF不直接相连);
直接连接着一个局域网。
1.4 计算路由
上图中描述了通过 OSPF 协议计算路由的过程。
(1)由四台路由器组成的网络,连线旁边的数字表示从一台路由器到另一台路由器所需要的花费。为简化问题,我们假定两台路由器相互之间发送报文所需花费是相同的。
(2)每台路由器都根据自己周围的网络拓扑结构生成一条 LSA(链路状态广播),并通过相互之间发送协议报文将这条 LSA 发送给网络中其它的所有路由器。这样每台路由器都收到了其它路由器的 LSA,所有的 LSA 放在一起称作 LSDB(链路状态数据库)。显然,4 台路由器的 LSDB 都是相同的。
(3)由于一条 LSA 是对一台路由器周围网络拓扑结构的描述,那么 LSDB 则是对整个网络的拓扑结构的描述。路由器很容易将 LSDB 转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。显然,4 台路由器得到的是一张完全相同的图。
(4)接下来每台路由器在图中以自己为根节点,使用SPF算法计算出一棵最短路径树,由这棵树得到了到网络中各个节点的路由表。显然,4 台路由器各自得到的路由表是不同的。
这样每台路由器都计算出了到其它路由器的路由。
由上面的分析可知:OSPF协议计算出路由主要有以下三个主要步骤:
描述本路由器周边的网络拓扑结构,并生成LSA。
将自己生成的LSA在自治系统中传播。并同时收集所有的其他路由器生成的LSA。
根据收集的所有的LSA计算路由。
1.5 OSPF的协议报文
OSPF的报文类型一共有五种:
HELLO报文(Hello Packet):
最常用的一种报文,周期性的发送给本路由器的邻居。内容包括一些定时器的数值,DR,BDR,以及自己已知的邻居。
DD报文(Database Description Packet):
两台路由器进行数据库同步时,用DD报文来描述自己的LSDB,内容包括LSDB中每一条LSA的摘要(摘要是指LSA的HEAD,通过该HEAD可以唯一标识一条LSA)。这样做是为了减少路由器之间传递信息的量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分,根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。
LSR报文(Link State Request Packet):
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的或是对端更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需要的LSA的摘要。
LSU报文(Link State Update Packet):
用来向对端路由器发送所需要的LSA,内容是多条LSA(全部内容)的集合。
LSAck 报文(Link State Acknowledgment Packet)
用来对接收到的LSU报文进行确认。内容是需要确认的LSA的HEAD(一个报文可对多个LSA进行确认)。
1.6 OSPF的邻居状态机
Down:邻居状态机的初始状态,是指在过去的Dead-Interval时间内没有收到对方的Hello报文。
Attempt:只适用于NBMA类型的接口,处于本状态时,定期向那些手工配置的邻居发送HELLO报文。
Init:本状态表示已经收到了邻居的HELLO报文,但是该报文中列出的邻居中没有包含我的Router ID(对方并没有收到我发的HELLO报文)。
2-Way:本状态表示双方互相收到了对端发送的HELLO报文,建立了邻居关系。在广播和NBMA类型的网络中,两个接口状态是DROther的路由器之间将停留在此状态。其他情况状态机将继续转入高级状态。
ExStart:在此状态下,路由器和它的邻居之间通过互相交换DD报文(该报文并不包含实际的内容,只包含一些标志位)来决定发送时的主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。
Exchange:路由器将本地的LSDB用DD报文来描述,并发给邻居。
Loading:路由器发送LSR报文向邻居请求对方的DD报文。
Full:在此状态下,邻居路由器的LSDB中所有的LSA本路由器全都有了。即,本路由器和邻居建立了邻接(adjacency)状态。
注意:
1.灰色的状态是指稳定的状态,其他状态则是在转换过程中瞬间(一般不会超过几分钟)存在的状态。
2.本路由器和状态可能与对端路由器的状态不相同。例如本路由器的邻居状态是Full,对端的邻居状态可能是Loading。
1.7 链路状态数据库的同步过程
上图显示了两台路由器之间如何通过发送5种协议报文来建立邻接关系,以及邻居状态机的迁移。
1.RT1的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个HELLO报文(使用组播地址224.0.0.5)。由于此时RT1在该网段中还未发现任何邻居,所以HELLO报文中的Neighbor字段为空。
2.RT2收到RT1发送的HELLO报文后,为RT1创建一个邻居的数据结构。RT2发送一个HELLO报文回应RT1,并且在报文中的Neighbor字段中填入RT1的Router id,表示已收到RT1的HELLO报文,并且将RT1的邻居状态机置为Init。
3.RT1收到RT2回应的HELLO报文后,为RT2创建一个邻居的数据结构,并将邻居状态机置为Exstart状态。下一步双方开始发送各自的链路状态数据库。
为了提高发送的效率,双方需先了解一下对端数据库中那些LSA是自己所需要的(如果某一条LSA自己已经有了,就不再需要请求了)。方法是先发送DD报文,DD报文中包含了对本地数据库中LSA的摘要描述(每一条摘要可以惟一标识一条LSA,但所占的空间要少得多)。由于OSPF直接用IP报文来封装自己的协议报文,所以在传输的过程中必须考虑到报文传输的可靠性。为了做到这一点,在DD报文的发送过程中需要确定双方的主从关系。作为Master的一方定义一个序列号seq,每发送一个新的DD报文将seq 加一。作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的seq。实际上这种序列号机制是一种隐含的确认方法。如果再加上每个报文都有超时重传,就可以保证这种传输是可靠的。
RT1首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号为x。I=1表示这是第一个DD报文,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文。
4.RT2在收到RT1的DD报文后,将RT1的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RT2的Router ID较大,所以在报文中RT2认为自己是Master,并且重新规定了序列号为y。
5.RT1收到报文后,同意了RT2为Master,并将RT2的邻居状态机改为Exchange。RT1使用RT2的序列号y来发送新的DD报文,该报文开始正式地传送LSA的摘要。在报文中RT1将MS=0,说明自己是Slave。
6.RT2收到报文后,将RT1的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,需要注意的是:此时RT2已将报文的序列号改为y+1了。
7.上述过程持续进行,RT1通过重复RT2的序列号来确认已收到RT2的报文。RT2通过将序列号+1来确认已收到RT1的报文。当RT2发送最后一个DD报文时,将报文中的M=0,表示这是最后一个DD报文了。
8.RT1收到最后一个DD报文后,发现RT2的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RT2也收到了RT1的最后一个DD报文,但RT1的LSA,RT2都已经有了,不需要再请求,所以直接将RT1的邻居状态机改为Full状态。
9.RT1发送LS Request报文向RT2请求所需要的LSA。RT2用LS Update报文来回应RT1的请求。RT1收到之后,需要发送LS Ack报文来确认。上述过程持续到RT1中的LSA与RT2的LSA完全同步为止。此时RT1将RT2的邻居状态机改为Full状态。
注意:
以上过程是两台路由器由相互没有发现对方的存在到建立邻接关系的过程。或者可以理解为网络中新加入一台路由器时的处理情况。当两台路由器之间的状态机都已经达到Full状态之后,如果此时网络中再有路由变化时,就无须重复以上的所有步骤。只由一方发送LS Update报文通知需要更新的内容,另一方发送LS Ack报文予以回应即可。双方的邻居状态机在此过程中不再发生变化。
1.8 DR和BDR
DR的概念:
在广播和NBMA类型的网络上,任意两台路由器之间都需要传递路由信息(flood),如果网络中有 N 台路由器,则需要建立N *(N-1)/2 个邻接关系。任何一台路由器的路由变化,都需要在网段中进行N*(N-1)/2 次的传递。这是没有必要的,也浪费了宝贵的带宽资源。为了解决这个问题,OSPF协议指定一台路由器DR(Designated Router)来负责传递信息。所有的路由器都只将路由信息发送给DR,再由DR将路由信息发送给本网段内的其他路由器。两台不是DR的路由器(DROther)之间不再建立邻接关系,也不再交换任何路由信息。这样在同一网段内的路由器之间只需建立N个邻接关系,每次路由变化只需进行2N 次的传递即可。
DR的产生过程:
哪台路由器会成为本网段内的DR并不是人为指定的,而是由本网段中所有的路由器共同选举出来的。DR的选举过程如下:
登记选民
本网段内的运行OSPF的路由器;
登记候选人
本网段内的Priority>0 的OSPF路由器;Priority 是接口上的参数,可以配置,缺省值是1;
竞选演说
一部分Priority>0 的OSPF路由器自己是DR;
投票
在所有自称是DR的路由器中选priority值最大的当选,若两台路由器的priority值相等,则选Router ID最大的当选。选票就是HELLO报文,每台路由器将自己选出的DR写入HELLO中,发给网段上的每台路由器;
稳定压倒一切
由于网段中的每台路由器都只和DR建立邻接关系。如果DR频繁的更迭,则每次都要重新引起本网段内的所有路由器与新的DR建立邻接关系。 这样会导致在短时间内网段中有大量的OSPF协议报文在传输,降低网络的可用带宽。所以协议中规定应该尽量的减少DR的变化。具体的处理方法是,每一台新加入的路由器并不急于参加选举,而是先考察一下本网段中是否已有DR存在。如果目前网段中已经存在DR,即使本路由器的priority比现有的DR还高,也不会再声称自己是DR了。而是承认现有的DR。
快速响应:
如果DR由于某种故障而失效,这时必须重新选举DR,并与之同步。这需要较长的时间,在这段时间内,路由计算是不正确的。为了能够缩短这个过程,OSPF提出了BDR(Backup Designated Router)的概念。BDR实际上是对DR的一个备份,在选举DR的同时也选举出BDR,BDR也和本网段内的所有路由器建立邻接关系并交换路由信息。当DR失效后,BDR会立即成为DR,由于不需要重新选举,并且邻接关系事先已建立,所以这个过程是非常短暂的。当然这时还需要重新选举出一个新的BDR,虽然一样需要较长的时间,但并不会影响路由计算。
注意:
1.网段中的DR并不一定是priority最大的路由器;同理,BDR也并不一定就是priority第二大的路由器。
2.DR是指某个网段中概念,是针对路由器的接口而言的。某台路由器在一个接口上可能是DR,在另一个接口上可能是BDR,或者是DROther。
3.只有在广播和NBMA类型的接口上才会选举DR,在point-to-point和point-to-muiltipoint类型的接口上不需要选举。
4.两台DROther路由器之间不进行路由信息的交换,但仍旧互相发送HELLO报文。他们之间的邻居状态机停留在2-Way状态。
1.9 NBMA和点到多点
NBMA(NonBroadcast MultiAccess)是指非广播多点可达的网络,比较典型的有X.25和Frame Relay。在这种网络中,为了减少路由信息的传递次数,需要选举DR,其他的路由器只与DR交换路由信息。
在上述描述中有一个缺省的条件:这个NBMA网络必须是全连通的(Full Meshed)。但这在实际情况中并不一定总能得到满足:例如一个X.25网络出于花费方面的考虑,并不一定在任何两台路由器之间都建立一条map;即使是一个全连通的网络,也可能由于故障导致某条map中断,使该网络变成不是全连通的。
在这种情况下会有什么问题呢?图二中是一个非全连通的X.25网络,但其中A、B、E三者是全连通的,假设E被选举为DR,其他为DROther(这里先不考虑BDR)。A、C、D三者也是全连通的,D是其中的DR。由于D、E之间不连通,所以DR的选举算法不能正确运行,D、E都坚持宣称自己是DR。对于A,则只能根据选举算法确定一个DR,假设是E,则A与E之间交换路由信息。A不承认D是DR,D无法与A交换路由信息,A,C之间也无法交换路由信息(两者都是DROther)。这样D、C就无法与网络中其他路由器交换路由信息。导致路由计算不正确。
由上述分析可知:错误产生的原因是因为在非全连通的网络中选举DR所至。为了解决这个问题,OSPF协议定义了一种新的网络类型:point-to-multipoint(点到多点)。点到多点与NBMA最本质的区别是:在点到多点的网络中不选举DR、BDR,即这种类型的网络中任意两台路由器之间都交换路由信息。在上面的图二中B、C可以通过A与网段中的其他路由器交换路由信息。一个NBMA的网络是否是全连通的需要网络管理人员去判断,如果不是,则需要更改配置,将网络的类型改为点到多点。
NBMA与点到多点之间的区别:
在OSPF协议中NBMA是指那些全连通的非广播多点可达网络。而点到多点的网络并不需要一定是全连通的。
在NBMA上需要选举DR、BDR,在点到多点上则不需要。
NBMA是一种缺省的网络类型,例如:如果链路层是X.25、Frame Relay等类型,则OSPF会缺省的认为该接口的网络类型是NBMA(不论该网络是否全连通,因为链路层无法判断出来)。而点到多点不是缺省的网络类型,没有哪种链路层协议会被认为是点到多点。点到多点必须是由其他的网络类型强制更改的。最常用的是将非全连通的NBMA改为点到多点。
NBMA用单播发送协议报文,需要手工配置邻居。点到多点是可选的,即可以用单播发送,又可以用多播发送报文。
1.10 区域划分
为什么需要划分区域?
随着网络规模日益扩大,网络中的路由器数量不断增加。当一个巨型网络中的路由器都运行OSPF路由协议时,就会遇到如下问题:
每台路由器都保留着整个网络中其他所有路由器生成的LSA,这些LSA的集合组成LSDB,路由器数量的增多会导致LSDB非常庞大,这会占用大量的存储空间。
LSDB的庞大会增加运行SPF算法的复杂度,导致CPU负担很重。
由于LSDB很大,两台路由器之间达到LSDB同步会需要很长时间。
网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“动荡”之中,为了同步这种变化,网络中会有大量的OSPF协议报文在传递,降低了网络的带宽利用率。更糟糕的是:每一次变化都会导致网络中所有的路由器重新进行路由计算。
解决上述问题的关键主要有两点:减少LSA的数量;屏蔽网络变化波及的范围。
OSPF 协议通过将自治系统划分成不同的区域(Area)来解决上述问题。区域是在逻辑上将路由器划分为不同的组。区域的边界是路由器,这样会有一些路由器属于不同的区域,(这样的路由器称作区域边界路由器——ABR),而一个网段只能属于一个区域。
划分成区域之后,给OSPF协议的处理带来了很大的变化。
每一个网段必须属于一个区域,或者说每个运行OSPF协议的接口必须指名属于某一个特定的区域,区域用区域号(Area ID)来标识。区域号是一个从0开始的32位整数。
不同的区域之间通过ABR来传递路由信息。
1.11 区域间路由计算
OSPF将自治系统划分为不同的区域后,路由计算方法也发生了很多变化:
只有同一个区域内的路由器之间会保持LSDB的同步,网络拓扑结构的变化首先在区域内更新。
区域之间的路由计算是通过ABR来完成的。ABR首先完成一个区域内的路由计算,然后查询路由表,为每一条OSPF路由生成一条Type3类型的LSA,内容主要包括该条路由的目的地址、掩码、花费等信息。然后将这些LSA发送到另一个区域中。
在另一个区域中的路由器根据每一条Type3的LSA生成一条路由,由于这些路由信息都是由ABR发布的,所以这些路由的下一跳都指向该ABR。
划分区域后的好处:
由于划分区域后ABR是根据本区域内的路由生成LSA,则可以根据IP地址的规律先将这些路由进行聚合后再生成LSA,这样做可以大大减少自治系统中LSA的数量。
划分区域之后,网络拓扑的变化首先在区域内进行同步,如果该变化影响到聚合之后的路由,则才会由ABR将该变化通知到其他区域。大部分的拓扑结构变化都会被屏蔽在区域之内了。
1.12 骨干区域与虚连接
为何需要骨干区域?
OSPF划分区域之后,并非所有的区域都是平等的关系。其中有一个区域是与众不同的,它的区域号(Area ID)是0,通常被称为骨干区域(Backbone Area)。
由于划分区域之后,区域之间是通过ABR将一个区域内的已计算出的路由封装成Type3类的LSA发送到另一个区域之中来传递路由信息。需要注意的是:此时的LSA中包含的已不再是链路状态信息,而是纯粹的路由信息了。或者说,此时的OSPF是基于D-V算法,而不是基于链路状态算法的了。这就涉及到一个很重要的问题:路由自环。因为D-V算法无法保证消除路由自环。如果无法解决这个问题,则区域概念的提出就是失败的。
通过分析D-V算法中路由环的产生的原因可知,自环的产生主要是因为生成该条路由信息的路由器没有加入生成者的信息,即每一条路由信息都无法知道最初是由谁所生成。OSPF协议在生成LSA时首先将自己的Router ID加入到LSA中,但是如果该路由信息传递超过两个区域后,就会丧失最初的生成者的信息。
解决的方法是:所有ABR将本区域内的路由信息封装成LSA后,统一的发送给一个特定的区域,再由该区域将这些信息转发给其他区域。在这个特定区域内,每一条LSA都确切的知道生成者信息。在其他区域内所有的到区域外的路由都会发送到这个特定区域中,所以就不会产生路由自环。这个“特定区域”就是骨干区域。由上面的分析可知:所有的区域必须和骨干区域相连,也就是说,每一个ABR连接的区域中至少有一个是骨干区域。而且骨干区域自身也必须是连通的。
虚连接:
由于网络的拓扑结构复杂,有时无法满足每个区域必须和骨干区域直接相连的要求,例如图中的Area 19。 为解决此问题,OSPF提出了虚连接的概念。虚连接是指在两台ABR之间,穿过一个非骨干区域(转换区域——transit Area),建立的一条逻辑上的连接通道。可以理解为两台ABR之间存在一个点对点的连接。“逻辑通道”是指两台ABR之间的多台运行OSPF的路由器只是起到一个转发报文的作用(由于协议报文的目的地址不是这些路由器,所以这些报文对于他们是透明的,只是当作普通的IP报文来转发),两台ABR之间直接传递路由信息。这里的路由信息是指由ABR生成的type3的LSA,区域内的路由器同步方式没有因此改变。
注意:
如果自治系统被划分成一个以上的区域,则必须有一个区域是骨干区域,并且保证其它区域与骨干区域直接相连或逻辑上相连,且骨干区域自身也必须是连通的。
1.13 与自治系统外部通讯
自治系统:
OSPF是自治系统内部路由协议,负责计算同一个自治系统内的路由。在这里“自治系统”是指彼此相连的运行OSPF路由协议的所有路由器的集合。对于OSPF来说,整个网络只有“自治系统内”和“自治系统外”之分。需要注意的是:“自治系统外”并不一定在物理上或拓扑结构中真正的位于自治系统的外部,而是指那些没有运行OSPF的路由器或者是某台运行OSPF协议的路由器中没有运行OSPF的接口。
ASBR(Autonomous System Boundary Router):
作为一个IGP,OSPF同样需要了解自治系统外部的路由信息,这些信息是通过ASBR(自治系统边界路由器)获得的,ASBR是那些将其他路由协议(也包括静态路由和接口的直接路由)发现的路由引入(redistribute)到OSPF中的路由器。同样需要注意的是:ASBR并不一定真的位于AS的边界,而是可以在自治系统中的任何位置。
计算自治系统外部路由:
ASBR为每一条引入的路由生成一条Type5类型的LSA,主要内容包括该条路由的目的地址、掩码和花费等信息。这些路由信息将在整个自治系统中传播(STUB AREA除外)。计算路由时先在最短路径树中找到ASBR的位置,然后将所有由该ASBR生成的Type5类型的LSA都当作叶子节点挂在ASBR的下面。以上的方法在区域内部是可行的,但是由于划分区域的原因,与该ASBR不处于同一个区域的路由器计算路由时无法知道ASBR的确切位置(该信息被ABR给过滤掉了,因为ABR是根据区域内的已生成的路由再生成Type3类型的LSA)。为了解决这个问题,协议规定如下:如果某个区域内有ASBR,则这个区域的ABR在向其他区域生成路由信息时必须单独为这个ASBR生成一条Type 4类型的LSA,内容主要包括这个ASBR的Router ID和到他所需的花费值。
路由分级管理:
OSPF将所引入的自治系统外部路由分成两类:type 1和type 2。第一类是指引入的是IGP路由(例如RIP,STATIC),由于这类路由的可信程度高一些,所以计算出的外部路由的花费与自治系统内部的路由花费的数量级是相同的,即到第一类外部路由的花费值 = 本路由器到相应的ASBR的花费值+ASBR到该路由目的地址的花费值。对于第二类外部路由是指引入的是BGP路由,由于这类路由的可信度比较低,所以OSPF协议认为从ASBR到自治系统之外的花费远远大于在自治系统之内到达ASBR的花费。所以计算路由花费时将主要考虑前者,即到第二类外部路由的花费值 = ASBR到该路由目的地址的花费值。如果该值相等,再考虑本路由器到相应的ASBR的花费值。如果加上前面所述的两种路由类型,OSPF一共将路由分为四级,按优先级从高到低排列:
区域内路由
区域间路由
自治系统外一类路由
自治系统外二类路由
其中前两种路由在路由表中的优先级是一样的,缺省值为10;后两种路由在路由表中的优先级是相同的,缺省值是150。
1.14 STUB区域与路由聚合
OSPF协议将整个自治系统划分成不同的区域。主要出于以下目的:减少路由信息在自治系统之中的传递;可以针对不同区域的拓扑特点采用不同的策略。
STUB区域
STUB区域是指那些不传播Type5类型(即引入的外部路由)的LSA的区域。在这些区域中路由器的路由表规模以及路由信息传递的数量都会大大减少。为了保证到自治系统外的路由依旧可达,由该区域的ABR生成一条缺省路由(0.0.0.0)传播到区域内,因为所有到自治系统外部的路由都必须通过ABR才能到达。STUB区域是一种可选的配置属性,但并不是每个区域都符合配置的条件。通常的,STUB区域位于自治系统的边界,是那些只有一个ABR的非骨干区域。或者该区域虽然有多个ABR,但这些ABR之间没有配置虚连接。图中的 Area 8 和 Area 19 符合配置成STUB区域的条件。
配置STUB区域的一些注意事项:
骨干区域不能配置成STUB区域,虚连接不能穿过STUB区域。
如果想将一个区域配置成STUB区域,则该区域中的所有路由器都必须都配置该属性。
STUB区域内不能存在ASBR,即自治系统外部路由不能引入到区域内,区域的自治系统外部路由也不能在本区域内传播和传递到区域外。
NSSA(Not-So-Stubby Area)区域:
STUB 区域虽然为合理的规划 OSPF 网络描绘了美好的前景,但她在实际的组网中又不具备可操作性,因为实际网络中不可能每台路由、每个接口都运行 OSPF 路由协议,STUB 区域必然需要存在 ASBR 路由器。
为此协议设计者提出了一种新的概念 NSSA,并且作为 OSPF 协议的一种扩展属性单独在RFC 1587中描述。
NSSA 需要完成如下任务:
1)自治系统外的 ASE 路由(自治系统外部路由)不可以进入到 NSSA 区域中,但是 NSSA 区域内的路由器引入的 ASE 路由可以在 NSSA 中传播并发送到区域之外。即:取消了 STUB 关于 ASE 的双向传播的限制(区域外的进不来,区域里的也出不去),改为单向限制(区域外的进不来,区域里的能出去)。
2)由于是作为 OSPF 标准协议的一种扩展属性,应尽量减少与不支持该属性的路由器协调工作时的冲突和兼容性问题。
为了解决ASE路由(自治系统外部路由)单向传递的问题,NSSA 中重新定义了一种LSA——Type 7类型的 LSA,作为区域内的路由器引入外部路由时使用,该类型的 LSA 除了类型标识与 Type 5 不相同之外,其它内容基本一样。这样区域内的路由器就可以通过 LSA 的类型来判断是否该路由来自本区域内。但由于Type 7类的 LSA 是新定义的,对于不支持 NSSA 属性的路由器无法识别,所以协议规定:在 NSSA 的 ABR 上将 NSSA 内部产生的Type 7类型的 LSA 转化为Type 5类型的 LSA 再发布出去,并同时更改 LSA 的发布者为 ABR 自己。这样 NSSA 区域外的路由器就可以完全不用支持该属性。
从上述描述可以看出:在 NSSA 区域内的所有路由器必须支持该属性(包括NSSA的ABR),而自治系统中的其他路由器则不需要。
由于NSSA是由STUB区域的概念改进得来,所以她的名字叫做: "not-so-stubby" area ,本意是:不是那么STUB的区域。
路由聚合:
自治系统被划分成不同的区域,其主要目的是为了减少路由信息及路由表的规模。这主要是通过区域间的路由聚合来实现。ABR在计算出一个区域的区域内路由之后,查询路由表,将其中每一条OSPF 路由封装成一条Type3类型的LSA发送到区域之外。例如图中Area 19 内有三条区域内路由19.1.1.0/24,19.1.2.0/24,19.1.3.0/24,正常情况下RTA应该将这三条路由生成三条Type3类型的LSA。如果此时配置了路由聚合,即将三条路由聚合成19.1.0.0/16一条,在RTA上就会只生成一条描述聚合后路由的LSA。需要注意的是:路由聚合只有在ABR上配置才会有效。
1.15 LSA分类
OSPF是基于链路状态算法的路由协议,所有对路由信息的描述都是封装在LSA中发送出去。LSA根据不同的用途分为不同的种类,目前使用最多的是以下五种LSA:
Router LSA(Type = 1):
是最基本的LSA类型,所有运行OSPF的路由器都会生成这种LSA。主要描述本路由器运行OSPF的接口的连接状况,花费等信息。对于ABR,它会为每个区域生成一条Router LSA。这种类型的LSA传递的范围是它所属的整个区域。
Netwrok LSA(Type = 2):
本类型的LSA由DR生成。对于广播和NBMA类型的网络,为了减少该网段中路由器之间交换报文的次数而提出了DR的概念。一个网段中有了DR之后不仅发送报文的方式有所改变,链路状态的描述也发生了变化。在DROther 和BDR的Router LSA中只描述到DR的连接,而DR则通过Network LSA来描述本网段中所有已经同其建立了邻接关系的路由器。(分别列出它们Router ID)。同样, 这种类型的LSA传递的范围是它所属的整个区域。
Network Summary LSA(Type = 3):
本类型的LSA由ABR生成。当ABR完成它所属一个区域中的区域内路由计算之后,查询路由表,将本区域内的每一条OSPF路由封装成 Network Summary LSA 发送到区域外。 LSA中描述了某条路由的目的地址、掩码、花费值等信息。这种类型的LSA传递的范围是ABR中除了该LSA生成区域之外的其他区域。
ASBR Summary LSA(Type = 4):
本类型的LSA同样是由ABR生成。内容主要是描述到达本区域内部的ASBR的路由。 这种LSA与Type3类型的LSA内容基本一样,只是Type4的LSA描述的目的地址是ASBR,是主机路由,所以掩码为0.0.0.0。这种类型的LSA传递的范围与Type3的LSA相同。
AS External LSA(Type = 5):
本类型的LSA由ASBR生成。主要描述了到自治系统外部路由的信息,LSA中包含某条路由的目的地址、掩码、花费值等信息。本类型的LSA是唯一一种与区域无关的LSA类型,它并不与某一个特定的区域相关。 这种类型的LSA传递的范围整个自治系统(STUB区域除外)。
1.16 接口分类及路由器分类
OSPF协议根据链路层封装协议不同分为以下四种网络类型:
Broadcast:当链路层协议是Ethernet时,OSPF缺省认为网络类型是Broadcast。在这种类型网络中, 以组播地址(224.0.0.5,224.0.0.6)发送协议报文,需要选举DR,BDR。
NBMA
当链路层协议是Frame Relay、X.25时,OSPF缺省认为网络类型是NBMA。在这种类型网络中, 以单播地址发送协议报文,必须手工配置邻居的IP地址,需要选举DR,BDR。
Point-to-Multipoint
没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型,通常由NBMA的类型手工修改而来,如果NBMA类型的网络不是全连通的。 在这种类型网络中,以组播地址(224.0.0.5)发送协议报文,不需要选举DR,BDR。
Point-to-Point
当链路层协议是PPP,HDLC,LAPB时,OSPF缺省认为网络类型是Point-to-Point。在这种类型网络中, 以组播地址(224.0.0.5)发送协议报文,不需要选举DR,BDR。
路由器根据在自治系统中的不同位置划分为以下四种类型:
IAR(Internal Area Router):
区域内路由器,是指该路由器的所有接口都属于同一个OSPF区域。这种路由器只生成一条Router LSA,只保存一个LSDB。
ABR(Area Border Router):
区域边界路由器,该路由器同时属于两个以上的区域(其中必须有一个是骨干区域,也就是区域0)。该路由器为每一个所属的区域生成一条Router LSA,为每一个所属的区域保存一个LSDB。并根据需要生成Network Summary LSA(Type = 3)和 ASBR Summary LSA(Type = 4)。
BBR (BackBone Router):
骨干路由器,是指该路由器属于骨干区域(也就是0 区域)。由定义可知,所有的ABR都是骨干路由器,所有的骨干区域内部的IAR也属于BBR。
ASBR(AS Boundary Router):
自治系统边界路由器,是指该路由器引入了其他路由协议(也包括静态路由和接口的直接路由)发现的路由。需要注意的是ASBR并不一定在拓扑结构中位于自治系统的边界。ASBR生成AS External LSA(Type = 5)。
一个运行OSPF协议的接口状态根据接口的不同类型可划分为以下四种:
DR、BDR、DROther:
当接口的类型为Broadcast、NBMA时,需要在网段内选举DR、BDR,根据选举的结果不同,接口的状态可能是以上三种中的一种。
Point-to-Point:
当接口的类型为Point-to-Point、Point-to-Multipoint时,不需要在网段内选举DR、BDR,此时接口的状态是Point-to-Point。
注意:
路由器的各种类型之间是可以“兼职”的(除了不能同时是IAR和ABR),例如:一台路由器可以同时是IAR、BBR、ASBR。而接口状态是指路由器的其中一个接口的状态,两者之间没有任何关系。
1.17 OSPF与路由自环
路由自环是指到某一个目的地址的路由在网络中形成了环路,一个最简单的例子:路由器A上有一条路由10.0.0.0/8下一跳是路由器B;而在路由器B的路由表中该路由的下一跳指向A;如果A收到一条到10.0.0.1的报文,它会转发给B,而B根据路由表又将该报文转发给A。于是该报文会在A、B之间不停的震荡,直至TTL=0才会将该报文丢弃,最坏的情况可能会震荡255次。路由自环对网络的危害是极大的,不仅导致路由不可达,而且浪费了大量的网络的带宽。路由自环是所有路由协议必须解决的问题,也是衡量一个路由协议好坏的重要标志。
D-V算法与路由自环:
D-V算法又称为“距离—向量”算法,其核心思想是网络中的每台路由器都将自己已知的路由表发送给相邻的路由器,每台路由器都会根据收到的所有路由确定最优路径的下一跳。这种算法(主要指RIP和IGPR所实现的D-V算法)的缺陷是:
每台路由器对接收到的路由的可信度完全依赖于相邻的路由器。而一台路由器只能保证自己本地路由的正确性(指本路由器的接口路由),而对由其他路由器发送来的路由则无法保证。
每一条路由信息中没有标明生成者的信息,该路由信息经过网络中多次传递之后,可能被传回给最初的生成者,而生成者无法知道该信息是否由自己所发布,这就为自环的产生埋下了隐患。
当网络拓扑结构发生变化时,一条已经无效的路由在未能彻底清除之前,可能仍旧在网络中传递,当它传递给该路由的生成者时,此时下一跳的计算可能会发生错误,导致路由自环的产生。
OSPF与路由自环:
OSPF是一种基于链路状态算法的协议,其核心思想是:每一台路由器将自己周边的链路状态(包括接口的直接路由、相连的路由器等信息)描述出来,发送给网络中所有的路由器。每台路由器在收到其他所有路由器的发送的链路状态信息之后,运行SPF算法计算路由。
OSPF计算出的路由不会有自环,主要有以下原因:
每台路由器描述的是自己能够确保正确的信息——自己周边的网络拓扑结构。并且在生成的LSA中标记了该信息的生成者——写入自己的Router ID。其他的路由器只负责在网络中传输该信息,而不会有任何的更改。这一点保证了无论网络的拓扑结构如何,无论路由器位于网络中的什么位置,都可以准确无误的接收到全网的拓扑结构图。
路由计算的算法是SPF算法。计算的结果是一棵树,路由是树上的叶子节点。从根节点到叶子节点是单向不可回复的路径。
当网络的拓扑结构发生变化时(此时最易产生路由自环),会有一台(或多台)路由器感知到这一变化,重新描述网络拓扑结构,并将其通知给其他路由器。每个路由器接收到更新信息后,都会立即重新运行SPF算法,得到新的路由。
OSPF真的没有路由自环吗?
上文中描述的是指没有划分区域时的情况,或者说是在同一区域内OSPF的运行情况。当OSPF划分为不同的区域之后,ABR通过将区域内已计算好的路由封装成Type3类型的LSA发送出去。需要特别注意的是:此时ABR只是单纯的对路由进行描述,而不是描述链路的状态了。或者说,此时的OSPF计算区域间路由时使用的是D-V算法。这时就可能会产生路由自环,OSPF通过骨干区域解决了这个问题(详情见“骨干区域与虚连接”)。
但是当OSPF引入自治系统外部路由时,ASBR封装在Type5类型的LSA中的同样是路由信息,而不是链路状态。这时也同样会产生路由自环。这一次OSPF没有采取任何措施来避免自环的生成,因为引入的自治系统外部路由其本身就是不可靠的。它可能来源于RIP等不可靠的路由,或者是配置错误的静态路由等等,可能这些路由本身就存在路由环。划分区域时区域内计算出的路由都是正确无误的,所以应极力避免由于划分区域而生成新的环路。而引入的外部路由由于其来源即不可靠,所以就没必要再进行其他的操作了。
“OSPF协议不会产生路由自环”这句话的严格定义应该是:OSPF协议生成的自治系统内部路由是无自环的,引入的自治系统外部路由则无法保证