OSPF 出现的背景:
了解SPF 算法和LSA通告(ospf进程生成)LSA生成 LSDB
使用SPF算法来计算一个无环路的拓扑图
RouterID
Router ID就是用于在自治系统中唯一标识一台运行OSPF的路由器的32位整数。每个运行OSPF的路由器都有一个Router ID。Router ID的格式和IP地址的格式是一样的,在实际网络部署中,考虑到协议的稳定,推荐使用路由器Loopback0的IP地址做为路由器的Router ID。
只有重新配置系统的Router ID或OSPF的Router ID,并且重新启动OSPF进程后,才会进行Router ID的重新选取。
>reset ospf process
OSPF 基本运行机制:
- 通过hello 协议形成邻居关系:
- 设备运行OSPF协议后,会从所有启动OSPF协议的接口上发出Hello数据包。
- LSAs的泛洪-通告链路状态信息
- 形成邻接关系的设备之间就可以交互LSA了,
- LSA全称是链路状态通告,它描述了设备所有的链路、接口、邻居及链路状态等信息。设备间正是不断地泛洪交互这些链路信息,来了解整个网络的拓扑信息。由于链路的多样性,OSPF协议定义了许多LSA类型(链路的多样性是指二层链路有Broadcast,NBMA(Non-Broadcast Multi-Access),P2P,P2MP等链路)
- LSDB的组建-形成带权有向图
- 通过泛洪LSA,设备接下来会把收到的LSA汇总记录在LSDB(链路状态数据库)当中。最终,所有路由器都会形成同样的LSDB。LSA是对设备周围网络拓扑结构的描述,而LSDB则是对整个自治系统的网络拓扑结构的描述,LSDB是LSA的汇总。
- SPF的计算-形成路由
- 当LSDB同步完之后,每一台设备都将以其自身为根,使用SPF算法来计算一个无环路的拓扑图,以描述它所知道的到达每一个目的地的最短路径(最小的路径代价)。这个拓扑图就是SPF算法树,有了这棵“树”,事实上路由器就已经知道了到达网络各个角落的最优路径。
- 路由表的维护更新
- 最终,经过SPF算法得出了最短路径树,每台路由器将SPF算法得出的最短路径,同时,邻居之间交互Hello报文进行Keepalive,维持邻居/邻接关系,并且每30min重传一次LSA。如果网络拓扑稳定,那么网络中将不会有什么活动或行为发生。装载进路由表形成指导数据转发的路由表项,并且实时更新。
DR/BDR
减少在广播和NBMA网络中路由器之间的邻接关系。指定DR和其它路由器进行路由信息的传递。
在广播网和NBMA网络中,任意两台路由器之间都要传递路由信息。
网络中有n台路由器,则需要建立n*(n-1)/2个邻接关系。这使得任何一台路由器的路由变化都会导致多次传递,浪费了带宽资源。为解决这一问题,OSPF定义了指定路由器DR。通过选举产生DR(Designated 路由器)后,所有其他设备都只将信息发送给DR,由DR将网络链路状态LSA广播出去。为了防止DR发生故障,重新选举DR时会产成业务中断,除了DR之外,还会选举一个备份指定路由器BDR。这样除DR和BDR之外的路由器(称为DR Other)之间将不再建立邻接关系,也不再交换任何路由信息,这样就减少了广播网和NBMA网络上各路由器之间邻接关系的数量.
DR 最好在OSPF网络是不变的,即时有后加入的设备优先级更高。
根据二层链路的不同,DR/BDR的选举过程会有不同
在一个网段中会指定一个DR,如果区域中有多个网段则会在每个网段中产生一个DR。
OSPF 链路状态
这表示DR/BDR与邻居间建立的是邻接关系,
而DROther之间建立的只是邻居关系。
说到这儿,小伙伴们是不是又产生了很多新的疑问?为什么Full就表示邻接关系,2-Way就表示邻居关系?邻居关系和邻接关系又有什么区别?
查看ospf 设备之间的邻接或者邻居关系可以通过dis ospf peer brief ,如果不是邻接关系不会交换路由信息。
OSPF 网络中为什么一定要有DR/BDR?
1、 如果广播网络里只存在DR,但并不存在BDR,这时候网络是什么状况?
如果在一个多访问网络上只有唯一的一台具有选取资格的路由器相连,那么这台路由器将成为DR路由器,而且在这个网络上没有BDR路由器,其他所有的路由器都将只和这台DR路由器建立邻接关系。如果 DR故障网络将瘫痪。
如果广播网络上不存在具备DR/BDR选举资格的设备,那么这个网络上将没有DR或者BDR路由器,而且也不会建立任何邻接关系。在这种情况下,网络上所有的路由器的邻居状态都将停留在“2-Way”状态
OSPF 接口
设备上OSPF 进程怎么交换LSDB的?答案是通过链路直连的OSPF接口。

