OSPF基础及配置
本笔记摘自:朱仕耿 老师的 《HCNP路由交换学习指南》
OSPF(Open Shortest Path First,开放式最短路径优先)是一种典型的链路状态路由协议,由IETF(Internet Engineering Task Force,国际互联网工程任务组)的OSPF工作小组开发,是目前业内使用最为广泛的IGP(Interior Gateway Protocol,内部网关协议)之一。
与距离矢量路由协议不同,运行链路状态路由协议的路由器知晓整个网络的拓扑结构,这使得路由更不易发生环路。
运行链路状态路由协议的路由器之间首先会建立邻居关系,之后开始交互链路状态(Link-State,LS)信息,而不是直接交互路由。
您可以简略地将链路状态信息理解为每台路由器都会产生的、描述自己直连接口状况(包括接口的开销、与邻居路由器之间的关系或网段信息等)的通告。
更通俗点的讲法是,每台路由器都产生一个描述自己家门口情况的通告。
这些通告会被泛洪到整个网络,从而保证网络中的每台路由器都拥有对该网络的一致认知。
路由器将这些链路状态信息存储在LSDB(Link-State Database,链路状态数据库)之中,LSDB内的数据有助于路由器还原全网的拓扑结构(如下图所示)。
接下来,每台路由器都基于LSDB使用相同算法进行计算,计算的结果是得到一棵以自己为根的、无环的最短路径“树”。
有了这棵“树”,事实上路由器就已经知道了到达网络各个角落的最优路径。
最后,路由器将计算出来的最优路径(路由)加载到自己的路由表。

OSPF相关知识点
● 理解OSPF Router-ID的概念;
● 学会查看OSPF的三张表;
● 理解OSPF路由Cost的概念及作用;
● 熟悉OSPF的五种报文及其功能;
● 理解OSPF网络类型的概念及意义;
● 理解OSPF DR、BDR的概念及意义;
● 理解OSPF区域的概念,以及区域划分的意义,并熟悉多区域OSPF部署的注意事项;
● 熟悉各种OSPF路由器角色。
Router-id
Router-ID(Router Identification,路由器标识), 用于在OSPF域(Domain)中唯一地标识一台OSPF路由器。
使用32位与ip4地址格式一样的格式进行表示。
OSPF要求路由器的Router-ID必须全域唯一,即在同一个域内不允许出现两台OSPF路由器拥有相同的Router-ID的情况。
如果在创建OSPF进程时没有手工指定Router-ID,则系统会自动选择设备上的一个IP地址作为Router-ID。
一个常见的做法是,将设备的OSPF Router-ID指定为该设备的Loopback接口(本地环回接口)的IP地址。
手工指定OSPF Router-ID的示例如下:

Loopback接口也即本地环回接口,是一种软件的、逻辑的接口.
实际上不光是网络设备支持Loopback接口,很多主机(例如Windows或Linux主机)也同样支持。
用户可以根据业务需求,在网络设备上创建Loopback接口,并为该接口配置IP地址。
Loopback接口非常稳定,除非人为地进行关闭或删除,否则是永远不会失效的。
正因如此,Loopback接口通常用于设备网管、网络测试、网络协议应用等。
OSPF的三张表
- 邻居表(Peer Table或Neighbor Table)
- 链路状态数据库(Link-State Database,LSDB)
- OSPF路由表(Routing Table)
邻居表
在OSPF交互链路状态通告之前,两台直连路由器需建立OSPF邻居关系。
当一个接口激活OSPF后,该接口将周期性地发送OSPF Hello报文,同时也开始侦听Hello报文从而发现直连链路上的邻居。
邻居的信息会被写入路由器的OSPF邻居表。
使用 display ospf peer命令可查看设备的OSPF邻居表。

每台OSPF路由器都与其邻居建立会话,每个会话都使用一个“邻居数据结构”来描述,这些数据结构是与路由器的接口相关联的,它们描述了这个邻居的状态、主/从(Master/Slave)关系、Router-ID、DR优先级(若有)、接口IP地址等信息,OSPF邻居表则汇总了这些信息,统一将路由器所有邻居的相关数据展示出来。
链路状态数据库
运行链路状态路由协议的路由器在网络中泛洪链路状态信息,在OSPF中,这些信息被称为LSA(Link-State Advertisement,链路状态通告),路由器将网络中的LSA搜集后装载到自己的LSDB中,因此LSDB可以当作是路由器对网络的完整认知。
使用 display ospf lsdb 命令可以查看设备的LSDB

