OSPF 协议介绍

本文记录了 OSPF 的基本信息。

开放式最短路径优先协议 OSPF

一、OSPF 简介

OSPF(Open Shortest Path First)开放最短路径优先协议是一个基于链路状态的自制系统内部网关协议,使用链路状态路由(LSR)算法,直接工作在 IP 层上。在网络中使用 OSPF 协议后,大部分路由将根据 OSPF 协议自行计算和生成,无需人工配置。当网络拓扑发生变化时,OSPF 协议可以自动计算、更正路由,方便了实际的网络管理。

OSPF 从可用路由器收集链路状态信息并构建网络拓扑图,该拓扑以路由表的形式呈现给 Internet 层,通过该路由表根据数据包的 IP 地址路由数据包。OSPF 基于 Dijkstra 算法计算每条路线的最短路径树。构建路由表的 OSPF 路由策略由每个路由接口关联的链路度量来管理,可考虑的成本因素包括了路由器的距离(往返时间)、链路的吞吐量、链路可用性等。

OSPF 的基础术语包括了:

  • Router-ID:路由器标识符,用于在 OSPF 域中唯一地标识一台路由器
  • 度量值:OSPF 使用 Cost(开销)作为路由的度量值,每一个激活了 OSPF 的接口都会维护一个接口 Cost值,接口 Cost 值 = OSPF 指定的缺省参考值/接口带宽。其中,Cost 也可以手动配置

二、OSPF 的 5 种报文

与 UDP、TCP 等其他的路由协议不同,OSPF 不通过传输协议传输数据。OSPF 直接生成 IP 数据报,定义了 5 种不同的消息类型用于各种类型的通信:

2.1 Hello 包

OSPF 的 Hello 消息作为一种问候形式让路由器得以发现其本地链路和网络上的其他相邻路由器,这些消息在相邻设备之间建立邻接关系并传达如何在自治系统中使用 OSPF 的关键参数。在正常运行期间,路由器会定期向其邻居节点发送 Hello 消息。如果相邻路由器停止接收来自邻居节点的 Hello 消息,则在设定的时间段后,判断邻居路由器已关闭。

2.2 数据库描述消息 Database Description

数据库描述消息包含自治系统的拓扑描述,描述消息将该区域的链路状态数据库(LSDB)的内容从一台服务器传送到另一台服务器。

2.3 链路状态数据消息

一个路由器使用链路状态请求消息向另一台路由器请求有关 LSDB 的一部分更新信息(链路状态信息 LSA)。该消息指定了请求设备希望获得更多最新信息的链接。

链路状态更新消息包含有关 LSDB 上某些链路状态的更新信息,用以响应链路状态请求信息。链路状态更新信息由路由器定期广播和多播。LSU 的内容将被用于更新接收他们的路由器的 LSDB 信息。

链路状态确认信息通过明确确认已经收到 LSU 信息来保障链路状态交换过程的可靠性。

三、OSPF 的 3 步工作过程

3.1 发现邻居

OSPF 路由器通过组播 hello 包, 通过同一个广播域内的接口建立一组邻居关系,如下图所示。所有的邻居都可能与自己交换链路信息。

发现邻居

在这一过程中,OSPF 存在 4 种不同的状态

  1. Down 状态:邻居的初始状态,表示没有从邻居收到任何消息。在 NBMA(非广播-多路访问网络)网络上,此状态下仍然可以向静态配置的邻居发送 Hello 报文,发送间隔为 PollInterval,通常与 Router DeadInterval 间隔相同。
  2. Attempt 状态:该状态只在 NBMA(非广播-多路访问网络)中存在,表示没有收到邻居的任何信息,但是已经周期性地向邻居发送报文,发送间隔为 HelloInterval。如果在 Router DeadInterval 间隔内未收到邻居的 Hello 报文,则转换为 Down 状态。
  3. Init 状态:路由器已经从邻居收到了 Hello 报文,但是自己的 Router ID 不再所收到的 Hello 报文的邻居列表中,表示尚未与邻居建立双向通信关系。
  4. 2-Way 状态:路由器发现自己的 Router ID 存在于收到的 Hello 报文的邻居列表中,已确认可以双向通信。

3.2 建立邻接关系

只有建立了邻接关系的邻居路由器才会交换链路状态信息。为了提高链路状态信息的交换效率,OSPF 采用的是 DR/BDR 方式建立连接关系。这种方式在同一个广播域的接口中选举一个组长 DR(Designated Router,指定路由器) 和一个副组长 DBR(Backup Designated Router,备份指定路由器)。网络中的所有路由器只与 DR 和 BDR 建立邻接关系,即所有的信息只会与 DR 和 DBR 交换。这种做法大大减少了网络中的邻接关系数,如下图所示。

邻接关系数

需要注意的是,在广播型网络中 OSPF 才会选择 DR 和 BDR,而在 P2P 网络中不会选举 DR 和 BDR。