在上面的信息中,通过其中一些描述链路基本状况的字段,就可以了解OSPF接口相连的链路信息。
- 1)Router ID:设备的ID,第二篇中介绍到的,保证设备在OSPF网络的唯一性。
- 2)Area:接口所在的区域ID。关于区域ID,在第四篇中会详细介绍。
- 3)Interface:接口的基本信息,包括接口的IP地址、接口编号。始发于这个接口的OSPF报文将把这个IP地址作为源地址。
- 4)Cost:接口开销值,即此接口发送出去的数据包在链路中传输需要花费的开销值。
- OSPF在生成SPF时,就是依据这些链路开销值,选出最优的数据转发链路。
- 5)Type:接口类型,即这个接口相连的链路类型,包括P2P、P2MP、广播或NBMA。
- 当然,还有别的如维持邻居关系相关的等其他的信息,比如第二篇里的Dead Timer。
- 6)Priority:设备接口在选取DR和BDR时的优先级。其值越大,优先级越高。
- 7)DesignatedRouter:接口所在广播网络/NBMA网络上的指定设备,即DR。一般用连接这个广播网络/NBMA网络的接口地址表示。比如192.168.23.0/24这个广播网络/NBMA网络的DR是相连接口地址为192.168.3.2的设备。
- 8)BackupDesignatedRouter:接口所在网络上的备份指定设备,BDR。一般用连接这个广播网络/NBMA网络的接口地址表示。比如192.168.23.0/24这个广播网络/NBMA网络的BDR是相连接口地址为192.168.3.1的设备。
- 9)Hello:接口发送Hello报文的时间间隔。
- 10)Dead:接口相连的OSPF邻居失效时间。超过失效时间,如果接口还没有收到邻居设备发来的Hello报文,就表明两端的邻居关系已无效。华为S系列交换机在默认情况下,邻居失效时间为发送Hello报文时间间隔的4倍。
- 11)Poll:NBMA网络上发送轮询Hello报文的时间间隔。在NBMA网络上,当邻居失效后,设备将按轮询时间间隔定期地发送Hello报文。轮询时间间隔值至少应为Hello报文时间间隔的4倍,华为S系列交换机在默认情况下发送轮询Hello报文的时间间隔是发送Hello报文时间间隔的4倍。
- 12)Retransmit:接口没有收到来自对端“LSA已经收到”的确认报文,需要重传LSA的等待时间。
- 13)Transmit Delay:接口发送LSA过程中的传输延迟时间。
OSPF 接口状态机
OSPF设备从接口获取了链路信息后,然后与相邻设备建立邻接连接,交互这些信息。在建立邻接关系之前,邻居设备间需要明确角色分工,才能正常建立连接。那角色分工通过什么来了解呢?其实在图1的接口信息中,我们还有一个非常关键的字段没有介绍,那就是State字段。通过这个字段,我们就可以了解OSPF设备在一段链路中的作用。而这也就是OSPF接口的七般变化。每个设备通过这七般变化,顺势而为,扮演好自己在这段链路中的角色。
OSPF 的邻居和邻接关系