路由表
使用 display ospf routing 命令可以查看设备的OSPF路由表,也就是设备通过OSPF所发现的路由。

OSPF根据LSDB中的数据,运行SPF算法并且得到一棵以自己为根的、无环的最短路径树,基于这棵树,OSPF能够发现到达网络中各个网段的最佳路径,从而得到路由信息并将其加载到OSPF路由表中。
当然,这些OSPF路由表中的路由最终是否会被加载到全局路由表,还要经过进一步比较路由优先级等过程。
度量值
OSPF使用Cost(开销)作为路由度量值,所谓开销,亦可理解为成本或者代价,Cost值越小,则路径(路由)越优。
首先每一个激活OSPF的接口都拥有一个接口级别的Cost值,这个值等于 OSPF带宽参考值/接口带宽,取计算结果的整数部分,当结果小于1时,值取1。
OSPF报文及格式
OSPF协议基于IP运行,协议的数据报文直接采用IP封装,在IP报文头部中对应的协议号为89。
多数情况下,OSPF的协议报文使用组播地址作为目的IP地址,以下两个组播IP地址被保留专用于OSPF。
● 224.0.0.5:该组播IP地址意指所有的OSPF路由器。
● 224.0.0.6:该组播IP地址意指所有的OSPF DR路由器。
⚡️ OSPF一共定义了五种报文:

- 路由器的接口一旦激活OSPF,就会开始发送Hello报文。
- DD报文用于发送LSA的头部摘要。
- LSR用于向对方请求完整的LSA。
- LSU则用于对LSR进行回应,或者主动更新LSA。
- LSAck用于保证OSPF更新机制的可靠性。
所有的OSPF报文都有统一的头部,这个头部的长度为24byte:

邻居关系和邻接关系
考虑一种最简单的网络拓扑:两台路由器通过网线直连,在双方互联的接口上激活OSPF,路由器的接口激活OSPF后开始发送及侦听Hello报文,在通过Hello报文发现彼此并确认双向通讯后,这两者便形成了邻居关系。
但这只是一个开头,一系列的报文交互和邻居状态的切换会在接下来的过程中继续发生,两台路由器会开始交互空的DD报文协商Master/Slave,再交互包含LSA头部的DD报文以便描述自己的LSDB,然后通过LSR及LSU报文交互双方的LSA。
当两者的LSDB同步完成后,两台路由器形成了对网络拓扑的一致认知,并开始独立计算路由。此时,我们称这两台路由器形成了邻接关系。
一般来讲,只有邻居双方的状态都为**Full(全毗邻)**时,我们才认为网络是收敛完毕的。

