OSPF 协议

2025年3月17日 | 阅读 8 分钟

OSPF 的全称是 开放最短路径优先。它是一个被广泛使用和支持的路由协议。它是一种域内协议,这意味着它在单个区域或网络内部使用。它是一种内部网关协议,设计用于单个自治系统内。它基于链路状态路由算法,其中每个路由器都包含有关每个域的信息,并根据这些信息确定最短路径。路由的目标是学习路由。OSPF 通过学习整个网络内的所有路由器和子网来实现这一目标。每个路由器都拥有关于网络的相同信息。路由器通过发送 LSA(链路状态通告)来学习这些信息。这些 LSA 包含有关每个路由器、子网和其他网络信息。一旦 LSA 被泛洪,OSPF 就会将信息存储在称为 LSDB 的链路状态数据库中。主要目标是使 LSDB 中的每个路由器拥有相同的信息。

OSPF 区域

OSPF Protocol

OSPF 将自治系统划分为区域,区域是网络、主机和路由器的集合。就像互联网服务提供商将互联网划分为不同的自治系统以便于管理一样,OSPF 进一步将自治系统划分为区域。

位于区域内的路由器会将路由信息泛洪到该区域。

区域内还存在特殊路由器。特殊路由器是指位于区域边界的路由器,这些特殊路由器称为区域边界路由器。该路由器会汇总关于某个区域的信息,并与其他区域共享信息。

自治系统内的所有区域都连接到骨干路由器,这些骨干路由器属于主区域。主区域的作用是在不同区域之间提供通信。

OSPF 如何工作?

OSPF 的工作原理可以通过以下三个步骤来解释:

步骤 1:第一步是建立 OSPF 邻居关系。在同一链路上运行 OSPF 的两个连接的路由器会创建邻居关系。

步骤 2:第二步是交换数据库信息。建立邻居关系后,两个路由器会相互交换 LSDB 信息。

步骤 3:第三步是选择最佳路由。在相互交换 LSDB 信息后,路由器会根据 SPF 计算选择最佳路由添加到路由表中。

路由器如何形成邻居关系?

在建立关系之前发生的第一个事件是每个路由器选择其 路由器 ID

路由器 ID (RID):路由器 ID 是一个唯一标识网络中每台路由器的数字。路由器 ID 的格式为 IPv4 地址。设置路由器 ID 有几种方法,第一种方法是手动设置路由器 ID,另一种方法是让路由器自行决定。

路由器选择路由器 ID 的逻辑如下:

  • 手动分配:路由器检查路由器 ID 是否手动设置。如果手动设置,则它就是路由器 ID。如果未手动设置,则它会选择具有最高“up”状态的回环接口 IP 地址。如果没有回环接口,则它会选择具有最高“up”状态的非回环接口 IP 地址。

通过点对点连接或多台路由器连接在一起的两个路由器可以通过 OSPF 协议进行通信。当两个路由器相互发送 HELLO 数据包时,它们才是相邻的。当两个路由器都收到 HELLO 数据包的确认后,它们就进入双向状态。由于 OSPF 是一种链路状态路由协议,因此它允许路由器之间建立邻居关系。当两个路由器属于同一子网、共享相同的区域 ID、子网掩码、计时器和身份验证时,它们才能成为邻居。OSPF 关系是一种在路由器之间建立的关系,以便它们可以相互了解。当至少一台路由器是网络中的指定路由器或备份指定路由器时,或者通过点对点链接连接时,两个路由器可以成为邻居。

OSPF 链路类型

链路基本上是一种连接,因此两条路由器之间的连接称为链路。

OSPF 中有四种链路类型:

  1. 点对点链路:点对点链路直接连接两条路由器,中间没有任何主机或路由器。
  2. 临时链路:当网络中有多个路由器连接时,它们被称为临时链路。
    临时链路有两种不同的实现方式:
    不现实的拓扑:当所有路由器都相互连接时,这被称为不现实的拓扑。
    现实的拓扑:当网络中存在某个指定路由器时,这被称为现实的拓扑。这里的指定路由器是所有路由器都与之连接的路由器。路由器发送的所有数据包都将通过指定路由器。
  3. 存根链路:它是连接到单个路由器的网络。数据通过单个路由器进入网络,并从同一路由器离开网络。
  4. 虚拟链路:如果两条路由器之间的链路断开,管理员会在路由器之间创建一个虚拟路径,该路径可能很长。

OSPF 消息格式

OSPF 消息格式包含以下字段:

OSPF Protocol
  • 版本:这是一个 8 位字段,指定 OSPF 协议版本。
  • 类型:这是一个 8 位字段。它指定 OSPF 数据包的类型。
  • 消息:这是一个 16 位字段,定义消息的总长度,包括报头。因此,总长度等于消息和报头长度的总和。
  • 源 IP 地址:它定义了发送数据包的地址。它是发送路由器的 IP 地址。
  • 区域标识:它定义了路由发生的区域。
  • 校验和:用于错误纠正和错误检测。
  • 身份验证类型:有两种身份验证类型,即 0 和 1。其中,0 表示无,表示没有可用的身份验证;1 表示密码,表示基于密码的身份验证。
  • 身份验证:这是一个 32 位字段,包含实际的身份验证数据值。