1)邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,比如Hello报文发送间隔、网络类型、IP地址掩码等,如果双方一致就会形成邻居关系,两端设备互为邻居。
2)邻接关系:位于邻居关系之上,如果两端需要进一步交换DD报文、交互LSA信息,才建立邻接关系。
这也就解答了第二篇里面广播链路/NBMA链路的一些疑问。在广播链路/NBMA链路里,因为DROther之间不需要交换LSA信息,所以建立的就是邻居关系。而DR与BDR之间,DR/BDR与DROther之间需要交互LSA信息,所以建立的是邻接关系。如上图所示。
而P2P链路/P2MP链路则只有邻接关系。
后面会介绍到邻居状态机,如果根据邻居状态理解,邻居关系是指邻居状态达到了2-way状态,而邻接关系则需要达到Exstart以上状态。
OSPF 邻居状态机
邻居状态机总共有8种状态:
- Down:邻居会话的初始阶段。表明没有在邻居失效时间间隔内收到来自邻居设备的Hello报文。除了NBMA网络OSPF路由器会每隔PollInterval时间对外轮询发送Hello报文,包括向处于Down状态的邻居路由器(即失效的邻居路由器)发送之外,其他网络是不会向失效的邻居路由器发送Hello报文的。
- Attempt:这种状态适用于NBMA网络,邻居路由器是手工配置的。邻居处于本状态时,路由器会每隔HelloInterval时间向自己手工配置的邻居发送Hello报文,尝试建立邻居关系。
- Init:本状态表示已经收到了邻居的Hello报文,但是对端并没有收到本端发送的Hello报文,收到的Hello报文的邻居列表并没有包含本端的Router ID,双向通信仍然没有建立。
- 2-way:互为邻居。本状态表示双方互相收到了对端发送的Hello报文,报文中的邻居列表也包含本端的Router ID,邻居关系建立。如果不形成邻接关系则邻居状态机就停留在此状态,否则进入Exstart状态。而且DR/BDR只有在邻居状态处于这个状态或者更高的状态才会被选举出来。
- Exstart:协商主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。邻居间从此时才开始正式建立邻接关系。
- Exchange:交换DD报文。本端设备将本地的LSDB用DD报文来描述,并发给邻居设备。
- Loading:正在同步LSDB。两端设备发送LSR报文向邻居请求对方的LSA,同步LSDB。
- Full:建立邻接。两端设备的LSDB已同步,本端设备和邻居设备建立了完全的邻接关系。

OSPF 区域的出现
1、LSDB日益庞大。
随着网络规模日益扩大,当一个大型网络中的路由器都运行OSPF路由协议时,如果所有路由器都运行在同一个区域里,由于OSPF要求同一个区域的所有路由器都具有相同的链路状态数据库,所以此时路由器数量的增多会导致LSDB非常庞大,占用大量的存储空间,并使得运行SPF算法的复杂度增加,导致路由器CPU负担很重。
2、信息传递效率降低。
在大型网络中,拓扑结构发生变化是不可避免的,网络会经常处于“动荡”之中,造成网络中会有大量的OSPF协议报文在传递,这些协议报文占用了业务报文的传输带宽,所以降低了网络的带宽利用率。更为严重的是,每一次变化都会导致网络中所有的路由器重新进行路由计算。
3、网络稳定性降低。
OSPF单区域运行情况下,任何一台路由器的拓扑发生变化都会导致全网的LSA泛洪,网络中所有其他路由器都要重新计算刷新路由。这样势必会影响整个网络运行的稳定性。比如某条链路质量较差,处于闪断中,那么此时整个网络的路由就会长时间处于动荡之中,严重降低了网络的稳定性。