网络类型
OSPF的许多功能或特性都是基于接口实现的,当一个接口激活OSPF后,该接口会维护许多OSPF变量,例如其所接入的区域ID、接口Cost值、DR优先级、邻居列表、认证类型等。
接口的网络类型(Network-Type)也是其中之一,而且是一个非常重要的变量。
在接口配置视图中使用 ospf network { p2p | p2mp | broadcast | nbma } 即可修改该接口的网络类型。
当然,在链路中某一侧的接口上修改了网络类型后,记得修改另一侧的接口,两边的网络类型需确保一致。
点对点类型(Point-to-Point,P2P)
点到点网络指的是在一段链路上只能连接两台路由器的环境。
当两台路由器通过PPP链路直连时,设备接口上采用的封装协议就是PPP,当这个接口激活OSPF后,OSPF会自动根据该接口的数据链路层封装将其网络类型设置为P2P。
OSPF在网络类型为P2P的接口上以组播的方式(相应的组播IP地址为224.0.0.5)发送协议报文(Hello报文、DD报文、LSR报文、LSU报文以及LSAck报文)。
缺省情况下,P2P类型的接口以10s为间隔周期性地发送Hello报文。
OSPF在P2P类型的网络中不会选举DR及BDR。
广播型多路访问类型(Broadcast Multi-Access,BMA)
BMA(或者称为Broadcast)是一个支持广播的网络环境,该网络允许多台路由器接入,任意两台路由器之间都能直接进行二层通信,一台路由器发送出去的广播数据会被所有其他的路由器收到。
OSPF在BMA类型的接口上通常以 组播的方式发送Hello报文、LSU报文及LSAck报文,以 单播的形式发送DD报文及LSR报文。
当使用组播的方式发送协议报文时,有两个组播地址可能会被使用到——224.0.0.5及224.0.0.6。
当路由器需要向DR以及BDR发送OSPF报文时,使用224.0.0.6这个组播地址作为报文的目的IP地址;
当需要向所有的OSPF路由器发送报文时,使用224.0.0.5。
缺省情况下,Broadcast类型的接口以10s为间隔周期性地发送Hello报文。
非广播型多路访问类型(Non-Broadcast Multi-Access,NBMA)
NBMA网络也允许多台路由器接入,但是该网络不具备广播能力.
NBMA网络的一个最为大家熟知的代表是帧中继(Frame-Relay),另一个例子是X.25。
缺省情况下,NBMA类型的接口以30s为间隔周期性地发送Hello报文。
点对多点类型(Point-to-Multipoint,P2MP)
P2MP并非路由器根据接口的数据链路层封装自动设置的,而是必须通过网络管理员手工指定的。
P2MP有点类似于将多条P2P链路的一端进行捆绑得到的网络。
在P2MP网络中无需选举DR、BDR。
OSPF在P2MP类型的接口上通常以组播的方式发送Hello报文,以单播的方式发送其他报文。
缺省情况下,Hello报文的发送间隔为30s。
DR及BDR的概念
多路访问(Multiple-Access,简称MA)网络指的是在同一个共享介质中连接着多个设备的网络,在这个网络中,任意两台设备之间都能够直接地进行二层通信。
多路访问网络有两种,一种是广播型多路访问(Broadcast Multiple-Access,BMA)网络,例如以太网。
另一种则是非广播型多路访问(Non-Broadcast Multiple-Access,NBMA)网络,例如帧中继。
BMA网络的一个典型示例是一台以太网交换机连接着多台路由器,这些路由器的接口具备从这个网络访问其他路由器的能力,若有一个广播数据被发出,则整个网络中的路由器都会收到。
现在假设有多台路由器接入到同一台以太网交换机,这些路由器的接口都配置同一个网段的IP地址(如图所示),并且都在接口上激活OSPF。
完成上述操作后,组播Hello报文立即开始在网络中交互,设想一下如果这些路由器的接口两两建立OSPF邻接关系,这就意味着网络中共有n(n-1)/2个邻接关系(n为路由器的个数)。
维护如此多的邻接关系不仅仅额外消耗设备资源,也增加了网络中LSA的泛洪数量。
为优化该场景下的OSPF邻接关系数量,并减少不必要的协议流量,OSPF会在每一个MA网络中选举一个DR(Designated Router,指定路由器)和一个BDR(Backup Designated Router,备用指定路由器)。

我们把既不是DR又不是BDR的路由器称为DROther,MA网络中的所有DROther都只和DR以及BDR建立OSPF邻接关系.
BDR也与DR建立邻接关系,而DROther之间只停留在2-Way状态。如此一来,网络中的路由器所需维护的邻接关系数量便得到了优化。

DR在网络中的LSDB同步方面有着关键性的作用,它负责侦听网络中的拓扑变更信息并将变更信息通知给其他路由器。
它为网络生成Type-2 LSA(一种LSA类型),在该LSA中显示出了连接在这个MA网络的所有OSPF路由器的Router-ID,其中也包括DR自己。
BDR会监控DR的状态,并在当前DR发生故障时接替它的工作。
DR、BDR的选举是通过Hello报文来实现的,选举过程发生在2-Way状态之后。
路由器将自己接口的DR优先级填写在Hello报文的“DR优先级”字段之中。
华为数通产品的接口DR优先级缺省为1,这个值可以通过 ospf dr-priority命令修改(该命令需在接口视图下执行),取值范围是0~255。
DR优先级为0的接口不具备DR及BDR选举资格。
当接口激活OSPF后,它首先会检查网络上是否已经存在DR,如果是则接受已经存在的DR(因此DR的角色不具备可抢占性),否则拥有最高DR优先级的路由器将成为DR,当DR优先级相等时,拥有最大Router-ID的路由器将成为DR。
除了DR的选举,OSPF还会进行BDR的选举,BDR的选举过程与DR类似
DR及BDR是一个接口级别的概念.
在路由器上,使用 display ospf interface命令可以查看某个特定接口的OSPF信息。例如:

区域的概念
我们把一系列连续的OSPF路由器组成的网络称为OSPF域(Domain)。
当网络的规模变得越来越大时,每台路由器所维护的LSDB也逐渐变得臃肿,而基于这个庞大的LSDB进行的计算也势必需要耗费更多的设备资源,这无疑将导致设备的负担加大。
基于上述考虑,OSPF引入了**区域(Area)**的概念。
域和区域的关系类似城市与其下辖的行政区的关系。
在一个较大规模的网络中,我们会把整个OSPF域切割成多个区域,这就相当于一个城市拥有多个行政区。
某些LSA的泛洪被限制在单个区域内部,同一个区域内的路由器维护一套相同的LSDB,它们对这个区域内的网络有着一致的认知。
每个区域独立地进行SPF计算。
区域内的拓扑结构对于区域外部而言是不可见的,而且区域内部拓扑变化的通知可以被局限在该区域内,从而避免对区域外部造成影响。
⚡️ 如果一台路由器的多个接口分别接入了多个不同的区域,则它将为每个区域分别维护一套LSDB。
多区域的设计极大程度地限制了LSA的泛洪,有效的把拓扑变化的影响控制在区域内,另外在区域边界路由器上可以通过执行路由汇总来减少网络中的路由条目数量。
OSPF的每一个区域都有一个编号,不同的编号表示不同的区域,这个区域编号也被称为区域ID(Area-ID)。
OSPF的区域ID是一个32bit的非负整数,按点分十进制的形式(与IPv4地址的格式一样)呈现. 例如: Area0.0.0.1。
为了简便起见,我们也会采用十进制的形式来表示,这里是几个例子:Area0.0.0.1等同于Area1,Area0.0.0.255等同于Area255,Area0.0.1.0等同于Area256。
一个OSPF域中允许存在多个区域,就像一个城市可以包含多个行政区,而每个城市都有一个中心区,类似于枢纽的概念。
对于OSPF而言,这就是骨干区域——Area0(或者Area0.0.0.0)。
OSPF要求域中的所有非骨干区域(区域ID不为0的区域)都必须与Area0相连。
一个域中如果存在多个区域,那么必须有而且只能有一个Area0,Area0负责在区域之间发布路由信息。
为避免区域间的路由形成环路,非骨干区域之间不允许直接相互发布区域间的路由。
因此,所有的ABR(Area Border Router,区域边界路由器)都至少有一个接口属于Area0,所以Area0始终包含所有的ABR。

任何一个非骨干区域都必须与Area0相连,而当网络中某个区域没有与Area0直接相连时,该区域的路由计算就会出现问题。
OSPF路由器的角色
在OSPF中,存在多种路由器角色,每种路由器在OSPF网络中都发挥着不同的作用。
值得强调的是,OSPF不仅仅能够被部署在路由器上,实际上这个公有协议在许多交换机、防火墙产品,甚至Linux主机上都能被实现,因此所谓的“OSPF路由器”角色,实际上是以路由器作为代表。
- 内部路由器(Internal Router,IR): 所有接口都接入同一个OSPF区域的路由器。
- 区域边界路由器(Area Border Router,ABR)
接入多个区域的路由器。并非所有接入多个区域的路由器都是ABR,它必须有至少一个接口在Area0中激活,同时还有其他接口在其他区域中激活。ABR负责在区域之间传递路由信息,因此ABR必须连接到Area0,同时连接着其他区域。
- 骨干路由器(Backbone Router,BR)
接入Area0的路由器。一台路由器如果所有的接口都接入Area0,那么它就是一台骨干路由器,另外ABR也是骨干路由器。
- AS边界路由器(AS Boundary Router,ASBR)
工作在OSPF自治系统(Autonomous System,AS)边界的路由器。
ASBR一定是将外部路由重分发到OSPF,或者执行了路由重分发操作的路由器。