
一、OSPF 概述OSPFOpen Shortest Path First开放最短路径优先是一种典型的链路状态型动态路由协议。OSPF 存在OSPFv2和OSPFv3两个主要版本OSPFv2主要用于 IPv4OSPFv3主要用于 IPv6OSPF 的核心思想可以概括为路由器之间建立邻居关系交换链路状态信息形成 LSDB再通过 SPF 算法计算最优路径最终将路由加入路由表。整体过程建立邻居 ↓ 交换链路状态信息 ↓ 生成 / 泛洪 LSA ↓ 建立 LSDB ↓ 运行 SPF 算法 ↓ 计算最优路径 ↓ 将最优路由加入路由表二、OSPF 基本概念1. OSPF 区域OSPF 可以将一个大型网络划分为多个区域。Area 0骨干区域除 Area 0 以外的区域非骨干区域区域划分的主要作用减少单个区域 LSDB 的规模降低 SPF 计算压力减少路由表规模提高大型网络的可扩展性区域划分规则骨干区域必须保持连续非骨干区域之间的通信通常需要经过骨干区域非骨干区域需要连接到骨干区域2. Router IDRouter ID是 OSPF 路由器的唯一标识。同一个 OSPF 域中Router ID 不能重复。Router ID 可以手动配置系统自动生成实际部署中通常推荐手动配置这样可以避免设备接口状态变化导致 Router ID 发生变化。华为设备配置示例[R1] ospf 1 router-id 1.1.1.1[R1] ospf 1 router-id 1.1.1.1其中ospf 1创建并进入 OSPF 进程 1router-id 1.1.1.1指定 Router ID3. OSPF CostOSPF 使用 **Cost开销**作为路径度量值。Cost 与接口带宽有关。原文采用的计算方式为Cost 100 Mbit/s ÷ 接口带宽Cost 100 Mbit/s ÷ 接口带宽例如100 Mbit/s ÷ 1000 Mbit/s 0.1100 Mbit/s ÷ 1000 Mbit/s 0.1实际设备通常会按照设备实现规则取整因此千兆接口常见 Cost 为1。三、OSPF 报文OSPF 常见的报文类型有 5 种报文名称主要作用HelloHello Packet发现、建立和维护邻居关系DDDatabase Description描述 LSDB 的摘要信息LSRLink State Request请求缺少的 LSALSULink State Update发送完整的 LSALSACKLink State Acknowledgment确认收到 LSA可以这样理解Hello ↓ 发现 / 建立邻居 DD ↓ 告诉对方“我有哪些 LSDB 信息” LSR ↓ 告诉对方“这些 LSA 我没有请发给我” LSU ↓ 发送完整 LSA LSACK ↓ 确认收到 LSA四、OSPF 邻居建立与状态机OSPF 邻居建立过程主要经历以下状态Down ↓ Init ↓ 2-Way ↓ ExStart ↓ Exchange ↓ Loading ↓ Full1. Down设备刚启用 OSPF或者暂时没有收到邻居发送的 Hello 报文。2. Init设备收到邻居发送的 Hello 报文。Hello 中包含对方的 Router ID 等信息但在邻居的 Hello 报文中还没有发现自己的 Router ID。3. 2-Way双方都收到了对方的 Hello并且在对方的 Hello 报文中发现了自己的 Router ID。此时双方已经建立了双向通信关系。2-Way 是 OSPF 邻居关系能够达到的最高状态。在广播型网络中并不是所有设备最终都会与彼此建立 Full 邻接关系DR/BDR 会影响后续状态。4. ExStart双方通过 DD 报文协商主从关系。双方首先都认为自己是 Master然后通过比较 Router ID 选举 MasterRouter ID 较大的设备成为 Master。5. Exchange双方开始交换 DD 报文。DD 报文中携带 LSDB 中 LSA 的摘要信息用于让对方了解自己拥有的链路状态信息。6. Loading双方根据 DD 报文发现自己缺少哪些 LSA。随后通过LSR ↓ LSU ↓ LSACK完成缺失 LSA 的请求、发送和确认。7. Full双方 LSDB 同步完成。此时双方形成完整的 OSPF 邻接关系。Full 是 OSPF 邻接状态的最高状态。五、OSPF 网络类型OSPF 支持多种网络类型原文涉及点到点网络广播式多路访问网络点到多点网络非广播式多路访问网络不同网络类型会影响 OSPF 邻居建立以及 DR/BDR 的选举机制。六、DR 与 BDR在广播型多路访问网络中如果所有 OSPF 路由器都两两建立邻接关系随着设备数量增加邻接关系数量会迅速增加。因此 OSPF 引入DRDesignated Router指定路由器BDRBackup Designated Router备份指定路由器DR 和 BDR 与其他设备建立邻接关系。其他设备之间通常只保持邻居关系通过 DR/BDR 完成链路状态信息的同步从而减少邻接关系数量。DR/BDR 选举原文采用的判断方式通过比较 Router IDRouter ID 较大的设备成为 DR。实际选举时还需要结合 OSPF 接口优先级等因素进行判断。七、OSPF 路由器角色根据路由器与区域的关系可以分为以下几种角色。1. 区域内路由器所有接口都位于同一个 OSPF 区域内。2. ABRABRArea Border Router区域边界路由器用于连接不同 OSPF 区域。典型结构Area 1 │ ABR │ Area 03. 骨干路由器至少有一个接口连接到Area 0的 OSPF 路由器。4. ASBRASBRAutonomous System Boundary Router自治系统边界路由器除了 OSPF 路由之外还通过其他方式获得外部路由例如静态路由其他动态路由协议其他路由来源然后可以将外部路由引入 OSPF。八、LSA、LSDB 与 SPF这是理解 OSPF 最核心的一组概念。1. LSALSALink-State Advertisement链路状态通告可以简单理解为路由器向 OSPF 网络传播的链路状态信息。它描述了路由器相关的链路和网络信息。2. LSDBLSDBLink-State Database链路状态数据库OSPF 路由器收到 LSA 后会将相关信息保存到 LSDB 中。可以简单理解LSA ↓ 收集 ↓ LSDB因此LSA 是链路状态信息LSDB 是保存这些链路状态信息的数据库。3. SPFSPFShortest Path First最短路径优先OSPF 根据 LSDB 中保存的网络拓扑信息运行 SPF 算法以自身为根节点计算到其他网络的最优路径。整体关系LSA ↓ LSDB ↓ SPF ↓ 最短路径树 ↓ 最优路由这也是 OSPF 与传统距离矢量协议的重要区别之一OSPF 不只是依赖邻居告诉自己的“距离”而是通过链路状态信息建立网络拓扑再自行计算路径。九、OSPF 的工作过程把前面的知识串起来OSPF 的基本工作过程可以概括为① 发送 Hello ↓ ② 发现邻居 ↓ ③ 建立邻居关系 ↓ ④ 交换 DD ↓ ⑤ 检查 LSDB 摘要 ↓ ⑥ 通过 LSR / LSU / LSACK 同步 LSA ↓ ⑦ LSDB 同步完成 ↓ ⑧ 运行 SPF ↓ ⑨ 计算最优路径 ↓ ⑩ 将路由加入路由表十、OSPF 配置以下以华为设备为例。1. 配置 IP 地址首先完成设备接口 IP 地址配置。2. 创建 OSPF 进程并配置 Router ID[R1] ospf 1 router-id 1.1.1.1进入 Area 0[R1-ospf-1] area 03. 使用 network 宣告网段[R1-ospf-1-area-0.0.0.0] network 10.1.12.0 0.0.0.255在这里10.1.12.0表示需要匹配的网段。0.0.0.2550.0.0.255是通配符掩码。可以理解为0对应位必须匹配 1对应位可以任意4. 在接口上直接使能 OSPF除了使用network命令也可以直接在接口下使能 OSPF[R1] interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0] ospf enable 1 area 0两种方式选择一种即可。十一、OSPF 中几个容易混淆的概念1. Hello ≠ LSAHello 的主要作用是发现邻居 建立邻居 维护邻居LSA 的作用则是传播链路状态信息2. LSA ≠ LSDBLSA ↓ 链路状态信息 LSDB ↓ 保存这些信息的数据库可以记成LSA 是“数据”LSDB 是“数据库”。3. 2-Way ≠ Full2-Way表示双方已经建立双向邻居关系。Full表示双方已经完成 LSDB 同步形成完整邻接关系。因此2-Way 更强调邻居关系Full 更强调邻接关系和数据库同步完成。4. Router ID ≠ 接口 IPRouter ID 是 OSPF 用来标识设备的逻辑标识。它通常采用 IPv4 地址形式表示但并不等于某个接口的实际通信地址。5. Cost 越小越优OSPF 使用 Cost 进行路径计算。通常情况下Cost 越小 ↓ 路径代价越低 ↓ 越优Cost 越小 ↓ 路径代价越低 ↓ 越优OSPF 一句话总结OSPF 通过 Hello 建立邻居通过 LSA 交换链路状态信息构建 LSDB再利用 SPF 算法计算最优路径最终将最优路由用于 IP 数据包转发。实验配置步骤1、配置IP地址2、配置ospf[R1]ospf 1 router-id 1.1.1.1 //OSPF 进程1 router-id 1.1.1.1[R1-ospf-1]area 0 // 进入到区域0中[R1-ospf-1-area-0.0.0.0]network 10.1.12.0 0.0.0.255//宣告自己直连的网段0.0.0.255含义0固定 1任意选择一个就行还可以在接口直接使能宣告出去[R1]int GigabitEthernet 0/0/0[R1-GigabitEthernet0/0/0]ospf enable 1 area 0实验