OSPF说的子母连环阵其实就是将一个OSPF网络分为多个区域。如图2所示,OSPF将自治系统划分成不同的区域。区域是从逻辑上将路由器划分为不同的组,每个组用区域号(Area ID)来标识。区域的边界是路由器,而不是链路。一个网段(链路)只能属于一个区域,或者说每个运行OSPF的接口必须指明属于哪一个区域。
骨干区域
OSPF划分区域之后,并非所有的区域都是平等的关系。其中有一个区域其区域号(Area ID)是0,通常被称为骨干区域。骨干区域是连接所有其他OSPF区域的中央区域,骨干区域负责区域之间的路由,非骨干区域之间的路由信息必须通过骨干区域来转发。对此,OSPF有两个规定:
l 所有非骨干区域必须与骨干区域保持连通;
2 骨干区域自身也必须保持连通。
标准区域
标准区域是最通用的区域,它传输区域内路由,区域间路由和外部路由。
特殊区域
OSPF为了进一步精细化管理LSA的传播,还划分了4个特殊区域:
l Stub区域:Stub区域不允许自治系统外部的路由(Type5 LSA)在区域内传播。
2 Totally Stub区域:Totally Stub区域既不允许自治系统外部的路由(Type5 LSA)在区域内传播,也不允许区域间路由(Type3 LSA)在区域内传播。
stub 和Totall-stub 的区别在于,Stub内不能有ASBR,也就是说stub 区域内不允许有路由重分发,而NSSA区域内有ASBR,允许重分发,进入stub区域的外部路由会成为默认路由,Totall-Stub区域内的路由是明细路由,外部区域和其它路由进入Totall-Stub区域会成为默认路由。
3 NSSA区域:NSSA区域允许引入少量通过本区域的ASBR到达的外部路由,但不允许其他区域的外部路由AS-external-LSA(Type5 LSA)在区域内传播。
4 Totally NSSA区域:Totally NSSA区域既不允许其他区域的外部路由ASE LSA(Type5 LSA)在区域内传播,也不允许区域间路由Network-summary-LSA(Type3 LSA)在区域内传播。
OSPF 区域间环路和防环方法
为了避免区域间的环路,OSPF规定直接在两个非骨干区域之间发布路由信息是不允许的,只允许在一个区域内部或者在骨干区域和非骨干区域之间发布路由信息。因此,每个区域边界路由器(ABR)都必须连接到骨干区域。

假设OSPF允许非骨干区域之间直接传递路由,则可能会导致区域间环路。例如图4所示的网络中,骨干区连接到网络N,这个路由信息会传递至区域1,假设非骨干区之间允许直接传递路由信息的话,那么这条路由信息最终又被传递回去,形成区域间的路由环路。为了防止这种区域间环路,在图4这种网络拓扑中,OSPF禁止Area1和Area3,或者Area2和Areea3之间直接交互路由信息,而必须通过Area0这个骨干区域进行路由交互。这样就能防止区域间环路的产生。
OSPF 路由器的角色
| 路由器角色 | 含义 |
| 区域内路由器(Internal Router) | 该类路由器的所有接口都属于同一个OSPF区域。 |
| 区域边界路由器ABR(Area Border Router) | 该类路由器可以同时属于两个以上的区域,但其中一个必须是骨干区域。 ABR用来连接骨干区域和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。 |
| 骨干路由器(Backbone Router) | 该类路由器至少有一个接口属于骨干区域。 所有的ABR和位于骨干区域Area0内部的路由器都是骨干路由器。 |
| 自治系统边界路由器ASBR(AS Boundary Router) | 与其他AS交换路由信息的路由器称为ASBR。 ASBR并不一定位于AS的边界,它可能是区域内路由器,也可能是ABR。 |





可以看到,OSPF的区域划分是基于接口的,同一个路由器的不同接口可以属于不同的区域,每个运行OSPF的接口必须指明属于哪一个区域。
R2作为区域边界路由器(ABR)负责传递区域间路由信息,所以ABR必须同时知道骨干区和标准区域的路由信息。
OSPF 虚电路 Virtual-link
但是在实际应用中,可能会因为各方面条件的限制,无法满足所有非骨干区域与骨干区域保持连通的要求,此时可以通过配置OSPF虚连接来解决这个问题。
虚连接(Virtual link)是指在两台ABR之间通过一个非骨干区域建立的一条逻辑上的连接通道。

