OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(Autonomous System,AS)内决策路由。是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。著名的迪克斯加算法(Dijkstra)算法被用来计算最短路径树。OSPF分为OSPFv2和OSPFv3两个版本,其中OSPFv2用在IPv4网络,OSPFv3用在IPv6网络。OSPFv2是由RFC 2328定义的,OSPFv3是由RFC 5340定义的。与RIP相比,OSPF是链路状态协议,而RIP是距离矢量协议。 不同厂商管理距离不同,思科OSPF的协议管理距离(AD)是110,华为OSPF的协议管理距离是10。 OSPF起源 IETF为了满足建造越来越大基于IP网络的需要,形成了一个工作组,专门用于开发开放式的链路状态路由协议,以便用在大型、异构的I P网络中。新的路由协议已经取得一些成功的一系列私人的、和生产商相关的、最短路径优先(SPF )路由协议为基础, 在市场上广泛使用。包括OSPF在内,所有的S P F路由协议基于一个数学算法-Dijkstra算法。这个算法能使路由选择基于链路状态,而不是距离向量。OSPF由IETF在20世纪80年代末期开发,OSPF是SPF类路由协议中的开放式版本。最初的OSPF规范体如今RFC1131中。这个第1版( OSPF版本1 )很快被进行了重大改进的版本所代替,这个新版本体如今RFC1247文档中。RFC 1247OSPF称为OSPF版本2是为了明确指出其在稳定性和功能性方面的实质性改进。这个OSPF版本有许多更新文档,每一个更新都是对开放标准的精心改进。接下来的一些规范出如今RFC 1583、2178和2328中。OSPF版本2的最新版体如今RFC 2328中。最新版只会和由RFC 2138、1583和1247所规范的版本进行互操作。 链路是路由器接口的另一种说法,因此OSPF也称为接口状态路由协议。OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库,生成最短路径树,每个OSPF路由器使用这些最短路径构造路由表。 OSPF路由协议是一种典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由域是指一个自治系统(Autonomous System),即AS,它是指一组通过统一的路由政策或路由协议互相交换路由信息的网络。在这个AS中,所有的OSPF路由器都维护一个相同的描述这个AS结构的数据库,该数据库中存放的是路由域中相应链路的状态信息,OSPF路由器正是通过这个数据库计算出其OSPF路由表的。 作为一种链路状态的路由协议,OSPF将链路状态组播数据LSA(Link State Advertisement)传送给在某一区域内的所有路由器,这一点与距离矢量路由协议不同。运行距离矢量路由协议的路由器是将部分或全部的路由表传递给与其相邻的路由器。 折叠编辑本段术语与协议 折叠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,例如一个10 Mbit/s的接口,计算Cost的方法为: 将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的拓朴架构,也就是采用核心与分支的拓朴,如下图: 区域的命名可以采用整数数字,如1、2、3、4,也可以采用IP地址的形式,0.0.0.1、0.0.0.2,因为采用了Hub-Spoke的架构,所以必须定义出一个核心,然后其它部分都与核心相连,OSPF的区域0就是所有区域的核心,称为BackBone 区域(骨干区域),而其它区域称为Normal 区域(常规区域),在理论上,所有的常规区域应该直接和骨干区域相连,常规区域只能和骨干区域交换LSA,常规区域与常规区域之间即使直连也无法互换LSA,如上图中Area 1、Area 2、Area 3、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。