OSPF理论介绍

22 Jun

OSPF协议Open Shortest Path First是链路状态协议。RIPEIGRP是距离矢量协议只知道邻居,但链路状态可知道全网信息,因此天然免疫环路。距离矢量协议和链路状态协议最大的区别就是后者对全网了解的更多。同样有邻居表,拓扑表,路由表。OSPF传递的并不是路由,而是传递LSA,最终路由表是从LSA中获取全网信息后通过SPF算法计算得出的,存放LSA的地方就是LSDB。处于同一区域的路由器内的LSDB都是一样的。

先大致描述一下:OSPF是链路状态协议,能知道全网的信息。是IGP。OSPF里封装的IP协议号是89。组播地址是224.0.0.5 / 224.0.0.6。定时30分钟更新LSA(注意不是更新路由表),支持触发更新。AD值是110。度量是带宽,计算公式:10^8/接口带宽,单位 bps。EIGRP度量里带宽是取最小带宽来计算,而OSPF度量是沿途每一段带宽计算值之和。天然无环路。支持VLSM和CIDR。支持等价负载均衡。 支持认证。

术语解释

区域Area:

RIP和EIGRP没区域概念,它们只知道自己的邻居。但OSPF如果路由器数量多,全网络的LSA条目将非常多耗内存,且任何一个路由器的LSA 发生变化,整个网络的LSDB都要更新,而且因为路由器收到的是全网LSA再根据SPF算法算路径,因此路由表是无法汇总的,导致路由表太大。因此 OSPF要想用于大规模网络需要分区域。分为骨干区域Area 0和普通区域。为了防止区域环路,要求所有普通区域都要连接到骨干区域,像鱼骨图一样。所有普通区域间的路由必须经由骨干区域来学习

ABR:(Area Border Router)

连接骨干区域Area 0和普通区域的路由器称为区域边界路由器ABR,因为连接两个区域因此它有两张LSDB,分别包含两个区域内的LSA。

ASBR:(Autonomous System Boundary Rotuer)

如果路由器还连接外部区域(即非OSPF协议)称为自治域系统边界路由器ASBR

LSA:(Link State Advertisement)

LSA即链路状态通告,里面包含网络拓扑信息和路由信息,比较复杂,下面会祥述。OSPF靠传递LSA使每台路由器都能掌握整个网络的拓扑结构和路 由信息。LSA头部信息包括:LSA的类型,LinkID就是该条LSA的名字,ADV Router是通告路由器的RouterID,更新时间Age,序号Seq等。

LSDB:(Link State Database )

LSDB即链路状态数据库,用于存放LSA。同一区域内的路由器有相同的LSDB。每个LSA在LSDB中都有一个序号,编号方案是0x80000001到0x7FFFFFFF(为何是从大到小呢?其实0x80000001是-0x7FFFFFFF,从负数循环到正数)。每30分钟LSA进行一次泛洪以保证LSDB同步,每次泛洪后序号+1。路由器收到LSA后,如果LSDB里没有,就马上将该条LSA加入LSDB里,回ACK并继续泛洪该条LSA。如果LSDB里已经有了,看序号,序号高就更新,序号低就反过来将自己序号高的LSA告诉对方,序号一样就忽略,但仍旧会回复ACK。如何判断本地LSDB里有没有该条LSA呢?先看类型(LSA有1-11种类型),再看LinkID,最后看通告路由器的RouterID。3个都一样说明本地有,3个任意一个不一样就认为本地没有。例 如R1->R2->R3,R1会通告和R2间的链路,R2也会通告和R1间的链路,这时R3收到两条LSA,因为是同一链路,所以类型一样,LinkID一样,但通告路由器RouterID不同,R3会认为是两条不同的LSA。

另外如果网络比较大,为防止其他路由器产生过度的LSA,LSDB的有超载防护功能,可以限制非本地产生的LSA的数目。超载就down邻居,问题是不能选择down哪个邻居而是全down掉,因此以下情况下才有实际意义:R1连外网跑OSPF,R1在内网里跑EIGRP,那超载后R1只会down掉和外网的邻居关系,内网的邻居关系不会被down掉。或与外网跑OSPF进程1,和内网跑OSPF进程2,那内网也不会被down掉。

SPF:

算法由Dijkstra发明,有时也被称为Dijkstra算法。将每台路由器放置在树的根节点,根据LSDB里的LSA里包含的路由信息,计算出到达目的地的累计开销,将最佳路径放入路由表。

