OSPF详解.docx
《OSPF详解.docx》由会员分享,可在线阅读,更多相关《OSPF详解.docx(11页珍藏版)》请在冰豆网上搜索。
![OSPF详解.docx](https://file1.bdocx.com/fileroot1/2023-1/24/2e8d9791-3445-4587-aeba-906bf9b628a2/2e8d9791-3445-4587-aeba-906bf9b628a21.gif)
OSPF详解
OSPF详解
ospf-openshortestpathfirst,开放最短路径优先协议,是一种基于链路状态的路由协议。
ospf与rip存在的本质区别是:
rip是基于距离矢量算法的路由协议,而ospf是基于链路状态算法的路由协议。
使用rip协议的网络容易产生路由自环而使用ospf的网络却不会存在路由自环,这是为什么呢?
1、经过分析,rip产生路由自环的根本原因是路由器之间传递的路由信息中不携带该信息的创建者,而ospf协议传递的LSA中包含信息的创建者的标识,这有助于消除路由自环。
2、ospf使用spf算法,每个路由器都根据相同的LSDB按照spf算法,生成到达整个网络的最短路径树,而这个路径树是单向的,所以ospf在算法上就保证了没有路由自环。
3、ospf使用触发更新机制,只要路由出现了变化,发现该变化的路由器会立即的把更新信息(updateLSA)发送到整个网络,这使ospf协议收敛很快,不容易产生路由自环。
使用距离矢量路由协议的路由器之间传递的信息是实实在在的路由信息,而使用链路状态路由协议的路由器之间传递的信息是网络上各个交换机的自己周边的网络拓扑。
(ospf域间传递的是实实在在的路由信息)
由于rip的收敛速度慢,所以他不适于大规模的网络,因此rip路由的最大跳数是15,如果一条路由的跳数达到了16,那么认为该路由是无效的。
而ospf由于他的收敛速度快,所以适合大规模的网络,最多可支持几百台路由器。
ospf支持变长子网掩码,因为ospf发送的路由描述中包含掩码信息。
ospf可以进行区域划分,主要是为了减少路由器的负荷以及占用的网络带宽。
ospf支持等值路由,即到达同一个目的地可以同时使用多条路由。
ospf支持基于接口的报文验证以保证路由计算的安全。
ospf可以使用组播发送协议报文,减少对其他网络设备的干扰。
rip通过udp广播路由信息。
OSPF划分区域主要出于以下几点考虑:
1、每台路由器都保留着整个网络中其他所有路由器生成的LSA,这些LSA的集
合组成LSDB,路由器数量的增多会导致LSDB非常庞大,这会占用大量的存
储空间。
2、LSDB的庞大会增加运行SPF算法的复杂度,导致CPU负担很重。
3、由于LSDB很大,两台路由器之间达到LSDB同步会需要很长时间。
4、网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“动
荡”之中,为了同步这种变化,网络中会有大量的OSPF协议报文在传递,
降低了网络的带宽利用率。
更糟糕的是:
每一次变化都会导致网络中所有的
路由器重新进行路由计算。
划分成区域之后,给OSPF协议的处理带来了很大的变化。
1、每一个网段必须属于一个区域,或者说每个运行OSPF协议的接口必须指名
属于某一个特定的区域,区域用区域号(AreaID)来标识。
区域号是一个
从0开始的32位整数。
2、不同的区域之间通过ABR来传递路由信息。
3、只有一个区域内的路由器会保持LSDB同步
4、区域之间的路由计算由ABR完成
5、外部路由计算由ASBR完成
6、由于划分区域后ABR是根据本区域内的路由生成LSA,则可以根据IP地址的
规律先将这些路由进行聚合后再生成LSA,这样做可以大大减少自治系统中
LSA的数量。
下文中会讲到路由聚合的概念。
7、划分区域之后,网络拓扑的变化首先在区域内进行同步,如果该变化影响到
聚合之后的路由,则才会由ABR将该变化通知到其他区域。
大部分的拓扑结
构变化都会被屏蔽在区域之内了。
减少了网络震荡。
那么ABR如何计算区域间路由呢?
ABR会首先查找一个区域内的路由表,然后为每一条表项生成一条Type3类型的LSA,内容主要包括该条路由的目的地址、掩码、花费等信息。
然后将这些LSA发送到另一个区域中。
在另一个区域中的路由器根据每一条Type3的LSA生成一条路由,由于这些
路由信息都是由ABR发布的,所以这些路由的下一跳都指向该ABR。
(这里有个疑问,难道一个区域内的所有路由器都要和ABR直接相连吗?
要不然这些路由的下一跳怎么能都指向ABR呢?
请大家帮忙啊!
个人觉得这里应该是翻译错误了,有可能是区域间路由必须通过ABR才能到达的意思,翻译太烂了。
应该改为“所以这些区域间路由都要经过ABR”。
)
需要注意的是:
此时的LSA中包含的已不再是链路状态信息,而是纯粹的路由信息了。
或者说,此时的OSPF是基于D-V算法,而不是基于链路状态算法的了。
这就涉及到一个很重要的问题:
路由自环。
因为D-V算法无法保证消除路由自环。
如果无法解决这个问题,则区域概念的提出就是失败的。
于是提出了骨干区域的概念,所有的区域必须和骨干区域相连(直接相连或者通过虚连接相连),所有的区域间路由必须通过骨干区域。
这里不对骨干区域做详细介绍,我了解的也不多:
)
总结一下:
Type=3的networksummaryLSA中包含目的地址和通告路由器(就是ABR),收到该消息的路由器会知道,如果要去目的地,必须经过该ABR。
另外区域之间路由有一个路由聚合的概念,什么是路由聚合呢?
ABR在计算出一个区域的区域内路由之后,查询路由表,将其中每一条OSPF路由封装成一条Type3类型的LSA发送到区域之外。
例如一个区域内有三条区域内路由19.1.1.0/24,19.1.2.0/24,19.1.3.0/24,正常情况下ABR应该将这三条路由生成三条Type3类型的LSA。
如果此时配置了路由聚合,即将三条路由聚合成19.1.0.0/16一条,在ABR上就会只生成一条描述聚合后路由的LSA。
需要注意的是:
路由聚合只有在ABR上配置才会有效。
ASBR又如何处理外部路由呢?
ASBR为每一条引入的路由生成一条Type5类型的LSA,主要内容包括该条路由的
目的地址、掩码和花费等信息。
这些路由信息将在整个自治系统中传播(STUB
AREA除外)。
计算路由时先在最短路径树中找到ASBR的位置,然后将所有由
该ASBR生成的Type5类型的LSA都当作叶子节点挂在ASBR的下面。
以上的方法
在区域内部是可行的,但是由于划分区域的原因,与该ASBR不处于同一个区域
的路由器计算路由时无法知道ASBR的确切位置(该信息被ABR给过滤掉了,因
为ABR是根据区域内的已生成的路由再生成Type3类型的LSA)。
为了解决这个
问题,协议规定如下:
如果某个区域内有ASBR,则这个区域的ABR在向其他区
域生成路由信息时必须单独为这个ASBR生成一条Type4类型的LSA,内容主要
包括这个ASBR的RouterID和到他所需的花费值。
(这里也有一个疑问:
为什么必须单独为ASBR生成一条Type4类型的LSA?
请指教啊!
没太看懂:
))
答:
ASBR告诉域内的路由器,所有外部路由都要经过自己,而ABR则通过Type=4的ASBRsummaryLSA告诉域内的路由器,如何到达该ASBR。
Type4路由用来指明Type-5发布者在哪个ABR下面,用于SPF计算。
因为Type-5中发布者是ASBR,因此其他路由器可能不知道这个ASBR在SPF树中的位置。
STUB区域
为了进一步减少区域内路由信息的传递数量,ospf提出了STUP区域的概念。
STUB区域是指那些不传播Type5类型(即引入的外部路由)的LSA的区域。
在这
些区域中路由器的路由表规模以及路由信息传递的数量都会大大减少。
为了保
证到自治系统外的路由依旧可达,由该区域的ABR生成一条缺省路由(0.0.0.0)
传播到区域内,因为所有到自治系统外部的路由都必须通过ABR才能到达。
(意思就是ABR生成一条默认路由信息发布到域内,域内的路由器会根据该信息生成默认路由,使所有在路由表中找不到的目的都通过ABR到达)
STUB区域是一种可选的配置属性,但并不是每个区域都符合配置的条件。
通常
的,STUB区域位于自治系统的边界,是那些只有一个ABR的非骨干区域。
或者
该区域虽然有多个ABR,但这些ABR之间没有配置虚连接。
配置STUB区域的一些注意事项:
1、骨干区域不能配置成STUB区域,虚连接不能穿过STUB区域。
2、如果想将一个区域配置成STUB区域,则该区域中的所有路由器都必须都配
置该属性。
3、STUB区域不能存在ASBR,就是不能引入外部路由
STUB区域(末梢区域):
外部路由不允许被传播到该区域,由ABR生成一条缺省路由发送到域内。
TotallySTUB区域(完全末梢区域):
不仅外部路由不允许别传播到该区域,而且域间路由也被禁止。
由ABR生成一条缺省路由发送到域内。
NotTotallySTUB——NSSA(非完全末梢区域):
该区域内可以存在ASBR来引入外部路由,并保留其他STUB区域的特征,就是说其他域引入的外部路由还是不能被传播到该区域(生成默认路由),允许传播域间路由。
NSSAASBR生成Type=7的LSA,通过外部路由,在NSSA区域内flooding,在ABR被阻塞。
NSSAType=7的LSA头部有一个p标志位,NSSAASBR可以设置或清除他。
如果NSSAABR收到p=1的Type=7LSA报文,会把Type=7LSA转换成Type=5,并flooding到其他区域;如果NSSAABR收到p=0的Type=7LSA报文,那么该报文不能通告到其他区域内。
还有一个完全NSSA,与NSSA的区别是,他不允许在该区域中引入rip路由,并且不允许引入域间路由。
概述
OSPF路由协议是一种典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。
在这里,路由域是指一个自治系统(AutonomousSystem),即AS,它是指一组通过统一的路由政策或路由协议互相交换路由信息的网络。
在这个AS中,所有的OSPF路由器都维护一个相同的描述这个AS结构的数据库,该数据库中存放的是路由域中相应链路的状态信息,OSPF路由器正是通过这个数据库计算出其OSPF路由表的。
作为一种链路状态的路由协议,OSPF将链路状态广播数据包LSA(LinkStateAdvertisement)传送给在某一区域内的所有路由器,这一点与距离矢量路由协议不同。
运行距离矢量路由协议的路由器是将部分或全部的路由表传递给与其相邻的路由器。
数据包格式
在OSPF路由协议的数据包中,其数据包头长为24个字节,包含如下8个字段:
*Versionnumber-定义所采用的OSPF路由协议的版本。
*Type-定义OSPF数据包类型。
OSPF数据包共有五种:
*Hello-用于建立和维护相邻的两个OSPF路由器的关系,该数据包是周期性地发送的。
*DatabaseDescription-用于描述整个数据库,该数据包仅在OSPF初始化时发送。
*Linkstaterequest-用于向相邻的OSPF路由器请求部分或全部的数据,这种数据包是在当路由器发现其数据已经过期时才发送的。
*Linkstateupdate-这是对linkstate请求数据包的响应,即通常所说的LSA数据包。
*Linkstateacknowledgment-是对LSA数据包的响应。
*Packetlength-定义整个数据包的长度。
*RouterID-用于描述数据包的源地址,以IP地址来表示。
*AreaID-用于区分OSPF数据包属于的区域号,所有的OSPF数据包都属于一个特定的OSPF区域。
*Checksum-校验位,用于标记数据包在传递时有无误码。
*Authenticationtype-定义OSPF验证类型。
*Authentication-包含OSPF验证信息,长为8个字节。
OSPF基本算法
SPF算法及最短路径树
SPF算法是OSPF路由协议的基础。
SPF算法有时也被称为Dijkstra算法,这是因为最短路径优先算法SPF是Dijkstra发明的。
SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离,每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图,该结构图类似于一棵树,在SPF算法中,被称为最短路径树。
在OSPF路由协议中,最短路径树的树干长度,即OSPF路由器至每一个目的地路由器的距离,称为OSPF的Cost,其算法为:
Cost=100×106/链路带宽
在这里,链路带宽以bps来表示。
也就是说,OSPF的Cost与链路的带宽成反比,带宽越高,Cost越小,表示OSPF到目的地的距离越近。
举例来说,FDDI或快速以太网的Cost为1,2M串行链路的Cost为48,10M以太网的Cost为10等。
链路状态算法
作为一种典型的链路状态的路由协议,OSPF还得遵循链路状态路由协议的统一算法。
链路状态的算法非常简单,在这里将链路状态算法概括为以下四个步骤:
1、 当路由器初始化或当网络结构发生变化(例如增减路由器,链路状态发生变化等)时,路由器会产生链路状态广播数据包LSA(Link-StateAdvertisement),该数据包里包含路由器上所有相连链路,也即为所有端口的状态信息。
2、 所有路由器会通过一种被称为刷新(Flooding)的方法来交换链路状态数据。
Flooding是指路由器将其LSA数据包传送给所有与其相邻的OSPF路由器,相邻路由器根据其接收到的链路状态信息更新自己的数据库,并将该链路状态信息转送给与其相邻的路由器,直至稳定的一个过程。
3、当网络重新稳定下来,也可以说OSPF路由协议收敛下来时,所有的路由器会根据其各自的链路状态信息数据库计算出各自的路由表。
该路由表中包含路由器到每一个可到达目的地的Cost以及到达该目的地所要转发的下一个路由器(next-hop)。
4、第4个步骤实际上是指OSPF路由协议的一个特性。
当网络状态比较稳定时,网络中传递的链路状态信息是比较少的,或者可以说,当网络稳定时,网络中是比较安静的。
这也正是链路状态路由协议区别与距离矢量路由协议的一大特点。
OSPF路由协议的基本特征
前文已经说明了OSPF路由协议是一种链路状态的路由协议,为了更好地说明OSPF路由协议的基本特征,我们将OSPF路由协议与距离矢量路由协议之一的RIP(RoutingInformationProtocol)作一比较,归纳为如下几点:
*RIP路由协议中用于表示目的网络远近的唯一参数为跳(HOP),也即到达目的网络所要经过的路由器个数。
在RIP路由协议中,该参数被限制为最大15,也就是说RIP路由信息最多能传递至第16个路由器;对于OSPF路由协议,路由表中表示目的网络的参数为Cost,该参数为一虚拟值,与网络中链路的带宽等相关,也就是说OSPF路由信息不受物理跳数的限制。
并且,OSPF路由协议还支持TOS(TypeofService)路由,因此,OSPF比较适合应用于大型网络中。
*RIP路由协议不支持变长子网屏蔽码(VLSM),这被认为是RIP路由协议不适用于大型网络的又一重要原因。
采用变长子网屏蔽码可以在最大限度上节约IP地址。
OSPF路由协议对VLSM有良好的支持性。
*RIP路由协议路由收敛较慢。
RIP路由协议周期性地将整个路由表作为路由信息广播至网络中,该广播周期为30秒。
在一个较为大型的网络中,RIP协议会产生很大的广播信息,占用较多的网络带宽资源;并且由于RIP协议30秒的广播周期,影响了RIP路由协议的收敛,甚至出现不收敛的现象。
而OSPF是一种链路状态的路由协议,当网络比较稳定时,网络中的路由信息是比较少的,并且其广播也不是周期性的,因此OSPF路由协议即使是在大型网络中也能够较快地收敛。
*在RIP协议中,网络是一个平面的概念,并无区域及边界等的定义。
随着无级路由CIDR概念的出现,RIP协议就明显落伍了。
在OSPF路由协议中,一个网络,或者说是一个路由域可以划分为很多个区域area,每一个区域通过OSPF边界路由器相连,区域间可以通过路由总结(Summary)来减少路由信息,减小路由表,提高路由器的运算速度。
一个典型的OSPF网络结构可以参见附图二
*OSPF路由协议支持路由验证,只有互相通过路由验证的路由器之间才能交换路由信息。
并且OSPF可以对不同的区域定义不同的验证方式,提高网络的安全性。
*OSPF路由协议对负载分担的支持性能较好。
OSPF路由协议支持多条Cost相同的链路上的负载分担,目前一些厂家的路由器支持6条链路的负载分担。
区域及域间路由
前文已经提到过,在OSPF路由协议的定义中,可以将一个路由域或者一个自治系统AS划分为几个区域。
在OSPF中,由按照一定的OSPF路由法则组合在一起的一组网络或路由器的集合称为区域(AREA)。
在OSPF路由协议中,每一个区域中的路由器都按照该区域中定义的链路状态算法来计算网络拓扑结构,这意味着每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。
对于每一个区域,其网络拓扑结构在区域外是不可见的,同样,在每一个区域中的路由器对其域外的其余网络结构也不了解。
这意味着OSPF路由域中的网络链路状态数据广播被区域的边界挡住了,这样做有利于减少网络中链路状态数据包在全网范围内的广播,也是OSPF将其路由域或一个AS划分成很多个区域的重要原因。
随着区域概念的引入,意味着不再是在同一个AS内的所有路由器都有一个相同的链路状态数据库,而是路由器具有与其相连的每一个区域的链路状态信息,即该区域的结构数据库,当一个路由器与多个区域相连时,我们称之为区域边界路由器。
一个区域边界路由器有自身相连的所有区域的网络结构数据。
在同一个区域中的两个路由器有着对该区域相同的结构数据库。
我们可以根据IP数据包的目的地地址及源地址将OSPF路由域中的路由分成两类,当目的地与源地址处于同一个区域中时,称为区域内路由,当目的地与源地址处于不同的区域甚至处于不同的AS时,我们称之为域间路由。
OSPF的骨干区域及虚拟链路(Virtual-link)
在OSPF路由协议中存在一个骨干区域(Backbone),该区域包括属于这个区域的网络及相应的路由器,骨干区域必须是连续的,同时也要求其余区域必须与骨干区域直接相连。
骨干区域一般为区域0,其主要工作是在其余区域间传递路由信息。
所有的区域,包括骨干区域之间的网络结构情况是互不可见的,当一个区域的路由信息对外广播时,其路由信息是先传递至区域0(骨干区域),再由区域0将该路由信息向其余区域作广播。
骨干区域与其余区域的关系可以以附图三来说明。
在实际网络中,可能会存在backbone不连续的或者某一个区域与骨干区域物理不相连的情况,在这两种情况下,系统管理员可以通过设置虚拟链路的方法来解决。
虚拟链路是设置在两个路由器之间,这两个路由器都有一个端口与同一个非骨干区域相连。
虚拟链路被认为是属于骨干区域的,在OSPF路由协议看来,虚拟链路两端的两个路由器被一个点对点的链路连在一起。
在OSPF路由协议中,通过虚拟链路的路由信息是作为域内路由来看待的。
下面我们分两种情况来说明虚拟链路在OSPF路由协议中的作用。
1.当一个区域与area0没有物理链路相连时
前文已经提到,一个骨干区域Area0必须位于所有区域的中心,其余所有区域必须与骨干区域直接相连。
但是,也存在一个区域无法与骨干区域建立物理链路的可能性,在这种情况下,我们可以采用虚拟链路。
虚拟链路使该区域与骨干区域间建立一个逻辑联接点,该虚拟链路必须建立在两个区域边界路由器之间,并且其中一个区域边界路由器必须属于骨干区域。
这种虚拟链路可以以下图来说明。
在上图所示的例子中,区域1与区域0并无物理相连链路,我们可以在路由器A及路由器B之间建立虚拟链路,这样,将区域2作为一个穿透网络(Transit-network),路由器B作为接入点,区域1就与区域0建立了逻辑联接。
2.当骨干区域不连续时
OSPF路由协议要求骨干区域area0必须是连续的,但是,骨干区域也会出现不连续的情况,例如,当我们想把两个OSPF路由域混合到一起,并且想要使用一个骨干区域时,或者当某些路由器出现故障引起骨干区域不连续的情况,在这些情况下,我们可以采用虚拟链路将两个不连续的区域0连接到一起。
这时,虚拟链路的两端必须是两个区域0的边界路由器,并且这两个路由器必须都有处于同一个区域的端口,以下图为例:
在上图的例子中,穿过区域1的虚拟链路将两个分为两半的骨干区域连接到一起,路由器A与B之间的路由信息作为OSPF域内路由来处理。
另外,当一个非骨干区域的区域分裂成两半时,不能采用虚拟链路的方法来解决。
当出现这种情况时,分裂出的其中一个区域将被其余的区域作为域间路由来处理。
残域(Stubarea)
在OSPF路由协议的链路状态数据库中,可以包括AS外部链路状态信息,这些信息会通过flooding传递到AS内的所有OSPF路由器上。
但是,在OSPF路由协议中存在这样一种区域,我们把它称为残域(stubarea),AS外部信息不允许广播进/出这个区域。
对于残域来说,访问AS外部的数据只能根据默认路由(default-route)来寻址。
这样做有利于减小残域内部路由器上的链路状态数据库的大小及存储器的使用,提高路由器计算路由表的速度。
当一个OSPF的区域只存在一个区域出口点时,我们可以将该区域配置成一个残域,在这时,该区域的边界路由器会对域内广播默认路由信息。
需要注意的是,一个残域中的所有路由器都必须知道自身属于该残域,否则残域的设置没有作用。
另外,针对残域还有两点需要注意:
一是残域中不允许存在虚拟链路;二是残域中不允许存在AS边界路由器。
OSPF协议路由器及链路状态数据包分类
OSPF路由器分类
当一个AS划分成几个OSPF区域时,根据一个路由器在相应的区域之内的作用,可以将OSPF路由器作如下分类:
内部路由器:
当一个OSPF路由器上所有直联的链路都处于同一个区域时,我们称这种路由器为内部路由器。
内部路由器上仅仅运行其所属区域的OSPF运算法则。
区域边界路由器:
当一个路由器与多个区域相连时,我们称之为区域边界路由器。
区域边界路由器运行与其相连的所有区域定义的OSPF运算法则,具有相连的每一个区域的网络结构数据,并且了解如何将该区域的链路状态信息广播至骨干区域,再由骨干区域转发至其余区域。
区域间的路由如何计算
为了解决上述问题,我们人为的把网络划分成若干个组群区域,但仅仅是划分了区域还是不够的,因为我们要清楚区域间的路由是如何处理的。
在划分区域后,一个区域内的路由处理是同没有划分区域之前是一样的。
每一个区域中的路由器都按照该区域中定义的链路状态算法来计算网络拓扑结构,这意味着每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。
对于每一个区域,其网络拓扑结构在区域外是不可见的,同样,在每一个区域中的路由器对其域外的其余网络结构也不了解。
当进行跨区域进行路由计算的时候区域边界路由器发生了一些变化。
如下图所示:
由于中间的路由器分数两个不同的区域,一个接口属于区域0另一个接口属于区域3。
接在区域0中的每台路由器生成自己的LSA(生成的是RouterLSA第二种LSA)传递给ABR,这种RouterLSA在区域边界路由器被阻断,不能够传到区域3。
同理区域3中生成的RouterLSA也在区域边界路由器被阻断,不能传递