OSPF路由协议.docx
《OSPF路由协议.docx》由会员分享,可在线阅读,更多相关《OSPF路由协议.docx(28页珍藏版)》请在冰豆网上搜索。
OSPF路由协议
组播扩展OSPF
目录
OSPF简介3
OSPF起源3
术语与协议4
网络类型10
常见原因13
区域对比13
泛洪与区域14
两种类型16
OSPF度量值17
OSPF简介
OSPF(OpenShortestPathFirst开放式最短路径优先)是一个内部网关协议(InteriorGatewayProtocol,简称IGP),用于在单一自治系统(autonomoussystem,AS)内决策路由。
是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。
著名的迪杰斯特拉(Dijkstra)算法被用来计算最短路径树。
与RIP相比,OSPF是链路状态协议,而RIP是距离矢量协议。
不同厂商管理距离不同,思科OSPF的协议管理距离(AD)是110,
华为OSPF的协议管理距离是10。
OSPF起源
IETF为了满足建造越来越大基于IP网络的需要,形成了一个工作组,专门用于开发开放式的链路状态路由协议,以便用在大型、异构的IP网络中。
新的路由协议已经取得一些成功的一系列私人的、和生产商相关的、最短路径优先(SPF)路由协议为基础,在市场上广泛使用。
包括OSPF在内,所有的SPF路由协议基于一个数学算法—Dijkstra算法。
这个算法能使路由选择基于链路状态,而不是距离向量。
OSPF由IETF在20世纪80年代末期开发,OSPF是SPF类路由协议中的开放式版本。
最初的OSPF规范体如今RFC1131中。
这个第1版(OSPF版本1)很快被进行了重大改进的版本所代替,这个新版本体如今RFC1247文档中。
RFC1247OSPF称为OSPF版本2是为了明确指出其在稳定性和功能性方面的实质性改进。
这个OSPF版本有许多更新文档,每一个更新都是对开放标准的精心改进。
接下来的一些规范出如今RFC1583、2178和2328中。
OSPF版本2的最新版体如今RFC2328中。
最新版只会和由RFC2138、1583和1247所规范的版本进行互操作。
链路是路由器接口的另一种说法,因此OSPF也称为接口状态路由协议。
OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库,生成最短路径树,每个OSPF路由器使用这些最短路径构造路由表。
OSPF路由协议是一种典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。
在这里,路由域是指一个自治系统(AutonomousSystem),即AS,它是指一组通过统一的路由政策或路由协议互相交换路由信息的网络。
在这个AS中,所有的OSPF路由器都维护一个相同的描述这个AS结构的数据库,该数据库中存放的是路由域中相应链路的状态信息,OSPF路由器正是通过这个数据库计算出其OSPF路由表的。
作为一种链路状态的路由协议,OSPF将链路状态组播数据LSA(LinkStateAdvertisement)传送给在某一区域内的所有路由器,这一点与距离矢量路由协议不同。
运行距离矢量路由协议的路由器是将部分或全部的路由表传递给与其相邻的路由器。
术语与协议
OSPF术语
Router-ID
假设这个世界上的人名字是没有重复的,每个人的名字都不相同,当有一天,遇上个陌生人告诉你,有任何麻烦可以找他,他一定能够帮你解决;等到你有麻烦的时候,你想找那个人帮忙,可是如果你连那个人的名字都不知道,那么也就不可能找到那个人帮忙了。
OSPF就类似于上述情况,网络中每台OSPF路由器都相当于一个人,OSPF路由器之间相互通告链路状态,就等于是告诉别人可以帮别人的忙,如此一来,如果路由器之间分不清谁是谁,没有办法确定各自的身份,那么通告的链路状态就是毫无意义的,所以必须给每一个OSPF路由器定义一个身份,就相当于人的名字,这就是Router-ID,并且Router-ID在网络中绝对不可以有重名,否则路由器收到的链路状态,就无法确定发起者的身份,也就无法通过链路状态信息确定网络位置,OSPF路由器发出的链路状态都会写上自己的Router-ID,可以理解为该链路状态的签名,不同路由器产生的链路状态,签名绝不会相同。
每一台OSPF路由器只有一个Router-ID,Router-ID使用IP地址的形式来表示,确定Router-ID的方法为:
★1.手工指定Router-ID。
★2.路由器上活动Loopback接口中IP地址最大的,也就是数字最大的,如C类地址优先于B类地址,一个非活动的接口的IP地址是不能被选为Router-ID的。
★3.如果没有活动的Loopback接口,则选择活动物理接口IP地址最大的。
注:
如果一台路由器收到一条链路状态,无法到达该Router-ID的位置,就无法到达链路状态中的目标网络。
Router-ID只在OSPF启动时计算,或者重置OSPF进程后计算。
COST
OSPF使用接口的带宽来计算Metric,例如一个10Mbit/s的接口,计算Cost的方法为:
将10Mbit换算成bit,为10000000bit,然后用100000000除以该带宽,结果为100000000/10000000bit=10,所以一个10Mbit/s的接口,OSPF认为该接口的Metric值为10,需要注意的是,计算中,带宽的单位取bit/s,而不是Kbit/s,例如一个100Mbit/s的接口,Cost值为100000000/100000000=1,因为Cost值必须为整数,所以即使是一个1000Mbit/s(1GBbit/s)的接口,Cost值和100Mbit/s一样,为1。
如果路由器要经过两个接口才能到达目标网络,那么很显然,两个接口的Cost值要累加起来,才算是到达目标网络的Metric值,所以OSPF路由器计算到达目标网络的Metric值,必须将沿途中所有接口的Cost值累加起来,在累加时,同EIGRP一样,只计算出接口,不计算进接口。
OSPF会自动计算接口上的Cost值,但也可以通过手工指定该接口的Cost值,手工指定的优先于自动计算的值。
OSPF计算的Cost,同样是和接口带宽成反比,带宽越高,Cost值越小。
到达目标相同Cost值的路径,可以执行负载均衡,最多6条链路同时执行负载均衡。
链路(Link)
就是路由器上的接口,在这里,应该指运行在OSPF进程下的接口。
链路状态(Link-State)
链路状态(LSA)就是OSPF接口上的描述信息,例如接口上的IP地址,子网掩码,网络类型,Cost值等等,OSPF路由器之间交换的并不是路由表,而是链路状态(LSA),OSPF通过获得网络中所有的链路状态信息,从而计算出到达每个目标精确的网络路径。
OSPF路由器会将自己所有的链路状态毫不保留地全部发给邻居,邻居将收到的链路状态全部放入链路状态数据库(Link-StateDatabase),邻居再发给自己的所有邻居,并且在传递过程中,绝对不会有任何更改。
通过这样的过程,最终,网络中所有的OSPF路由器都拥有网络中所有的链路状态,并且所有路由器的链路状态应该能描绘出相同的网络拓朴。
比如如今要计算一条地铁线路图,如上海地铁二号线某段的图,如果不直接将该图给别人看,图好比是路由表,如今只是报给别人各个站的信息,该信息好比是链路状态,通过告诉别人各个站左边一站是什么,右边一站是什么,别人也能通过该信息(链路状态),画出完整的线路图(路由表),如得到如下各站信息(链路状态):
★南京东路-站(左边一站是人民广场,右边一站是陆家嘴)
★南京西路-站(左边一站是静安寺,右边一站是人民广场)
★静安寺-站(右边一站是南京西路)
★人民广场-站(左边一站是南京西路,右边一站是南京东路)
★陆家嘴-站(左边一站是南京东路)
还原线路图(路由表)如下:
根据分析以下两站信息(两条链路状态):
★南京西路-站(左边一站是静安寺,右边一站是人民广场)
★静安寺-站(右边一站是南京西路)
计算因为静安寺右边是南京西路,而南京西路左边是静安寺,所以静安寺和南京西路是相邻的,为静安寺—南京西路,并且由于南京西路右边是人民广场,所以通过这两条信息,得出线路为静安寺—南京西路—人民广场,继续往下
再根据如下两站信息(链路状态):
★人民广场-站(左边一站是南京西路,右边一站是南京东路)
★南京东路-站(左边一站是人民广场,右边一站是陆家嘴)
计算因为之前南京西路右边是人民广场,人民广场左边是南京西路,所以南京西路和人民广场是相邻的两站,并且人民广场右边是南京东路,得出线路为南京西路—人民广场—南京东路,并且因为南京东路右边是陆家嘴,所以这部分线路得知为南京西路—人民广场—南京东路—陆家嘴,继续往下
再根据如下一站信息(链路状态):
★陆家嘴-站(左边一站是南京东路)
计算因为南京东路右边是陆家嘴,而陆家嘴左边是南京东路,所以两站相邻,得出为南京东路—陆家嘴,
通过以上各部分的线路:
静安寺—南京西路—人民广场
南京西路—人民广场—南京东路—陆家嘴
南京东路—陆家嘴
所以很轻松的就画出该段地铁线路图为:
静安寺—南京西路—人民广场—南京东路—陆家嘴
从以上计算过程可以知道,因为得到各站的信息,就能画出整条线路图,而OSPF也同样根据路由器各接口的信息(链路状态),计算出网络拓朴图,OSPF之间交换链路状态,就像上面交换各站信息,而不像RIP和EIGRP直接交换路由表,交换路由表,就等于直接给人看线路图,可见OSPF的智能算法,比距离矢量协议对网络有更精确的认知。
OSPF区域
因为OSPF路由器之间会将所有的链路状态(LSA)相互交换,毫不保留,当网络规模达到一定程度时,LSA将形成一个庞大的数据库,势必会给OSPF计算带来巨大的压力;为了能够降低OSPF计算的复杂程度,缓存计算压力,OSPF采用分区域计算,将网络中所有OSPF路由器划分成不同的区域,每个区域负责各自区域精确的LSA传递与路由计算,然后再将一个区域的LSA简化和汇总之后转发到另外一个区域,这样一来,在区域内部,拥有网络精确的LSA,而在不同区域,则传递简化的LSA。
区域的划分为了能够尽量设计成无环网络,所以采用了Hub-Spoke的拓朴架构,也就是采用核心与分支的拓朴,如下图:
区域的命名可以采用整数数字,如1、2、3、4,也可以采用IP地址的形式,0.0.0.1、0.0.0.2,因为采用了Hub-Spoke的架构,所以必须定义出一个核心,然后其它部分都与核心相连,OSPF的区域0就是所有区域的核心,称为BackBone区域(骨干区域),而其它区域称为Normal区域(常规区域),在理论上,所有的常规区域应该直接和骨干区域相连,常规区域只能和骨干区域交换LSA,常规区域与常规区域之间即使直连也无法互换LSA,如上图中Area1、Area2、Area3、Area4只能和Area0互换LSA,然后再由Area0转发,Area0就像是一个中转站,两个常规区域需要交换LSA,只能先交给Area0,再由Area0转发,而常规区域之间无法互相转发。
OSPF区域是基于路由器的接口划分的,而不是基于整台路由器划分的,一台路由器可以属于单个区域,也可以属于多个区域,如下图:
如果一台OSPF路由器属于单个区域,即该路由器所有接口都属于同一个区域,那么这台路由器称为InternalRouter(IR),如上图中的R2,R3和R4;如果一台OSPF路由器属于多个区域,即该路由器的接口不都属于一个区域,那么这台路由器称为AreaBorderRouter(ABR),如上图中的R1,ABR可以将一个区域的LSA汇总后转发至另一个区域;如果一台OSPF路由器将外部路由协议重分布进OSPF,那么这台路由器称为AutonomousSystemBoundaryRouter(ASBR),如上图中,R5将EIGRP重分布进OSPF,那么R5就是ASBR,但是如果只是将OSPF重分布进其它路由协议,则不能称为ASBR。
可以配置任何OSPF路由器成为ABR或ASBR。
由于OSPF有着多种区域,所以OSPF的路由在路由表中也以多种形式存在,共分以下几种:
如果是同区域的路由,叫做Intra-AreaRoute,在路由表中使用O来表示;
如果是不同区域的路由,叫做Inter-AreaRoute或SummaryRoute,在路由表中使用OIA来表示;
如果并非OSPF的路由,或者是不同OSPF进程的路由,只是被重分布到OSPF的,叫做ExternalRoute,在路由表中使用OE2或OE1来表示。
当存在多种路由可以到达同一目的地时,OSPF将根据先后顺序来选择要使用的路由,所有路由的先后顺序为:
Intra-Area—Inter-Area—ExternalE1—ExternalE2,即O—OIA—OE1—OE2。
注:
★一台路由器可以运行多个OSPF进程,不同进程的OSPF,可视为没有任何关系,如需要获得相互的路由信息,需要重分布。
★每个OSPF进程可以有多个区域,而路由器的链路状态数据库是分进程和分区域存放的。
邻居(Neighbor)
OSPF只有邻居之间才会交换LSA,路由器会将链路状态数据库中所有的内容毫不保留地发给所有邻居,要想在OSPF路由器之间交换LSA,必须先形成OSPF邻居,OSPF邻居靠发送Hello包来建立和维护,Hello包会在启动了OSPF的接口上周期性发送,在不同的网络中,发送Hello包的间隔也会不同,当超过4倍的Hello时间,也就是Dead时间过后还没有收到邻居的Hello包,邻居关系将被断开。
两台OSPF路由器必须满足4个条件,才能形成OSPF邻居,4个必备条件如下:
Area-id(区域号码)
即路由器之间必须配置在相同的OSPF区域,否则无法形成邻居。
HelloandDeadInterval(Hello时间与Dead时间)
即路由器之间的Hello时间和Dead时间必须一致,否则无法形成邻居。
Authentication(认证)
路由器之间必须配置相同的认证密码,如果密码不同,则无法形成邻居。
StubAreaFlag(末节标签)
路由器之间的末节标签必须一致,即处在相同的末节区域内,否则无法形成邻居。
注:
★OSPF只能使用接口的Primary地址建立邻居,不能使用Secondary建立邻居。
★路由器双方接口要么都为手工配置地址(Numbered),要么都为借用地址(Unnumbered),否则无法建立邻居。
邻接(Adjacency)
两台OSPF路由器能够形成邻居,但并不一定能相互交换LSA,只要能交换LSA,关系则称为邻接(Adjacency)。
邻居之间只交换Hello包,而邻接(Adjacency)之间不仅交换Hello包,还要交换LSA。
DR/BDR
当多台OSPF路由器连到同一个多路访问网段时,如果每两台路由器之间都相互交换LSA,那么该网段将充满着众多LSA条目,为了能够尽量减少LSA的传播数量,通过在多路访问网段中选择出一个核心路由器,称为DR(DesignatedRouter),网段中所有的OSPF路由器都和DR互换LSA,这样一来,DR就会拥有所有的LSA,并且将所有的LSA转发给每一台路由器;DR就像是该网段的LSA中转站,所有的路由器都与该中转站互换LSA,如果DR失效后,那么就会造成LSA的丢失与不完整,所以在多路访问网络中除了选举出DR之外,还会选举出一台路由器作为DR的备份,称为BDR(BackupDesignatedRouter),BDR在DR不可用时,代替DR的工作,而既不是DR,也不是BDR的路由器称为Drother,事实上,Dother除了和DR互换LSA之外,同时还会和BDR互换LSA,如下图:
上图中R1被选为DR,R2被选为BDR,而R3和R4为Drother,R3同时和R1与R2互换LSA,R4也同时和R1与R2互换LSA,但R3与R4却不能互换LSA。
其实不难看出,DR与BDR并没有任何本质与功能的区别,只有在多路访问的网络环境,才需要DR和BDR,DR与BDR的选举是在一个二层网段内选举的,即在多个路由器互连的接口范围内,与OSPF区域没有任何关系,一个区域可能有多个多路访问网段,那么就会存在多个DR和BDR,但一个多路访问网段,只能有一个DR和BDR;选举DR和BDR的规则为:
★比较接口优先级
选举优先级最高的成为DR,优先级数字越大,表示优先级越高,被选为DR的几率就越大,次优先级的为BDR,优先级范围是0-255,默认为1,优先级为0表示没有资格选举DR和BDR。
★Route-Id大小
如果在优先级都相同的情况下,Route-Id最大的成为DR,其次是BDR,数字越大,被选为DR的几率就越大。
因为所有路由器都能与DR和BDR互换LSA,所以所有路由器都与DR和BDR是邻接(Adjacency)关系,而Drother与Drother之间无法互换LSA,所以Drother与Drother之间只是邻居关系。
在一个多路访问网络中,选举DR和BDR是有时间限制的,该时间为Wait时间,默认为4倍的Hello时间,即与Dead时间相同,如果OSPF路由器在超过Wait时间后也没有其它路由器与自己竞争DR与BDR的选举,那么就选自己为DR;当一个多路访问网络中选举出DR与BDR之后,在DR与BDR没有失效的情况下,不会进行重新选举,也就是在选举出DR与BDR之后,即使有更高优先级的路由器加入网络,也不会影响DR与BDR的角色,在越出选举时间(Wait时间)后,只有DR与BDR失效后,才会重新选举。
DR失效后,会同时重新选举DR与BDR,而在BDR失效后,只会重新选举BDR。
DR和BDR与Drother的数据包处理会有所不同,
所有OSPF路由器,包括DR与BDR,都能够接收和传递目标地址为224.0.0.5的数据包。
只有DR和BDR才能接收和传递目标地址为224.0.0.6的数据包。
由此可见,Drother路由器将数据包发向目标地址224.0.0.6,只能被DR和BDR接收,其它Drother不能接收;而DR和BDR将数据包发向目标地址224.0.0.5,可以被所有路由器接收。
协议
一、Hello协议的目的:
用于发现邻居
在成为邻居之前,必须对Hello包里的一些参数进行协商
Hello包在邻居之间扮演着keepalive的角色
允许邻居之间的双向通信
用于在NBMA(NonbroadcastMulti-access)、广播网络(以太网)中选举DR和BDR
二、HelloPacket包含以下信息:
源路由器的RID
源路由器的AreaID
源路由器接口的掩码
源路由器接口的认证类型和认证信息
源路由器接口的Hello包发送的时间间隔
源路由器接口的无效时间间隔
优先级
DR/BDR接口IP地址
五个标记位(flagbit)
源路由器的所有邻居的RID
网络类型
OSPF定义的5种网络类型:
1.点到点网络(point-to-point),由cisco提出的网络类型,自动发现邻居,不选举DR/BDR,hello时间10s。
1.1点到点网络,比如T1线路,是连接单独的一对路由器的网络,点到点网络上的有效邻居总是可以形成邻接关系的,在这种网络上,OSPF包的目标地址使用的是224.0.0.5,这个组播地址称为AllSPFRouters.
2.广播型网络(broadcast),由cisco提出的网络类型,自动发现邻居,选举DR/BDR,hello时间10s。
2.1广播型网络,比如以太网,TokenRing和FDDI,这样的网络上会选举一个DR和BDR,DR/BDR的发送的OSPF包的目标地址为224.0.0.5,运载这些OSPF包的帧的目标MAC地址为0100.5E00.0005;而除了DR/BDR以外发送的OSPF包的目标地址为224.0.0.6,这个地址叫AllDRouters.
3.非广播型(NBMA)网络(non-broadcast),由RFC提出的网络类型,手工配置邻居,选举DR/BDR,hello时间30s。
3.1.NBMA网络,比如X.25,FrameRelay,和ATM,不具备广播的能力,因此邻居要人工来指定,在这样的网络上要选举DR和BDR,OSPF包采用unicast的方式
4.点到多点网络(point-to-multipoint),由RFC提出,自动发现邻居,不选举DR/BDR,hello时间30s。
4.1点到多点网络是NBMA网络的一个特殊配置,可以看成是点到点链路的集合.在这样的网络上不选举DR和BDR.
5.点到多点非广播,由cisco提出的网络类型,手动配置邻居,不选举DR/BDR,hello时间30s。
6.虚链接:
OSPF包是以unicast的方式发送
所有的网络也可以归纳成2种网络类型:
1.传输网络(TransitNetwork)
2.末梢网络(StubNetwork)
OSPF
在DR和BDR出现之前,每一台路由器和他的所有邻居成为完全网状的OSPF邻接关系,这样5台路由器之间将需要形成10个邻接关系,同时将产生20条LSA.而且在多址网络中,还存在自己发出的LSA从邻居的邻居发回来,导致网络上产生很多LSA的拷贝,所以基于这种考虑,产生了DR和BDR.
DR将完成如下工作
1.描述这个多址网络和该网络上剩下的其他相关路由器.
2.管理这个多址网络上的flooding过程.
3.同时为了冗余性,还会选取一个BDR,作为双备份之用.
DRBDR选取规则:
DRBDR选取是以接口状态机的方式触发的.
1.路由器的每个多路访问(multi-access)接口都有个路由器优先级(RouterPriority),8位长的一个整数,范围是0到255,Cisco路由器默认的优先级是1优先级为0的话将不能选举为DR/BDR.优先级可以通过命令ipospfpriority进行修改.
2.Hello包里包含了优先级的字段,还包括了可能成为DR/BDR的相关接口的IP地址.
3.当接口在多路访问网络上初次启动的时候,它把DR/BDR地址设置为0.0.0.0,同时设置等待计时器(waittimer)的值等于路由器无效间隔(RouterDeadInterval).
DRBDR选取过程:
1.路由器X在和邻居建立双向(2-Way)通信之后,检查邻居的Hello包中Priority,DR和BDR字段,列出所有可以参与DR/BDR选举的邻居(priority不为0).
2.如果有一台或多台这样的路由器宣告自己为BDR(也就是说,在其Hello包中将自己列为BDR,而不是DR),选择其中拥有最高路由器优先级的成为BDR;如果相同,选择拥有最大路由器标识的。
如果没有路由器宣告自己为BDR,选择列表中路由器拥有最高优先级的成为BDR,(同样排除宣告自己为DR的路由器),如果相同,再根据路由器标识。
3.按如下计算网络上的DR。
如果有一台或多台路由器宣告自己为DR(也就是说,在其Hello包中将自己列为DR),选择其中拥有最高路由器优先级的成为DR;如果相同,选择拥有最大路由器标识的。
如果没有路由器宣告自己为DR,将新选举出的BDR设定为DR。
4.如果路由器X新近成为DR或BDR,或者不再成为DR或BDR,重复步骤