RouterID:

每个运行OSPF的路由器都有一个RouterID,必须是全网唯一,在LSDB中使用RouterID来识别路由器。可以用router-id命令手动配置路由器ID,如果没手动指定,环回口的IP地址将自动成为RouterID。如果有多个环回口那么最高IP地址将成RouterID。如果无环回口,路由器上活动的接口中最高IP地址将成为RouterID。

DR:(Designated Router)

一个区域内,如果路由器间两两传LSA会有的很多重复。因此区域内先选举一个路由器为DR,其他路由器将自己LSA通告给DR,这样DR的LSDB里就有了整个区域的LSA,再将自己的LSDB发给其他路由器,这样效率高多了。DR用Hello包选,选举期40秒,选举期内Hello包里优先级高的就是DR,次高的为BDR。优先级相同RouterID高的就是DR,次高的就是BDR。一个路由不是DR就是BDR就是DRother。选举期内不存在抢占,即选举期内你将某一路由器优先级改高也没用。

BDR:(Backup Designate Router)

就是Backup的DR,参照上面。DR一旦失效,BDR自动成为DR,区域内重新选举BDR。选举结束后,所有路由器会组播Hello包到224.0.0.5以便它们能跟踪其他邻居的信息。DRother只将LSU组播到224.0.0.6,该地址只能到达DR/BDR,DRother在二层就将224.0.0.6就丢弃。DR将自己的LSA从224.0.0.5组播发出来,该地址所有路由器都在监听。BDR既能收到DR从224.0.0.5发的LSA组播,又能收到DRother从224.0.0.6发的LSU组播

OSPF报文

OSPF报文有5种:Hello,DBD(Database Description),LSR(Link-State Request),LSU(Link-State Update),LSAck(Link-State Acknowledgment)

Hello:

OSPF和EIGRP都用Hello包发现邻居。EIGRP的Hello包里会检查AS号,K值,认证来确认是否真是邻居。OSPF的Hello里会检查RouterId(两边必须不一致),区域一致,认证,特殊区域字段(如Stub)一致,Hello/Dead时间两边一致。

DBD(Database Description):

例如A->B->C,ABC都有全网路由,假设都有1000条路由。这时加一条A->C的路由,A和C成为邻居,如果是EIGRP,那A会将1001(加上这条新路由)条路由告诉C。显然没必要。OSPF改进了,A和C成为邻居后,A会将自己的DBD(好比仓库将自己库存单给对方)给C看,C看后发现只有这条A->C的新的路由本地没有,就发LSR给A要求这条新路由,A再发LSU将这条路由告诉C,C收到后回LSAck。

LSR(Link-State Request),LSU(Link-State Update),LSAck(Link-State Acknowledgment):

参照上面DBD。

OSPF的8种接口状态:

Down:是初始化状态,等待进入Init。只有手动指定邻居才能看到,自动指定邻居是看不到该状态的

Init:收到不带自己信息的Hello包后进入该状态

2way:收到带自己信息的Hello包后进入该状态。2way后开始选举DR/BDR,选举时间是以最晚no shutdown的路由器的时间开始计算40s

Exstart:邻居起来后准备交互DBD,需要确定一下两者间的主从关系。选DR/BDR先看优先级再看RouterID,而此处主从关系只看RouterID,高的为主低的为从。其实两台路由器间所谓的主从并无所谓,只不过是为了交互DBD方便

Exchange:两台路由器确定主从关系后,开始交互DBD

Loading:收到并比较DBD后,向对方发送LSR请求新的LSA时,进入该状态

Full:对方LSDB内的LSA全有了,就建立了adjacency邻接关系。根据是否交互LSA可以判断路 由器间是邻居还是邻接关系。交互LSA的是邻接,不交互LSA的是邻居。因此Full表示邻接,2way表示邻居。DR/BDR选举完后,DRother 只和DR/BDR形成邻接关系,DRother间是邻居。

Attempt:仅存在NBMA环境中。邻居关系未建立时拉长Hello时间(其实是用poll时间120秒代替Hello时间),拉长DR/BDR选举时间(也延长至120秒),以减少带宽占用。邻居关系起来后恢复30秒Hello时间

OSPF的5种网络类型:

5种网络类型:点到点P-to-P,Broadcast,NBMA,点到多点P-to-M,点到多点非广播P-to-M-NB。它们与二层概念的3种接口网络类型无关,别搞混了。二层概念的3种接口类型:点到点P-to-P(HDLC,PPP,FR点到点子接口),Broadcast(Ethernet,Token Ring,FDDI),NBMA (FR主接口和多点接口,x.25,ATM)。它们间仅有默认的对应关系,即OSPF的点到点P-to-P,broadcast,NBMA默认对应二层的同名的接口类型,但仅仅是默认的对应关系,你可以手动随意改。OSPF的点到多点P-to-M,点到多点非广播P-to-M-NB无二层的对应的接口类型。

P-to-P:(点到点)

默认对应二层链路的P-to-P(HDLC,PPP,FR点到点子接口)。不选DR/BDR。所有OSPF报文都从224.0.0.5组播出去。 Hello/Dead时间为10/40s。自动建立邻居。不产生32位主机路由。特殊类型字段是Stub。P-to-P网络全是邻接Full关系。

Broadcast:(广播的多路访问网络)

默认对应二层链路的Broadcast(Ethernet,Token Ring,FDDI)。选DR/BDR。去往DR/BDR的报文用组播地址224.0.0.6,从DR去往BDR/DRother的报文用组播地址。 224.0.0.5,支持单播。Hello/Dead时间为10/40s。自动建立邻居。不产生32位主机路由。特殊类型字段是Transit。

NBMA:(非广播的多路访问网络)

默认对应二层链路的(FR主接口和多点接口,x.25,ATM)。选DR/BDR。所有OSPF报文都用单播。Hello/Dead时间为30/120s。手动建立邻居。不产生32位主机路由。特殊类型字段是Transit。

P-to-M:(点到多点)

无默认对应二层链路类型。不选DR/BDR。仅Hello用224.0.0.5组播,其他报文都单播。Hello/Dead时间为30/120s。自动建立邻居。产生32位主机路由。特殊类型字段是Stub。

P-to-M-NB:(点到多点非广播)

无默认对应二层链路类型。不选DR/BDR。所有OSPF报文都用单播。Hello/Dead时间为30/120s。手动建立邻居。产生32位主机路由。特殊类型字段是Stub。

总结:上面看起来挺复杂的,其实只要理解背后的原理不用死记硬背:P-to-P点到点网络最简单,一共就两台路由器,因此不用选举DR/BDR。 P-to-M / P-to-M-NB是P-to-P的集合,因此同样不用选举DR/BDR。不选DR/BDR的是Stub,选DR/BDR的是Transit。NBMA和 P-to-M-NB不支持广播,因此只能单播,且因为不支持广播因此无法自动发现邻居,要手动建立邻居。

什么时候改OSPF的网络类型?

OSPF应该根据不同的需求改变网络类型。那什么时候修改网络类型呢?P-to-P一般不改。Broadcast看情况,如果就两个路由器可以改成P-to-P,以避免选举DR/BDR。NBMA基本一定会改,不改的话路由器用OSPF宣告后是学不到路由的,因为NBMA不自动建立邻居,要手动建立邻居。建完邻居后仍旧可能学不到路由,因为要选举DR/BDR,必须保证hub点被选为DR。DR/BDR都OK后,仍旧可能学不到路由,必须还要保证二层有PVC链路。总之一整套配置非常烦琐。因此常改成点到多点P-to-M(自动建邻居,不选举DR/BDR,二层PVC自动就有了)。另一种经验是 NBMA要根据实际网络类型来改,如果FR网络是Full-Mesh全互联的(因费用较高不太常见),常改成Broadcast。如果是Star星型结构,常改成P-to-M。单独的两个节点间可以改成P-to-P。中间广域网不让通过组播报文的话可以改成P-to-M-NB(注意此时需要手动单播建邻居)。

邻居的建立和OSPF的网络类型有何关系?