OSPF 数据包

OSPF 中有五种不同类型的数据包:

  • Hello
  • 数据库描述
  • 链路状态请求
  • 链路状态更新
  • 链路状态确认

下面我们详细讨论每种数据包。

1. Hello 数据包

Hello 数据包用于建立邻居关系并检查邻居的可达性。因此,当需要建立路由器之间的连接时,就会使用 Hello 数据包。

2. 数据库描述

建立连接后,如果邻居路由器是第一次与系统通信,它会发送关于网络拓扑的数据库信息给系统,以便系统可以相应地更新或修改。

3. 链路状态请求

路由器发送链路状态请求以获取特定路由的信息。假设有两个路由器,即路由器 1 和路由器 2,路由器 1 想要了解路由器 2 的信息,因此路由器 1 向路由器 2 发送链路状态请求。当路由器 2 收到链路状态请求后,它会将链路状态信息发送给路由器 1。

4. 链路状态更新

路由器使用链路状态更新来通告其链路的状态。如果任何路由器想广播其链路的状态,它就会使用链路状态更新。

5. 链路状态确认

链路状态确认通过强制每台路由器在每次链路状态更新时发送确认来提高路由的可靠性。例如,路由器 A 将链路状态更新发送给路由器 B 和路由器 C,然后路由器 B 和 C 会将链路状态确认发送给路由器 A,这样路由器 A 就会知道两台路由器都已收到链路状态更新。

OSPF 状态

运行 OSPF 协议的设备会经历以下状态:

  • Down:如果设备处于 Down 状态,则表示尚未收到 HELLO 数据包。这里的 Down 并不意味着设备物理上已关闭;它意味着 OSPF 进程尚未启动。
  • Init:如果设备处于 Init 状态,则表示设备已收到来自另一台路由器的 HELLO 数据包。
  • 2WAY:如果设备处于 2WAY 状态,则表示两台路由器都已收到来自另一台路由器的 HELLO 数据包,并且路由器之间的连接已建立。
  • Exstart:一旦路由器之间的交换开始,两台路由器都会进入 Exstart 状态。在此状态下,根据路由器的 ID 来选择主控方和从属方。主控方控制序列号,并启动交换过程。
  • Exchange:在 Exchange 状态下,两台路由器会相互发送一份包含数据库描述的 LSA 列表。
  • Loading:在 Loading 状态下,会交换 LSR、LSU 和 LSA。
  • Full:一旦 LSA 的交换完成,路由器就会进入 Full 状态。

路由器属性

在进入 Extract 状态之前,OSPF 会选择一台路由器作为指定路由器,另一台路由器作为备份指定路由器。这些路由器不是类型,而是路由器的属性。在广播网络的情况下,路由器会选择一台路由器作为指定路由器,另一台作为备份指定路由器。选举指定路由器和备份指定路由器是为了避免网络中的泛洪并最小化邻接数量。它们充当所有路由器之间交换路由信息的中心点。由于点对点链路是直接连接的,因此不选举 DR 和 BDR。

如果没有选举 DR 和 BDR,路由器会将更新发送给所有相邻的邻居,从而导致网络泛洪。为了避免这个问题,会选举 DR 和 BDR。每个非 DR 和非 BDR 只将更新发送给 DR 和 BDR,而不是与网络段中的其他路由器进行交换。DR 然后将网络拓扑信息分发给同一区域内的其他路由器,而 BDR 则充当 DR 的替代品。BDR 也会接收来自所有路由器的路由信息,但它不会分发这些信息。它仅在 DR 发生故障时分发信息。

非 DR 和非 BDR 使用多播地址 224.0.0.6 将路由信息发送给 DR 和 BDR。DR 和 BDR 使用多播地址 224.0.0.5 发送路由信息。

根据以下规则选举 DR 和 BDR:

  • 具有最高 OSPF 优先级的路由器被选为 DR。默认情况下,最高优先级设置为 1。
  • 如果没有最高优先级,则具有最高路由器 ID 的路由器被选为 DR,具有第二高优先级(在此上下文中,指第二高路由器 ID)的路由器被选为 BDR。

让我们通过一个例子来理解这种情况。

OSPF Protocol

在上图中,R1 被选为 DR,R2 被选为 BDR,因为 R1 具有最高的路由器 ID,而 R2 具有第二高的路由器 ID。如果 R4 和系统之间的链路发生故障,则 R4 只会将其链路故障更新给 R1 和 R4。然后,DR 会将更改更新给所有非 DR 和非 BDR,在这种情况下,除了 R4,只有 R3 可用作非 DR 和非 BDR。


下一主题停止等待协议