OSPF路由协议.docx
《OSPF路由协议.docx》由会员分享,可在线阅读,更多相关《OSPF路由协议.docx(26页珍藏版)》请在冰豆网上搜索。
![OSPF路由协议.docx](https://file1.bdocx.com/fileroot1/2022-12/30/df4e00b6-995d-460a-a5ee-407f3344fdc3/df4e00b6-995d-460a-a5ee-407f3344fdc31.gif)
OSPF路由协议
课程DA000010
OSPF路由协议
ISSUE1.0
目录
课程说明1
课程介绍1
课程目标1
第1章OSPF路由协议2
1.1OSPF协议原理2
1.2OSPF基本概念4
1.3链路状态5
1.4计算路由7
1.5OSPF的协议报文9
1.6OSPF的邻居状态机11
1.7链路状态数据库的同步过程13
1.8DR和BDR16
1.9NBMA和点到多点19
1.10区域划分21
1.11区域间路由计算23
1.12骨干区域与虚连接24
1.13与自治系统外部通讯26
1.14STUB区域与路由聚合28
1.15LSA分类30
1.16接口分类及路由器分类32
1.17OSPF与路由自环34
课程说明
课程介绍
本课程主要介绍OSPF协议原理,OSPF是OpenShortestPathFirst(即“开放最短路由优先协议”)的缩写。
OSPF是IETF(InternetEngineeringTaskForce)组织开发的一个基于链路状态的自治系统内部路由协议,是目前使用最为广泛的内部网关路由协议。
课程目标
完成本课程的学习后,您应该能够:
(正文,F2)
●掌握OSPF路由协议的基本原理(ItemList,F3)
●掌握OSPF的区域划分
●掌握OSPF路由协议的规划
●掌握OSPF路由协议的基本排错
第1章OSPF路由协议
1.1OSPF协议原理
OSPF是OpenShortestPathFirst(即“开放最短路由优先协议”)的缩写。
它是IETF(InternetEngineeringTaskForce)组织开发的一个基于链路状态的自治系统内部路由协议。
在IP网络上,它通过收集和传递自治系统的链路状态来动态地发现并传播路由。
当前OSPF协议使用的是第二版,最新的RFC是2328。
OSPF协议具有如下特点:
适应范围:
OSPF支持各种规模的网络,最多可支持几百台路由器。
快速收敛:
如果网络的拓扑结构发生变化,OSPF立即发送更新报文,使这一变化在自治系统中同步。
无自环:
由于OSPF通过收集到的链路状态用最短路径树算法计算路由,故从算法本身保证了不会生成自环路由。
子网掩码:
由于OSPF在描述路由时携带网段的掩码信息,所以OSPF协议不受自然掩码的限制,对VLSM提供很好的支持。
区域划分:
OSPF协议允许自治系统的网络被划分成区域来管理,区域间传送的路由信息被进一步抽象,从而减少了占用网络的带宽。
等值路由:
OSPF支持到同一目的地址的多条等值路由。
路由分级:
OSPF使用4类不同的路由,按优先顺序来说分别是:
区域内路由、区域间路由、第一类外部路由、第二类外部路由。
支持验证:
它支持基于接口的报文验证以保证路由计算的安全性。
组播发送:
OSPF在有组播发送能力的链路层上以组播地址发送协议报文,即达到了广播的作用,又最大程度的减少了对其他网络设备的干扰。
1.2
OSPF基本概念
1.RouterID
OSPF协议使用一个被称为RouterID的32位无符号整数来唯一标识一台路由器。
基于这个目的,每一台运行OSPF的路由器都需要一个RouterID。
这个RouterID一般需要手工配置,一般将其配置为该路由器的某个接口的IP地址。
由于IP地址是唯一的,所以这样就很容易保证RouterID的唯一性。
在没有手工配置RouterID的情况下,一些厂家的路由器(包括Quidway系列)支持自动从当前所有接口的IP地址自动选举一个IP地址作为RouterID。
2.协议号
OSPF协议用IP报文直接封装协议报文,协议号是89。
1.3
链路状态
OSPF协议计算路由是以本路由器周边网络的拓扑结构为基础的。
每台路由器将自己周边的网络拓扑描述出来,传递给其他所有的路由器。
OSPF将不同的网络拓扑抽象为以下四种类型:
•该接口所连的网段中只有本路由器自己。
(stubnetworks)
•该接口通过点到点的网络与一台路由器相连。
(point-to-point)
•该接口通过广播或NBMA的网络与多台路由器相连。
(broadcastorNBMAnetworks)
•该接口通过点到多点的网络与多台路由器相连。
(point-to-multipoint)
NBMA与点到多点的区别:
在OSPF协议中NBMA和点到多点都是指非广播多点可达的网络,但NBMA网络必须满足全连通(fullmeshed)的要求,即任意两点都可以不经转发而使报文直达对端。
否则,我们称该网络是点到多点网络。
如上图所示:
RTA作为网络中的一台路由器,其周围的链路状态情况可归纳为以下四种:
●通过PPP协议与另一台路由器RTB直接相连;
●通过一个X.25网络与RTC和RTD相连(该网络是全连通的);
●通过一个FrameRelay网络与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报文(HelloPacket):
最常用的一种报文,周期性的发送给本路由器的邻居。
内容包括一些定时器的数值,DR,BDR,以及自己已知的邻居。
DD报文(DatabaseDescriptionPacket):
两台路由器进行数据库同步时,用DD报文来描述自己的LSDB,内容包括LSDB中每一条LSA的摘要(摘要是指LSA的HEAD,通过该HEAD可以唯一标识一条LSA)。
这样做是为了减少路由器之间传递信息的量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分,根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。
LSR报文(LinkStateRequestPacket):
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的或是对端更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。
内容包括所需要的LSA的摘要。
LSU报文(LinkStateUpdatePacket):
用来向对端路由器发送所需要的LSA,内容是多条LSA(全部内容)的集合。
LSAck报文(LinkStateAcknowledgmentPacket)
用来对接收到的LSU报文进行确认。
内容是需要确认的LSA的HEAD(一个报文可对多个LSA进行确认)。
1.6
OSPF的邻居状态机
Down:
邻居状态机的初始状态,是指在过去的Dead-Interval时间内没有收到对方的Hello报文。
Attempt:
只适用于NBMA类型的接口,处于本状态时,定期向那些手工配置的邻居发送HELLO报文。
Init:
本状态表示已经收到了邻居的HELLO报文,但是该报文中列出的邻居中没有包含我的RouterID(对方并没有收到我发的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的Routerid,表示已收到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的RouterID较大,所以在报文中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发送LSRequest报文向RT2请求所需要的LSA。
RT2用LSUpdate报文来回应RT1的请求。
RT1收到之后,需要发送LSAck报文来确认。
上述过程持续到RT1中的LSA与RT2的LSA完全同步为止。
此时RT1将RT2的邻居状态机改为Full状态。
注意:
以上过程是两台路由器由相互没有发现对方的存在到建立邻接关系的过程。
或者可以理解为网络中新加入一台路由器时的处理情况。
当两台路由器之间的状态机都已经达到Full状态之后,如果此时网络中再有路由变化时,就无须重复以上的所有步骤。
只由一方发送LSUpdate报文通知需要更新的内容,另一方发送LSAck报文予以回应即可。
双方的邻居状态机在此过程中不再发生变化。
1.8
DR和BDR
DR的概念:
在广播和NBMA类型的网络上,任意两台路由器之间都需要传递路由信息(flood),如果网络中有N台路由器,则需要建立N*(N-1)/2个邻接关系。
任何一台路由器的路由变化,都需要在网段中进行N*(N-1)/2次的传递。
这是没有必要的,也浪费了宝贵的带宽资源。
为了解决这个问题,OSPF协议指定一台路由器DR(DesignatedRouter)来负责传递信息。
所有的路由器都只将路由信息发送给DR,再由DR将路由信息发送给本网段内的其他路由器。
两台不是DR的路由器(DROther)之间不再建立邻接关系,也不再交换任何路由信息。
这样在同一网段内的路由器之间只需建立N个邻接关系,每次路由变化只需进行2N次的传递即可。
DR的产生过程:
哪台路由器会成为本网段内的DR并不是人为指定的,而是由本网段中所有的路由器共同选举出来的。
DR的选举过程如下:
•登记选民
本网段内的运行OSPF的路由器;
•登记候选人
本网段内的Priority>0的OSPF路由器;Priority是接口上的参数,可以配置,缺省值是1;
•竞选演说
一部分Priority>0的OSPF路由器自己是DR;
•投票
在所有自称是DR的路由器中选priority值最大的当选,若两台路由器的priority值相等,则选RouterID最大的当选。
选票就是HELLO报文,每台路由器将自己选出的DR写入HELLO中,发给网段上的每台路由器;
稳定压倒一切
由于网段中的每台路由器都只和DR建立邻接关系。
如果DR频繁的更迭,则每次都要重新引起本网段内的所有路由器与新的DR建立邻接关系。
这样会导致在短时间内网段中有大量的OSPF协议报文在传输,降低网络的可用带宽。
所以协议中规定应该尽量的减少DR的变化。
具体的处理方法是,每一台新加入的路由器并不急于参加选举,而是先考察一下本网段中是否已有DR存在。
如果目前网段中已经存在DR,即使本路由器的priority比现有的DR还高,也不会再声称自己是DR了。
而是承认现有的DR。
快速响应:
如果DR由于某种故障而失效,这时必须重新选举DR,并与之同步。
这需要较长的时间,在这段时间内,路由计算是不正确的。
为了能够缩短这个过程,OSPF提出了BDR(BackupDesignatedRouter)的概念。
BDR实际上是对DR的一个备份,在选举DR的同时也选举出BDR,BDR也和本网段内的所有路由器建立邻接关系并交换路由信息。
当DR失效后,BDR会立即成为DR,由于不需要重新选举,并且邻接关系事先已建立,所以这个过程是非常短暂的。
当然这时还需要重新选举出一个新的BDR,虽然一样需要较长的时间,但并不会影响路由计算。
注意:
3.网段中的DR并不一定是priority最大的路由器;同理,BDR也并不一定就是priority第二大的路由器。
4.DR是指某个网段中概念,是针对路由器的接口而言的。
某台路由器在一个接口上可能是DR,在另一个接口上可能是BDR,或者是DROther。
5.只有在广播和NBMA类型的接口上才会选举DR,在point-to-point和point-to-muiltipoint类型的接口上不需要选举。
6.两台DROther路由器之间不进行路由信息的交换,但仍旧互相发送HELLO报文。
他们之间的邻居状态机停留在2-Way状态。
1.9
NBMA和点到多点
NBMA(NonBroadcastMultiAccess)是指非广播多点可达的网络,比较典型的有X.25和FrameRelay。
在这种网络中,为了减少路由信息的传递次数,需要选举DR,其他的路由器只与DR交换路由信息。
在上述描述中有一个缺省的条件:
这个NBMA网络必须是全连通的(FullMeshed)。
但这在实际情况中并不一定总能得到满足:
例如一个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、FrameRelay等类型,则OSPF会缺省的认为该接口的网络类型是NBMA(不论该网络是否全连通,因为链路层无法判断出来)。
而点到多点不是缺省的网络类型,没有哪种链路层协议会被认为是点到多点。
点到多点必须是由其他的网络类型强制更改的。
最常用的是将非全连通的NBMA改为点到多点。
•NBMA用单播发送协议报文,需要手工配置邻居。
点到多点是可选的,即可以用单播发送,又可以用多播发送报文。
1.10
区域划分
为什么需要划分区域?
随着网络规模日益扩大,网络中的路由器数量不断增加。
当一个巨型网络中的路由器都运行OSPF路由协议时,就会遇到如下问题:
•每台路由器都保留着整个网络中其他所有路由器生成的LSA,这些LSA的集合组成LSDB,路由器数量的增多会导致LSDB非常庞大,这会占用大量的存储空间。
•LSDB的庞大会增加运行SPF算法的复杂度,导致CPU负担很重。
•由于LSDB很大,两台路由器之间达到LSDB同步会需要很长时间。
•网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“动荡”之中,为了同步这种变化,网络中会有大量的OSPF协议报文在传递,降低了网络的带宽利用率。
更糟糕的是:
每一次变化都会导致网络中所有的路由器重新进行路由计算。
解决上述问题的关键主要有两点:
减少LSA的数量;屏蔽网络变化波及的范围。
OSPF协议通过将自治系统划分成不同的区域(Area)来解决上述问题。
区域是在逻辑上将路由器划分为不同的组。
区域的边界是路由器,这样会有一些路由器属于不同的区域,(这样的路由器称作区域边界路由器——ABR),而一个网段只能属于一个区域。
划分成区域之后,给OSPF协议的处理带来了很大的变化。
•每一个网段必须属于一个区域,或者说每个运行OSPF协议的接口必须指名属于某一个特定的区域,区域用区域号(AreaID)来标识。
区域号是一个从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划分区域之后,并非所有的区域都是平等的关系。
其中有一个区域是与众不同的,它的区域号(AreaID)是0,通常被称为骨干区域(BackboneArea)。
由于划分区域之后,区域之间是通过ABR将一个区域内的已计算出的路由封装成Type3类的LSA发送到另一个区域之中来传递路由信息。
需要注意的是:
此时的LSA中包含的已不再是链路状态信息,而是纯粹的路由信息了。
或者说,此时的OSPF是基于D-V算法,而不是基于链路状态算法的了。
这就涉及到一个很重要的问题:
路由自环。
因为D-V算法无法保证消除路由自环。
如果无法解决这个问题,则区域概念的提出就是失败的。
通过分析D-V算法中路由环的产生的原因可知,自环的产生主要是因为生成该条路由信息的路由器没有加入生成者的信息,即每一条路由信息都无法知道最初是由谁所生成。
OSPF协议在生成LSA时首先将自己的RouterID加入到LSA中,但是如果该