路由协议OSPF全称为Open Shortest Path First,也就开放的最短路径优先协议,由于OSPF是由IETF开发的,它的使用不受任何厂商限制,全部人均可以使用,因此称为开放的,而最短路径优先(SPF)只是OSPF的核心思想,其使用的算法是Dijkstra算法,最短路径优先并无太多特殊的含义,并无任何一个路由协议是最长路径优先的,全部协议,都会选最短的。 算法
OSPF的流量使用IP协议号89。数据库
OSPF工做在单个AS,是个绝对的内部网关路由协议(Interior Gateway Protocol,即IGP)。缓存
OSPF对网络没有跳数限制,支持 Classless Interdomain Routing (CIDR)和Variable-Length Subnet Masks (VLSMs),没有自动汇总功能,但能够手工在任意比特位汇总,而且手工汇总没有任何条件限制,能够汇总到任意掩码长度。网络
OSPF支持认证,而且支持明文和MD5认证;OSPF不能够经过Offset list来改变路由的metric。架构
OSPF并不会周期性更新路由表,而采用增量更新,即只在路由有变化时,才会发送更新,而且只发送有变化的路由信息;事实上,OSPF是间接设置了周期性更新路由的规则,由于全部路由都是有刷新时间的,当达到刷新时间阀值时,该路由就会产生一次更新,默认时间为1800秒,即30分钟,因此OSPF路由的按期更新周期默认为30分钟。负载均衡
OSPF全部路由的管理距离(Ddministrative Distance)为110,OSPF只支持等价负载均衡。less
距离矢量路由协议的根本特征就是本身的路由表是彻底从其它路由器学来的,而且将收到的路由条目一丝不变地放进本身的路由表,运行距离矢量路由协议的路由器之间交换的是路由表,距离矢量路由协议是没有大脑的,路由表历来不会本身计算,老是把别人的路由表拿来就用;而OSPF彻底抛弃了这种不可靠的算法,OSPF是典型的链路状态路由协议,路由器之间交换的并非路由表,而是链路状态,OSPF经过得到网络中全部的链路状态信息,从而计算出到达每一个目标精确的网络路径。dom
Router-IDoop
假设这个世界上的人名字没有重复,每一个人的名字都不相同,当有一天,赶上个陌生人告诉你,有任何麻烦能够找他,他必定可以帮你解决;等到你有麻烦的时候,你想找那我的帮忙,但是若是你连那我的的名字都不知道,那么也就不可能找到那我的帮忙了。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,例如一个10 Mbit/s的接口,计算Coast的方法为:
将10 Mbit换算成bit,为10 000 000 bit,而后用10000 0000除以该带宽,结果为 10000 0000/10 000 000 bit = 10,因此一个10 Mbit/s的接口,OSPF认为该接口的Metric值为10,须要注意的是,计算中,带宽的单位取bit/s,而不是Kbit/s,例如一个100 Mbit/s的接口,Cost 值为 10000 0000 /100 000 000=1,由于Cost值必须为整数,因此即便是一个1000 Mbit/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-State Database),邻居再发给本身的全部邻居,而且在传递过程种,绝对不会有任何更改。经过这样的过程,最终,网络中全部的OSPF路由器都拥有网络中全部的链路状态,而且全部路由器的链路状态应该能描绘出相同的网络拓朴。好比如今要计算一条地铁线路图,如上海地铁二号线某段的图,若是不直接将该图给别人看,图比如是路由表,如今只是报给别人各个站的信息,该信息比如是链路状态,经过告诉别人各个站左边一站是什么,右边一站是什么,别人也能经过该信息(链路状态),画出完整的线路图(路由表),如获得以下各站信息(链路状态):
★南京东路-站 (左边一站是人民广场,右边一站是陆家嘴)
★南京西路-站 (左边一站是静安寺,右边一站是人民广场)
★静安寺-站 (右边一站是南京西路)
★人民广场-站 (左边一站是南京西路,右边一站是南京东路)
★陆家嘴-站 (左边一站是南京东路)
还原线路图(路由表)以下:
根据分析如下两站信息(两条链路状态):
★南京西路-站 (左边一站是静安寺,右边一站是人民广场)
★静安寺-站 (右边一站是南京西路)
计算 由于静安寺右边是南京西路,而南京西路左边是静安寺,因此静安寺和南京西路是相邻的,为 静安寺 — 南京西路,而且因为南京西路右边是人民广场,因此经过这两条信息,得出线路为 静安寺 — 南京西路 — 人民广场,继续往下
再根据以下两站信息(链路状态):
★人民广场-站 (左边一站是南京西路,右边一站是南京东路)
★南京东路-站 (左边一站是人民广场,右边一站是陆家嘴)
计算 由于以前南京西路右边是人民广场,人民广场左边是南京西路,因此南京西路和人民广场是相邻的两站,而且人民广场右边是南京东路,得出线路为 南京西路 — 人民广场 — 南京东路,而且由于南京东路右边是陆家嘴,因此 这部分线路得知为南京西路 — 人民广场 — 南京东路 — 陆家嘴,继续往下
再根据以下一站信息(链路状态):
★陆家嘴-站 (左边一站是南京东路)
计算 由于南京东路右边是陆家嘴,而陆家嘴左边是南京东路,因此两站相邻,得出为 南京东路 — 陆家嘴,
经过以上各部分的线路:
静安寺 — 南京西路 — 人民广场
南京西路 — 人民广场 — 南京东路 — 陆家嘴
南京东路 — 陆家嘴
因此很轻松的就画出该段地铁线路图为:
静安寺 — 南京西路 — 人民广场 — 南京东路 — 陆家嘴
从以上计算过程能够知道,由于获得各站的信息,就能画出整条线路图,而OSPF也一样根据路由器各接口的信息(链路状态),计算出网络拓朴图,OSPF之间交换链路状态,就像上面交换各站信息,而不像RIP和EIGRP直接交换路由表,交换路由表,就等于直接给人看线路图,可见OSPF的智能算法,比距离矢量协议对网络有更精确的认知。
OSPF区域
由于OSPF路由器之间会将全部的链路状态(LSA)相互交换,绝不保留,当网络规模达到必定程度时,LSA将造成一个庞大的数据库,势必会给OSPF计算带来巨大的压力;为了可以下降OSPF计算的复杂程度,缓存计算压力,OSPF采用分区域计算,将网络中全部OSPF路由器划分红不一样的区域,每一个区域负责各自区域精确的LSA传递与路由计算,而后再将一个区域的LSA简化和汇总以后转发到另一个区域,这样一来,在区域内部,拥有网络精确的LSA,而在不一样区域,则传递简化的LSA。区域的划分为了可以尽可能设计成无环网络,因此采用了Hub-Spoke的拓朴架构,也就是采用核心与分支的拓朴,以下图:
区域的命名能够采用整数数字,如一、二、三、4,也能够采用IP地址的形式,0.0.0.一、0.0.0.2,由于采用了Hub-Spoke的架构,因此必须定义出一个核心,而后其它部分都与核心相连,OSPF的区域0就是全部区域的核心,称为BackBone 区域(骨干区域),而其它区域称为Normal 区域(常规区域),在理论上,全部的常规区域应该直接和骨干区域相连,常规区域只能和骨干区域交换LSA,常规区域与常规区域之间即便直连也没法互换LSA,如上图中Area 一、Area 二、Area 三、Area 4只能和Area 0互换LSA,而后再由Area 0转发,Area 0就像是一个中转站,两个常规区域须要交换LSA,只能先交给Area 0,再由Area 0转发,而常规区域之间没法互相转发。
OSPF区域是基于路由器的接口划分的,而不是基于整台路由器划分的,一台路由器能够属于单个区域,也能够属于多个区域,以下图:
若是一台OSPF路由器属于单个区域,即该路由器全部接口都属于同一个区域,那么这台路由器称为Internal Router(IR),如上图中的R2,R3和R4;若是一台OSPF路由器属于多个区域,即该路由器的接口不都属于一个区域,那么这台路由器称为Area Border Router (ABR),如上图中的R1,ABR能够将一个区域的LSA汇总后转发至另外一个区域;若是一台OSPF路由器将外部路由协议重分布进OSPF,那么这台路由器称为Autonomous System Boundary Router (ASBR),如上图中,R5将EIGRP重分进OSPF,那么R5就是ASBR,可是若是只是将OSPF重分布进其它路由协议,则不能称为ASBR。
能够配置任何OSPF路由器成为ABR或ASBR。
因为OSPF有着多种区域,因此OSPF的路由在路由表中也以多种形式存在,共分如下几种:
若是是同区域的路由,叫作Intra-Area Route,在路由表中使用O来表示;
若是是不一样区域的路由,叫作Inter-Area Route或Summary Route,在路由表中使用O IA来表示;
若是并不是OSPF的路由,或者是不一样OSPF进程的路由,只是被重分布到OSPF的,叫作External Route,在路由表中使用O E2或OE 1来表示。
当存在多种路由能够到达同一目的地时,OSPF将根据前后顺序来选择要使用的路由,全部路由的前后顺序为:
Intra-Area — Inter-Area — External E1 — External E2,即 O — O IA — O E1 — O E2。
注:
★一台路由器能够运行多个OSPF进程,不一样进程的OSPF,可视为没有任何关系,如须要得到相互的路由信息,须要重分布。
★每一个OSPF进程能够有多个区域,而路由器的链路状态数据库是分进程和分区域存放的。
邻居(Neighbor)
OSPF只有邻居之间才会交换LSA,路由器会将链路状态数据库中全部的内容绝不保留地发给全部邻居,要想在OSPF路由器之间交换LSA,必须先造成OSPF邻居,OSPF邻居靠发送Hello包来创建和维护,Hello包会在启动了OSPF的接口上周期性发送,在不一样的网络中,发送Hello包的间隔也会不一样,当超过4倍的Hello时间,也就是Dead时间事后尚未收到邻居的Hello包,邻居关系将被断开。
两台OSPF路由器必须知足4个条件,才能造成OSPF邻居,4个必备条件以下:
1.Area-id(区域号码)
即路由器之间必须配置在相同的OSPF区域,不然没法造成邻居。
2.Hello and Dead Interval(Hello时间与Dead时间)
即路由器之间的Hello时间和Dead时间必须一致,不然没法造成邻居。
3.Authentication(认证)
路由器之间必须配置相同的认证密码,若是密码不一样,则没法造成邻居。
4.Stub Area Flag(末节标签)
路由器之间的末节标签必须一致,即处在相同的末节区域内,不然没法造成邻居。
注:
★OSPF只能使用接口的Primary地址创建邻居,不能使用Secondary创建邻居。
★路由器双方接口要么都为手工配置地址(Numbered),要么都为借用地址(Unnumbered),不然没法创建邻居。
邻接(Adjacency)
两台OSPF路由器可以造成邻居,但并不必定能相互交换LSA,只要能交换LSA,关系则称为邻接(Adjacency)。邻居之间只交换Hello包,而邻接(Adjacency)之间不只交换Hello包,还要交换LSA。
DR/BDR
当多台OSPF路由器连到同一个多路访问网段时,若是每两台路由器之间都相互交换LSA,那么该网段将充满着众多LSA条目,为了可以尽可能减小LSA的传播数量,经过在多路访问网段中选择出一个核心路由器,称为DR(Designated Router),网段中全部的OSPF路由器都和DR互换LSA,这样一来,DR就会拥有全部的LSA,而且将全部的LSA转发给每一台路由器;DR就像是该网段的LSA中转站,全部的路由器都与该中转站互换LSA,若是DR失效后,那么就会形成LSA的丢失与不完整,因此在多路访问网络中除了选举出DR以外,还会选举出一台路由器做为DR的备份,称为BDR(Backup Designated Router),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,能够被全部路由器接收。