可以看到,虚链接的存在增加了网络的复杂程度,而且使故障的排除更加困难。因此,在网络规划中应该尽量避免使用虚链接,设计者应该仅仅把它用来作为修复无法避免的网络拓扑问题的一种临时手段。虚链路可以看作是一个标明网络的某个部分是否需要重新规划设计的标志。
OSPF LSA 类型
记住:LSDB是LSA的汇总
ospf 网络通过LSA 通告形成LSDB ,每种LSA 通告的信息不同,担任的角色 不一
1、Router-LSA:将运行OSPF的网络比作为一个部落,部落划分了很多区域比作村子。那Type 1 LSA就是村子里村民做的自我介绍,这个信息只在这个村子传播,每个村民都了解该村其他村民的信息。
2、Network-LSA:假设DR是一个村子的村长,负责描述与之交互的所有村民的信息。并将这些信息在整个村子里传播
3、Network-summary-LSA :由区域边界路由器ABR发布,用来描述区域间的路由信息,ABR相当于通信联络员,负责村子与村子之间的通信。ABR将一个村子的Type1 Type2的信息进行汇总形成路由信息传递到另外一个村子,另外一个村子同样将该村Type1 Type2的信息进行汇总形成路由信息传递到这个村子。
4、ASBR-Summary-LSA:ASBR也是通信联络员,与ABR不同的是,ASBR是部落间的通信员,负责部落间的通信。一个部落所有村子里的村民如果想要和其他部落通信,必须经过ASBR。ASBR-summary-LSA的作用就是告诉非ASBR所在村的其他村的村民,ASBR在哪,怎么才能去ASBR。
5、AS-external-LSA:
顾名思义,此种LSA是描述到AS外部的路由,由自治系统边界路由器ASBR发布,在整个AS中泛洪(除了STUB区域和NSSA区域,后面章节会详细介绍到)这种很容易理解了,就是部落内任意一个村民到该部落外部的路由。由部落间通信联络员ASBR发布。
6、NSSA-LSA:


OSPF 特殊区域(因地制宜)
为什么要划分特殊区域?目的是减少LSA在区域内的通行数量 。
从网络优化的角度考虑,我们通常在保证网络可达性的同时尽量减小路由表项的规模,尽量减少网络中LSA报文的泛洪
OSPF的Stub区域TotallyStub 区域

这种情况下,就产生了OSPF的第一种类型的特殊区域――Stub区域。 配置Stub之后,自治系统外部的路由就不会在本区域内传播了,但允许区域间的路由传播,这样就减少了Area 2中LSA数量。
对于Area 2中的路由器来说,其实区域间的明细路由它也没必要都了解,仅保留一个出口让Area 2中的路由器的数据包能够出去就足够了。这就产生了OSPF的第二种类型的特殊区域――Totally Stub区域,也叫完全Stub区域。配置了Totally Stub区域以后,既不允许自治系统外部的路由在区域内传播,也不允许区域间路由在区域内传播。这样就能达到进一步减少区域内LSA数量的目的。
OSPF Not-So-Stubby Area区域

假设Area2原来作为一个Stub区域运行,但是某一天有个外部网络需要通过Area2接入到这个OSPF网络。也就是需要将自治域外部路由引入并传播到整个OSPF自治域中,此时可以在RTA上将外部路由注入到OSPF域,但是这种配置将使RTA成为ASBR,因此,Area2也就不是Stub区域了。 针对这种场景,OSPF定义了NSSA区域(Not-So-Stubby-Area NSSA) ,为了容易记忆,大家可以把它叫做“不那么Stub区域”,意思是在Stub区域的基础上做了一定的变通(允许引入外部路由了),所以就变得“不那么Stub”了。类似的,如果想进一步减少LSA数量,可以配置成Totally NSSA区域。