建立邻接关系的过程如下所示:

建立邻接关系

在上述过程中,Router 1 首先发送一个 DD 报文,宣称自己是 Master(MS = 1),并规定序列号 Seq = X。I = 1 表示这是第 1 个 DD 报文,M = 1 说明这不是最后一个报文。之后每发送一个新的 DD 报文,Seq 都要加 1。另一方 Slave 方每次发送 DD 报文时使用接受到的上一个 Master 的 DD 报文中的 Seq。

Router 2 在收到 Router 1 的 DD 报文后,将 Router 1 的邻居状态机改为 Exstart,并回应了一个 DD 报文。该 DD 报文中同样把不含有LSA 的摘要信息。由于 Router 2 的 Router ID 较大,所以在报文中 Router 2 认为自己是 Master,并且重新规定序列号 Seq = Y。

Router 1 收到报文后,同意 Router 2 作为 Master 并将 Router 2 的邻居状态机修改为 Exchange。Router 1 使用 Router 2 的序列号 Seq = Y 来发送新的 DD 报文,该报文开始正式传送 LSA 的摘要。在该报文中,Router 1 将 MS 赋值为 0,表示自己是 Slave。

Router 2 收到报文后,发送新的 DD 报文来描述自己的 LSA 摘要,此时 Router 2 发送的报文序列号为 Seq = Y + 1。

上述过程持续进行,Router 1 通过重复 Router 2 的序列号来确认已经收到 Router 2 的报文,Router 2 通过将序列号 Seq 加 1 来确认已收到 Router 1 的报文。当 Router 2 发送最后一个 DD 报文时,在报文中写上 M = 0。

在这一过程中,OSPF 也存在 4 种不同的状态

  1. ExStart 状态:路由器开始向邻居发送 DD 报文(数据库摘要报文)。Master/Slave 主从关系也是在这个状态下形成的,初始 DD 序列号也是在此状态下确定的。在该状态下发送的 DD 报文不包括 LSA 摘要信息。
  2. Exchange 状态:路由器与邻居之间互相发送包含 LSA 摘要的 DD 报文。
  3. Loading 状态:在此状态下,路由器与邻居之间互相发送 LSR、LSU、LSAck 报文。假设 Router 1 向 Router 2 请求更新 LSA,则由 Router 1 先向 Router 2 发送 LSR 请求,Router 2 用 LSU 报文回应 Router 1 的请求。Router 1 收到后,发送 LSAck 报文进行确认。
  4. Full 状态:LSDB 同步过程完成,路由器与邻居之间形成了完全的邻接关系。

3.3 交换链路状态信息

每台 OSPF 路由器都存在一个 LSDB(Link State Database,链路状态数据库),LSDB 中的每一条数据都是一个 LSA(Link State Advertisement,链路状态公告),用来描述链路状态信息,例如网络中某台路由器的 ID、OSPF 接口、直连的网段、路径开销等。

OSPF 路由器的链路状态信息更新方式为触发更新或每隔 30 分钟更新一次。其中,触发更新指当网络发生变化的时候,不需要等到 30 分钟的更新周期就立即向邻居节点发送信息。OSPF 的状态更新采用增量更新机制,只发邻居需要的 LSA。当状态收敛以后,区域内的所有路由器都具有相同的 LSDB。这时候的 LSDB 能体现全区域的网络拓扑结构,包括了网络中路由器个数、路由器 ID、每台路由器的直连网段、开销等。

交换链路状态信息的过程如下图所示。

交换链路状态信息

3.4 计算路由

每台路由器都会根据自己的 LSDB 独立计算路由。路由器将 LSDB 中的 LSA 信息转换为网络的带权有向图后,以自己为根结点通过 Dijkstra 算法计算最短路径树,如下图所示。

计算路由

3.5 OSPF 的区域管理制度

在 OSPF 工作过程中采用了分区域的管理制度,如下图所示。不同的两个区域之间通过区域边界路由器 ABR 所连接。在同一个区域内的路由器才会建立邻居关系,交换 LSA。收敛后,同一个区域内的所有设备具有相同的 LSDB,这个 LSDB 反映了区域内的链路状态,再计算区域内的路由。不同区域之间,由区域边界路由器 ABR 直接转发路由。

OSPF 的区域管理制度

此外,每个区域有一个 32 位二进制的 ID,可以表示为一个十进制数,也可以表示为点分十进制形式。例如,区域 0 等价于区域 0.0.0.0,区域 1 等价于区域 0.0.0.1。需要注意的是,区域 0 是 OSPF 网络的骨干区域,除区域 0 以外的区域都是非骨干区域。非骨干区域之间不能直接通信,需要通过骨干区域 0 进行转发,以防止产生环路路由。如果一个网络中有不同的 OSPF 区域,那么一定有一个区域是区域 0。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lgc0208@foxmail.com
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信