上面介绍Hello时介绍过建立邻居时检查的字段,并没有要求检查网络类型(况且Hello包里根本就没有网络类型这个字段),因此网络类型和建立 邻居无关。但网络类型决定了Hello时间的默认值,时间不一致不能建立邻居,这个意义上讲网络类型和建立邻居有关。但Hello时间可以手动修改,因此又无关。比如一端是P-to-P,另一端是Broadcast,Hello时间都是10可以建立邻居,如另一端是P-to-M,就不能建立邻居,除非修改Hello时间一致后,可以建立邻居。但最好不要这样,比如一端是P-to-P,另一端是Broadcast,Hello时间相同可以建立邻居,但建立邻居后仍旧学不到路由。因为P-to-P是Stub,Broadcast是Transit,类型不同,因此该段就无法互相学习路由。(具体原因是:P- to-P端发出的1类LSA里有point-to-point,Broadcast端是Transit需要选举DR/BDR,选举结果自然是自己成为DR,而DR是无法识别point-to-point的LSA的。反之P-to-P端收到的LSA里有Transit Network也是无法识别的。所以就算能起邻居,能交互LSA,能同步LSDB,但由于LSA无法识别无法通过SPF算法计算最优路径,无法学习到路由)

OSPF的11种LSA类型:

OSPF传递的是LSA而非路由表,因此理解LSA是理解OSPF的关键。共分11种类型:

1类:路由器LSA(Router Link States)

只在本区域内泛洪,不穿越ABR。每个运行OSPF的路由器都会生成一个1类的LSA。LinkID为路由器的RouterId。内容包括路由信息和拓扑信息。如果是Stub网络,路由信息里有前缀掩码和去往这条路由的开销。如果是Transit Network网络(即Broadcast和NBMA)有DR的IP地址和自己的IP地址,但没有BDR和DRother的信息,也没有自己IP的掩码,因此要结合2类LSA一起分析。拓扑信息里有对方的RouterID和自己的IP地址。

2类:网络LSA(Network Link States)

由DR产生,即只在选举DR/BDR的Broadcast和NBMA网络中才有。只在本区域泛洪,不穿越ABR。LinkID为DR接口的IP。内容需联合1类的LSA共同描述出网络的拓扑与路由。(只有1类和2类LSA里除路由信息外,还包含网络拓扑信息)

3类:汇总LSA(Summary Net Link States)

泛洪整个自治系统。负责将一个区域的信息给另一个区域,即将区域内的1/2类LSA变成3类LSA通过ABR告诉给别的区域。每经过一个ABR通告路由器会发生变化。LinkID就是这条路由的前缀。内容就是路由信息。 默认不自动汇总,且3类LSA通告每一个子网,因此通常会手动汇总,否则不便管理。区域内的1类2类LSA不传给其他区域,区域间将1类2类LSA汇总成 3类LSA像距离矢量协议那样通告,这样全网信息都知道了。

4类:ABR汇总LSA(Summary ASB Link States)

4类是为5类服务的,通过ABR将ASBR的位置泛洪整个自治系统。LinkID为ASBR的RouterID。和3类一样,每经过一个ABR通告路由器会发生变化。内容就是ASBR的位置。

(每条LSA的LinkID命名规则还不太一样,其实就是为了保证唯一性,防止产生二意。1类的LinkID就是路由器的RouterId,不必解 释。2类的LinkID是DR接口的IP,因为一个路由器可能会被多个区域选为DR,只有用接口的IP才不会重复。3类的LinkID是路由的前缀。4类的目的是通告ASBR,因此LinkID就是ASBR的RouterID。)

5类:自治系统外部LSA(Type-5 AS External Link States)

由ASBR产生,通过ASBR将外部的信息泛洪整个自治系统。通告路由器是不变的(3/4类中会变)。LinkID就是这条路由的前缀。如果和ASBR在同一区域,那路由器通过1/2类LSA就能知道ASBR。如果和ASBR不在同一区域,路由器需要结合4类LSA才能找到ASBR。内容是外部网络。默认不自动汇总,通常会手动汇总,否则不便管理。

7类:NSSA外部LSA

只存在于NSSA区域中,由连接NSSA区域的ASBR产生的关于NSSA的信息,在NSSA区域内泛洪,并且可以被ABR转换为5类LSA。LinkID为路由的前缀。

6类:组播LSA

表示OSPF组播中的成员,但基本不用

8类:外部属性LSA for BGP

(未被实现)

9类:非透明LSA(本地链路范围)

10类:非透明LSA(本地区域范围)

11类:非透明LSA(自治系统范围)

9/10/11类在MPLS流量工程中用

OSPF的4种路由类型:

OSPF区域内交互LSA后,区域内同步LSDB。之后通过ABR/ASBR跨区域交互LSA后,再同步LSDB。这样每台路由器均有了整个网络的拓扑信息和路由了。但并不是所有路由都会被加入路由表。RIP和EIGRP先比较AD值再比较开销来决定哪条路由可以被加入路由表。OSPF多了步比较类型,即先比较AD值,再比类型(O>OiA>OE1>OE2),最后比开销,都一样就负载均衡。4种路由类型如下,优先级从高到低:

O:同一区域内的路由,即1/2类LSA

O IA:同一自治系统中不同区域内的路由,即3类LSA

O E1:外部路由,加上沿途开销

O E2:外部路由,不加上沿途开销(通常如果不必考虑内部网络带宽的话用OE2方便,需要考虑内外带宽的话用OE1。如果用OE2,内部多条路径开销相同时不会负载均衡,而是选距离ASBR近的路径)

OSPF的4种区域类型:

OSPF普通区域(非骨干区域Area0)可指定为4种特殊类型:Stub,Totally Stub,NSSA,Totally NSSA。区域指定特殊分类型的目的是拒绝掉一部分LSA以便简化网络,但要保证被拒绝掉的LSA内包含的路由可达。

Stub Area:

不接受自治系统外部的LSA,即拒绝5类(这样也拒绝了4类),ABR自动产生3类的默认路由去往被拒绝掉的外部路由。Stub Area内的路由器都要被配置成stub,否则路由器的Hello包里的特殊区域字段不一致的话,会导致区域内建立不了邻居。

Totally Stub Area:

在Stub Area的基础上再进一步拒绝掉自治系统内部其他区域的LSA。等于不接受任何非本区域的LSA,即拒绝5类(这样也拒绝了4类)和3类。同样ABR自动 产生3类的默认路由去往被拒绝掉的外部路由。区域内的路由器都要被配置成stub,ABR上配置成Totally Stub。是Cisco特有的类型。

NSSA:(Not So Stubby Areas)

在Stub Area基础上,允许接收以7类LSA发送的外部路由信。因此允许区域内存在ASBR。ASBR向NSSA区域发送7类LSA来描述外部路由。ABR将区 域内收到的7类LSA转换成5类LSA向别的区域做通告。因为可以将外部网络的路由重发布进OSPF进程,所以ABR不会自动产生默认路由,要手动配置

Totally NSSA:

在NSSA基础上进一步拒绝掉自治系统内部其他区域的LSA,即拒绝5类(这样也拒绝了4类)和3类。由于没有去往其它区域的路由,ABR自动产生3类的默认路由去往被拒绝掉的外部路由。

总结:如果外部的明细比较多,而本区域路由器性能又比较低,且只有一个ABR或一个ASBR,那特别适合配置成Stub或Tolly Stub。Stub和Totally Stub区域内不能存在ASBR,虚链路是不能穿越Stub 区域的。Stub和Totally Stub区域内至少要有一个ABR,最好只有一个ABR,如有多个ABR时,可能会选择次优路径。非Totally区域的ABR会过滤掉5类 LSA,Totally区域的ABR还会进一步将3类LSA过滤掉。

OSPF的内部和外部汇总:

在普通区域上设置特殊类型可以拒绝掉3/5类路由,缩小路由表。还可以用汇总将掩码变短来实现缩小路由表的目的。OSPF分内部汇总和外部汇总,命令稍有不同。

内部汇总:

在ABR上做,将区域间的路由汇总。命令:R1(config-router)#area 1 range 前缀 掩码

外部汇总:

在ASBR上做,将自治系统外部的路由汇总。命令:R1(config-router)#summary-address range 前缀 掩码

虚链路:

虚链路即在两个区域间建立一条虚拟的链路,目的是为了解决区域分隔和骨干区域分割的问题。这里只介绍一下概念,具体实现虚链路放在实验部分。

区域分隔:OSPF规定普通区域必须和骨干区域相连,经由骨干区域来交换区域间路由信息,但由于网络规划不妥或历史原因,有些普通区域没有与骨干区域相连,导致学不到其他区域的路由,这就是区域分隔问题。通过虚链路可以将普通区域和骨干区域连接起来

骨干区域分割:OSPF规定只能有一个骨干区域。但由于网络规划不妥或历史原因,一个自治系统内出现了多个骨干区域,导致路由学习出现问题。通过虚链路可以将多个骨干区域连接起来成为一个骨干区域

虚链路应该作为一种不得已而为之的解决问题的方案,最好应该是规划好网络避免出现这种问题。

Leave a Reply

Your email address will not be published. Required fields are marked *