OSPF
简介
OSPF多用于大型IPv4网络,是基于链路状态的路由协议,与基于距离矢量的路由协议相比具有更快的收敛速度,支撑的网络规模也更大。
定义
OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议。目前针对IPv4协议使用的是OSPF Version 2(RFC2328)。OSPF是不属于任何一个厂商或组织私有的路由协议,使用Dijkstra的最短路径(SPF)算法计算路由。在OSPF中引入了区域的概念,有效的减少了路由选择协议对路由器CPU和内存的占用,同时也降低了路由选择协议的通信量,使得构建大型层次化网络成为可能。
目的
随着网络中路由器数目的增加,Rip路由协议由于自身的一些问题,如路由自环、最大跳数限制等,难以为大型网络提供良好的支持。IETF组织(Internet Engineering Task Force)开发了OSPF路由协议,对大型网络的发展起到了重要的作用。
OSPF路由协议具有如下特性:
适应范围广——支持各种规模的网络,最多可支持几百台路由器。
快速收敛——在网络的拓扑结构发生变化后立即发送更新报文,使这一变化在自治系统中同步。
无自环——由于OSPF根据收集到的链路状态用最短路径树算法计算路由,从算法本身保证了不会生成自环路由。
区域划分——允许自治系统的网络被划分成区域来管理,路由器的链路状态数据库仅需和所在区域的其他路由器保持一致。链路状态数据库的减小大大降低了对路由器内存的占用和CPU的消耗。同时,需要在区域间传送的路由信息的减小,降低了网络带宽的占用。
路由分级——使用4类不同的路由,按优先顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。
等价路由——支持到同一目的地址的多条等价路由。
支持验证——支持基于区域和接口的报文验证,以保证报文交互的安全性。
组播发送——在某些类型的链路上以组播地址发送协议报文,减少对其他设备的干扰。
OSPF基本概念
介绍OSPF的基本概念,包括OSPF报文类型、路由器类型等内容。OSPF协议具有以下特点:
OSPF把自治系统划分成逻辑意义上的一个或多个区域。
OSPF通过LSA(Link State Advertisement)的形式发布链路状态。
OSPF依靠在OSPF区域内各路由器间交互OSPF报文来达到路由信息的统一。
OSPF报文封装在IP报文内,可以采用单播或组播的形式发送。
OSPF报文类型
表1 OSPF报文类型
报文类型 | 报文作用 |
---|---|
Hello报文 | 周期性发送,用来发现和维持OSPF邻居关系。 |
DD报文(Database Description packet) | 描述本地LSDB的摘要信息,用于两台路由器进行数据库同步。 |
LSR报文(Link State Request packet) | 用于向对方请求所需的LSA。路由器只有在OSPF邻居双方成功交换DD报文后才会向对方发出LSR报文。 |
LSU报文(Link State Update packet) | 用于向对方发送其所需要的LSA。 |
LSA类型
表2 OSPF LSA类型
LSA类型 | LSA作用 |
---|---|
Router-LSA(Type1) | 每个路由器都会产生,描述了路由器的链路状态和开销,在所属的区域内传播。 |
Network-LSA(Type2) | 由DR产生,描述本网段的链路状态,在所属的区域内传播。 |
Network-summary-LSA(Type3) | 由ABR产生,描述区域内所有的路由,并通告给其他相关区域。 |
ASBR-summary-LSA(Type4) | 由ABR产生,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。 |
AS-external-LSA(Type5) | 由ASBR产生,描述到AS外部的路由,通告到所有的区域(除了Stub区域和NSSA区域)。 |
NSSA LSA(Type7) | 由ASBR产生,描述到AS外部的路由,仅在NSSA区域内传播。 |
Opaque LSA(Type9/Type10/Type11) | Opaque LSA提供用于OSPF的扩展的通用机制。其中:Type9 LSA仅在接口所在网段范围内传播。用于支持GR的Grace LSA就是Type9 LSA的一种。Type10 LSA在区域内传播。用于支持TE的LSA就是Type10 LSA的一种。Type11 LSA在自治域内传播,目前还没有实际应用的例子。 |
路由器类型
OSPF协议中常用到的路由器类型如图1所示。
路由器类型 | 含义 |
---|---|
区域内路由器(Internal Router) | 该类路由器的所有接口都属于同一个OSPF区域。 |
区域边界路由器ABR(Area Border Router) | 该类路由器可以同时属于两个以上的区域,但其中一个必须是骨干区域。ABR用来连接骨干区域和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。 |
骨干路由器(Backbone Router) | 该类路由器至少有一个接口属于骨干区域。所有的ABR和位于Area0的内部路由器都是骨干路由器。 |
自治系统边界路由器ASBR(AS Boundary Router) | 与其他AS交换路由信息的路由器称为ASBR。ASBR并不一定位于AS的边界,它可能是区域内路由器,也可能是ABR。只要一台OSPF路由器引入了外部路由的信息,它就成为ASBR。 |
OSPF路由类型
AS区域内和区域间路由描述的是AS内部的网络结构,AS外部路由则描述了应该如何选择到AS以外目的地址的路由。OSPF将引入的AS外部路由分为Type1和Type2两类。表4中按优先级从高到低顺序列出了路由类型。
表4 OSPF路由类型
路由类型 | 含义 |
---|---|
Intra Area | 区域内路由。 |
Inter Area | 区域间路由。 |
第一类外部路由(Type1 External) | 这类路由的可信程度高一些,所以计算出的外部路由的开销与自治系统内部的路由开销是相当的,并且和OSPF自身路由的开销具有可比性。到第一类外部路由的开销=本路由器到相应的ASBR的开销+ASBR到该路由目的地址的开销。 |
第二类外部路由(Type2 External) | 这类路由的可信度比较低,所以OSPF协议认为从ASBR到自治系统之外的开销远远大于在自治系统之内到达ASBR的开销。所以,OSPF计算路由开销时只考虑ASBR到自治系统之外的开销,即到第二类外部路由的开销=ASBR到该路由目的地址的开销。 |
区域类型
表5 OSPF区域类型
区域类型 | 作用 |
---|---|
Common area | 缺省情况下,OSPF区域被定义为普通区域。普通区域包括标准区域和骨干区域。标准区域是最通用的区域,它传输区域内路由,区域间路由和外部路由。骨干区域是连接所有其他OSPF区域的中央区域。骨干区域通常用Area 0表示。 |
Totally Stub Area | 允许ABR发布的Type3缺省路由,不允许自治系统外部路由和区域间的路由。 |
Stub Area | 和Totally Stub区域的不同在于该区域允许区域间路由。 |
NSSA Area | 和Stub区域的不同在于该区域允许自治系统外部路由的引入,由ASBR发布Type 7 LSA通告给本区域。 |
Totally NSSA Area | 和NSSA区域的不同在于该区域不允许区域间路由。 |
OSPF支持的网络类型
OSPF根据链路层协议类型,将网络分为如表6所列四种类型。
表6 OSPF网络类型
网络类型 | 含义 |
---|---|
广播类型(Broadcast) | 当链路层协议是Ethernet、FDDI时,缺省情况下,OSPF认为网络类型是Broadcast。在该类型的网络中:通常以组播形式发送Hello报文、LSU报文和LSAck报文。其中,224.0.0.5的组播地址为OSPF路由器的预留IP组播地址;224.0.0.6的组播地址为OSPF DR的预留IP组播地址。以单播形式发送DD报文和LSR报文。 |
NBMA类型(Non-broadcast multiple access) | 当链路层协议是帧中继、ATM或X.25时,缺省情况下,OSPF认为网络类型是NBMA。在该类型的网络中,以单播形式发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。 |
点到多点P2M类型(Point-to-Multipoint) | 没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型。点到多点必须是由其他的网络类型强制更改的。常用做法是将非全连通的NBMA改为点到多点的网络。在该类型的网络中:以组播形式(224.0.0.5)发送Hello报文。以单播形式发送其他协议报文(DD报文、LSR报文、LSU报文、LSAck报文)。 |
点到点P2P类型(point-to-point) | 当链路层协议是PPP和LAPB时,缺省情况下,OSPF认为网络类型是P2P。在该类型的网络中,以组播形式(224.0.0.5)发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。 |
OSPF路由过滤
OSPF支持使用路由策略对路由信息进行过滤。缺省情况下,OSPF不进行路由过滤。
OSPF可以使用的路由策略包括route-policy,访问控制列表(access-list),地址前缀列表(prefix-list)。
OSPF路由过滤可以应用于以下几个方面:
路由引入
OSPF可以引入其它路由协议学习到的路由。在引入时可以通过配置路由策略来过滤路由,只引入满足条件的路由。
引入路由发布
OSPF引入了路由后会向其它邻居发布引入的路由信息。可以通过配置过滤规则来过滤向邻居发布的路由信息。该过滤规则只在ASBR上配置才有效(只有ASBR才能引入路由)。
路由学习
通过配置过滤规则,可以设置OSPF对接收到的区域内、区域间和自制系统外部的路由进行过滤。该过滤只作用于路由表项的添加与否,即只有通过过滤的路由才被添加到本地路由表中,但所有的路由仍可以在OSPF路由表中被发布出去。
区域间LSA学习
通过命令可以在ABR上配置对进入本区域的Summary LSA进行过滤。该配置只在ABR上有效(只有ABR才能发布Summary LSA)。
表7 区域间LSA学习与路由学习的差异
区域间LSA学习 | 路由学习 |
---|---|
直接对进入区域的LSA进行过滤。 | 路由学习中的过滤不对LSA进行过滤,只针对LSA计算出来的路由是否添加本地路由表进行过滤。学习到的LSA是完整的。 |
区域间LSA发布
通过命令可以在ABR上配置对本区域出方向的Summary LSA进行过滤。该配置只在ABR上配置有效。
OSPF路由引入限制
路由引入限制,是指OSPF在引入其它路由协议路由时,对引入路由的数量进行限制。
在实际应用中,由于操作不当等原因,可能将大量外部路由引入到OSPF中,导致网络拥塞。而且,网络中的低性能节点在引入大量路由的情况下,存在无法进行有效处理的风险。通过限制引入路由数量,可以消除潜在的风险,提高网络的稳定性。
由于外部路由被OSPF引入后会以5类或者7类LSA的形式发布,所以路由引入限制是通过限制LSDB中5类和7类LSA的数量实现的。其实现方式如下:
只对路由器本身产生的5类和7类LSA的总数量进行限制。
不限制缺省路由产生的LSA。这是因为,缺省路由可以匹配所有的目的地,这样做可以保留尽可能多的外部路由。
如果配置了外部路由聚合命令,则按聚合后生成的LSA进行限制。例如,10条外部路由聚合生成一条LSA时,数量按一条计算。
缺省情况下,不对路由引入进行限制。
随着引入路由和配置路由引入限制的具体操作不同,OSPF的处理流程也不同,如表8所示。
表8 OSPF路由引入限制
场景 | OSPF处理流程 |
---|---|
先配置路由引入限制,再引入外部路由 | 需要引入的路由数量小于配置的路由引入限制数量,则按正常引入流程处理。需要引入的路由数量大于配置的路由引入限制数量,则只生成最大限制数量路由的LSA。此时,LSDB里的5类和7类LSA的总数量等于配置的路由引入限制数量。 |
已经引入了外部路由,再配置路由引入限制 | 引入的路由数量小于配置的路由引入限制数量,则不做任何处理。引入的路由数量大于配置的路由引入限制数量,则先将已经引入的5类或7类LSA清除,再重新生成最大限制数量路由的LSA。 |
当需要再引入的路由数量已经大于配置的限制数量时 | 如果再引入新的路由,则不做引入处理。如果需要删除之前的路由,则有以下两种情况:之前引入过这些待删除的路由,则重新引入。之前并没有引入过这些待删除的路由,则忽略此路由。 |
需要引入的路由数量大于已经配置的限制数量,引入路由后,再重新配置引入限制 | 先将已经引入的Type5或Type7 LSA清除,再重新引入,然后根据引入的路由数量和配置的路由引入限制数量的大小关系进一步处理。 |
OSPF RFC1583兼容
RFC1583是OSPFv2协议比较早的版本。
OSPF在计算外部路由时,由于RFC2328和RFC1583的路由计算规则不一致,可能会导致路由环路。为了避免路由环路的发生,RFC2328中提出了RFC1583兼容特性。
启用RFC1583兼容后,OSPF采用RFC1583的路由计算规则。
不启用RFC1583兼容时,OSPF采用RFC2328的路由计算规则。
OSPF是根据5类LSA来计算外部路由的。RFC1583兼容特性主要用于路由器收到5类LSA后:
选择到达产生该LSA的ASBR或该LSA所描述的转发地址(Forwarding Address)的路径。
选择到达相同目的地的外部路径。
缺省情况下,OSPF兼容RFC1583。
表9中分别描述了启用和不启用RFC1583兼容特性时,外部路由计算的情况。
表9 启用和不启用RFC1583兼容特性的区别
启用RFC1583兼容的计算规则 | 不启用RFC1583兼容的计算规则 |
---|---|
优选cost值最小的路径。对于cost值相同的路径,选择关联区域号较大的路径。 | 优选非骨干区域的区域内路径。如果没有非骨干区域的区域内路径,则在骨干区域中的区域内路径和所有区域间路径中,优选cost值最小的路径。对于cost值相同的路径,选择关联区域号大的路径。 |
如图2所示,RouterA和RouterE为ASBR,同时引入到达外部网络Network1的路由,并发布Network1的5类LSA,cost值为2。RouterB使用RFC1583中规定的选路规则,RouterC使用RFC2328中规定的选路规则。
图2 OSPF RFC1583兼容特性
根据表9中所描述的路由计算规则,在计算到达外部网络Network1的路由时,RB会选择cost值最小的路径RouterB->RouterC->RouterD->RouterE->Network1,而RouterC则优先选择非骨干区域cost最小的区域内路径
RouterC->RouterB->RouterA->Network1。
这样,RouterB上去往Network1的下一跳为RouterC,而同样RouterC上去往Network1的下一跳为RouterB,导致路由环路。
在RouterC上启用RFC1583兼容后,RouterC选择到达Network1的路由时,会选择cost值最小的路径RouterC->RouterD->RouterE->Network1,这样,RouterC上去往Network1的下一跳不再是RouterB,从而避免了环路的产生。
OSPF洪泛策略控制
OSPF洪泛策略控制指的是,通过对特定的接口或邻居设置过滤规则,来过滤特定的LSA。缺省情况下,OSPF会在所有符合条件的接口下进行LSA洪泛。
OSPF洪泛策略控制具有以下优点:
当网络振荡时,可以减少LSA的洪泛,减少网络负担。
通过不向邻居发送无用的LSA,可以减少邻居LSDB的大小,提高网络收敛速度。当两台路由器之间存在多条链路时,可以在某些链路上过滤LSA的传送,减少不必要的重传,节省带宽资源。
可以用较少的资源实现路由器的特殊路由需求。
OSPF洪泛策略控制的主要应用有如下两种:
在广播、NBMA以及P2P网络中,需要对特定的接口配置洪泛策略来过滤LSA。
在P2MP网络中,需要对特定的邻居配置洪泛策略来过滤LSA。
OSPF路由计算过程
OSPF协议的路由计算过程可简单描述如下:
每台支持OSPF协议的路由器都维护着一份描述整个自治系统拓扑结构的链路状态数据库LSDB(Link State Database)。每台路由器根据自己周围的网络拓扑结构生成链路状态广播LSA(Link State Advertisement),通过相互之间发送协议报文将LSA发送给网络中其它路由器。这样每台路由器都收到了其它路由器的LSA,所有的LSA一起组成链路状态数据库。
由于LSA是对路由器周围网络拓扑结构的描述,那么LSDB则是对整个网络的拓扑结构的描述。路由器很容易将LSDB转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。显然,各台路由器得到的是一张完全相同的图。
每台路由器都使用SPF算法计算出一棵以自己为根的最短路径树,这棵树给出了到自治系统中各节点的路由,外部路由信息为叶子节点,外部路由可由广播它的路由器进行标记以记录关于自治系统的额外信息。显然,各台路由器各自得到的路由表是不同的。
OSPF基本原理
介绍OSPF的基本原理,包括邻居状态机、邻居关系建立以及路由计算等。OSPF协议路由的计算过程可简单描述如下:
1.建立邻接关系,过程如下:
a.本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
b.两端设备进行主/从关系协商和DD报文交换。
c.两端设备通过更新LSA完成链路数据库LSDB的同步。
此时,邻接关系建立成功。
2.路由计算
OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。
OSPF邻居状态机
在OSPF网络中,为了交换路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念:
邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
邻接关系:形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。
邻居和邻接状态是通过OSPF状态机表现的,OSPF共有8种邻居状态机,分别是Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full,如图1所示。Down、2-way、Full是稳定状态,Attempt、Init、Exstart、Exchange、Loading是不稳定状态。不稳定状态是在转换过程中瞬间存在的状态,一般不会超过几分钟。
状态机 | 含义 |
---|---|
Down | 邻居会话的初始阶段。表明没有在邻居失效时间间隔内收到来自邻居设备的Hello报文。 |
Attempt | 处于本状态时,定期向手工配置的邻居发送Hello报文。 说明: Attempt状态只适用于NBMA类型的接口。 |
Init | 本状态表示已经收到了邻居的Hello报文,但是对端并没有收到本端发送的Hello报文。 |
2-way | 互为邻居。本状态表示双方互相收到了对端发送的Hello报文,建立了邻居关系。如果不形成邻接关系则邻居状态机就停留在此状态,否则进入Exstart状态。 |
Exstart | 协商主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。 |