注:本文为 “OSPF” 相关文章合辑。
本专栏已发一些关于 OSPF 的文章,偶然发现本文作者对 OSPF 知识点覆盖详细,特汇记一份于此。
OSPF 全网最详解(理论及配置)
Lxyand1 于 2024-12-12 10:46:50 发布
一。简介
-
本文为详解动态路由协议 OSPF 结合了华为技术和新华三技术的大成,即结合了 HCIA,HCIP,HCIE Datacom 和 H3CNE-RS+,H3CSE-RS+,H3CIE-RS+。
-
本文将分为 OSPF 基础概念、OSPF 路由计算、OSPF 特殊区域及其它特性、OSPF 高阶特性、OSPF 的详细配置五个大模块进行详细介绍。
二.OSPF 基础概念
1. 前言
-
路由器根据路由表转发数据包,路由表项可通过手动配置和动态路由协议生成。
-
静态路由比动态路由使用更少的带宽,并且不占用 CPU 资源来计算和分析路由更新。当网络结构比较简单时,只需配置静态路由就可以使网络正常工作。但是当网络发生故障或者拓扑发生变化后,静态路由不会自动更新,必须手动重新配置。
-
相比较于静态路由,动态路由协议具有更强的可扩展性,具备更强的应变能力。
-
OSPF (Open Shortest Path First,开放式最短路径优先) 具有扩展性强,收敛速度快等特点,作为优秀的内部网关协议被广泛使用。
-
该模块主要介绍 OSPF 的基本概念,OSPF 的邻接关系的建立。
2. 动态路由协议简介
(1)动态路由协议分类
【1】距离矢量协议
运行距离矢量路由协议的路由器周期性地泛洪自己的路由表。通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中,然后再通告给其他相邻路由器。
对于网络中的所有路由器而言,路由器并不清楚网络的拓扑,只是简单的知道要去往某个目的网段方向在哪里,开销有多大。
【2】链路状态路由协议 - LSA 泛洪
链路状态路由协议通告的的是链路状态而不是路由信息。
运行链路状态路由协议的路由器之间首先会建立邻居关系,然后彼此之间开始交互 LSA (LinkState Advertisement,链路状态通告)。
【3】链路状态路由协议 - LSDB 维护
每台路由器都会产生 LSA,路由器将接收到的 LSA 放入自己的 LSDB (Link State DataBase,链路状态数据库)。路由器通过对 LSDB 中所存储的 LSA 进行解析,进而了解全网拓扑。
【4】链路状态协议 - SPF 计算
每台路由器基于 LSDB,使用SPF (Shortest Path first,最短路径优先) 算法进行计算。每台路由器都计算出一棵以自己为根的、无环的、拥有最短路径的 “树”。有了这棵 “树”,路由器就已经知道了到达所有网段的优选路径。
【5】链路状态路由协议 - 路由表生成
路由器将计算出来的优选路径,加载进自己的路由表**(Routing Table)**。
【6】小总结
3.OSPF 简介
(1)OSPF 概述
OSPF 是 IETF 定义的一种基于链路状态的内部网关路由协议。目前针对 IPv4 协议使用的是 OSPFVersion 2 (RFC2328);针对 IPv6 协议使用 OSPF Version 3 (RFC2740)。
OSPF 有以下优点:
-
基于 SPF 算法,以 “累计链路开销” 作为选路参考值
-
采用组播形式收发部分协议报文
-
支持区域划分
-
支持对等价路由进行负载分担
-
支持报文认证
(2)OSPF 基础术语
【1】Router ID
Router lD 用于在自治系统中唯一标识一台运行 OSPF 的路由器,它是一个 32 位的无符号整数。
Router lD 选举规则如下:
-
手动配置 OSPF 路由器的 Router ID (建议手动配置)
-
如果没有手动配置 Router ID,则路由器使用 Loopback 接口中最大的 IP 地址作为 Router ID
-
如果没有配置 Loopback 接口,则路由器使用物理接口中最大的 IP 地址作为 Router ID
【2】区域
-
OSPF Area 用于标识一个 OSPF 的区域。
-
区域是从逻辑上将设备划分为不同的组,每个组用区域号 (AreaID) 来标识。
-
OSPF 的区域 ID 是一个 32bit 的非负整数,按点分十进制的形式 (与 IPv4 地址的格式一样) 呈现例如 Area0.0.0.1。为了简便起见,我们也会采用十进制的形式来表示。
【3】度量值
-
OSPF 使用 Cost (开销) 作为路由的度量值。每一个激活了 OSPF 的接口都会维护一个接口 Cost 值,缺省的 Cost =100 Mbits / 接口带宽。其中 100 Mbit/s 为 OSPF 指定的缺省参考值,该值是可配置的。
-
OSPF 以 “累计 cost” 为开销值,也就是流量从源网络到目的网络所经过所有路由器的出接口的 cost 总和。
【4】度量值修改举例
(3)OSPF 三大表项
【1】邻居表
OSPF 有三张重要的表项,OSPF 邻居表、LSDB 和 OSPF 路由表。对于 OSPF 的邻居表,需要了解:
-
OSPF 在传递链路状态信息之前,需先建立 OSPF 邻居关系。
-
OSPF 的邻居关系通过交互 Hello 报文建立。
-
OSPF 邻居表显示了 OSPF 路由器之间的邻居状态,使用 display ospf peer 查看。
【2】LSDB
对于 OSPF 的 LSDB,需要了解:
-
LSDB 会保存自己产生的及从邻居收到的 LSA 信息,本例中 R1 的 LSDB 包含了三条 LSA。
-
Type 标识 LSA 的类型,AdvRouter 标识发送 LSA 的路由器。
-
使用命令行 display ospf lsdb 查看 LSDB 表。
【3】OSPF 路由表
对于 OSPF 的路由表,需要了解:
-
OSPF 路由表和路由器路由表是两张不同的表。本例中 OSPF 路由表有三条路由。
-
OSPF 路由表包含 Destination、Cost 和 NextHop 等指导转发的信息。
-
使用命令 display ospf routing 查看 OSPF 路由表。
(4)OSPF 报文格式
-
OSPF 一共定义了 5 种类型的报文,不同类型的 OSPF 报文有相同的头部格式。
-
OSPF 报文直接采用 IP 封装,在报文的 IP 头部中,协议号为 89。
-
后文会有详细介绍
4.OSPF 工作过程
(1)建立邻居关系
【1】OSPF 工作工程概览
【2】建立邻居
-
OSPF 使用 Hello 报文发现和建立邻居关系。
-
在以太网链路上,缺省时,OSPF 采用组播的形式发送 Hello 报文 (目的地址 224.0.0.5)。
-
OSPF Hello 报文中包含了路由器的 Router ID、邻居列表等信息。
【3】hello 报文
Hello 报文的主要作用:
-
邻居发现:自动发现邻居路由器,
-
邻居建立:完成 Hello 报文中的参数协商,建立邻居关系。
-
邻居保持:通过周期性发送和接收,检测邻居运行状态。
重要字段解释
-
Network Mask: 发送 Hello 报文的接口的网络掩码。
-
Hello lnterval: 发送 Hello 报文的时间间隔。通常为 10s
-
Router Dead lnterval: 失效时间。如果在此时间内未收到邻居发来的 Hello 报文,则认为邻居失效。通常为 40s。
-
Neighbor: 邻居,以 Router ID 标识。
其它字段解释
- Options:
E: 是否支持外部路由
MC: 是否支持转发组播数据包
N/P: 是否为 NSSA 区域
-
Router Priority:DR 优先级。默认为 1。如果设置为 0,则路由器不能参与 0DR 或 BDR 的选举。
-
Designated Router: DR 的接囗地址。
-
Backup Designated Router: BDR 的接囗地址。
(2)建立邻接关系
【1】建立邻接阶段一
-
R1 和 R2 的 Router ID 分别为 10.0.1.1 和 10.0.2.2 并且二者已建立了邻居关系。当 R1 的邻居状态变为 ExStart 后,R1 会发送第一个 DD 报文。此报文中,M-bit 设置为 1,表示后续还有 DD 报文要发送,MS-bit 设置为 1,表示 R1 宣告自己为 Master。DD 序列号被随机设置为 X,I-bit 设置为 1,表示这是第一个 DD 报文。
-
同样当 R2 的邻居状态变为 ExStart 后,R2 也会发送第一个 DD 报文。此报文中,DD 序列号被随机设置为 Y (1-bit=1,M-bit=1,MS-bit=1,含义同上)。由于 R2 的 Router ID 较大,所以 R2 将成为真正的 Master。收到此报文后,R1 会产生一个 Negotiation-Done 事件,并将邻居状态从 ExStart 变为 Exchange。
-
当 R1 的邻居状态变为 Exchange 后,R1 会发送一个新的 DD 报文,此报文中包含了 LSDB 的摘要信息,序列号设置为 R2 在步骤 2 中使用的序列号 Y,I-bit=0,表示这不是第一个 DD 报文,M-bit=0,表示这是最后一个包含 LSDB 摘要信息的 DD 报文,MS-bit=0,表示 R1 宣告自己为 Slave。收到此报文后,R2 将邻居状态从 ExStart 变为 Exchange。
-
当 R2 的邻居状态变为 Exchange 后,R2 会发送一个新的 DD 报文,此报文包含了 LSDB 的摘要信息。DD 序列号设置为 Y+1,MS-bit=1,表示 R2 宣告自己为 Master。
-
虽然 R1 不需要发送新的包含 LSDB 摘要信息的 DD 报文,但是作为 Slave,R1 需要对 Master 发送的每一个 DD 报文进行确认。所以,R1 向 R2 发送一个新的 DD 报文,序列号为 Y+1,该报文内容为空。发送完此报文后,R1 产生一个 Exchange-Done 事件,将邻居状态变为 Loading。R2 收到此报文后,会将邻居状态变为 Full (假设 R2 的 LSDB 是最新最全的,不需要向 R1 请求更新)。
【2】DD 报文
DD 报文包含 LSA 头部信息。
【3】建立邻接阶段二
(3)DR 与 BDR 的作用
【1】作用
-
MA (Multiple Access,多路访问) 分为 BMA ( Broadcast Multi-Access, 广播多路访问)和 NBMA (Non-Broadcast Multiple Access,非广播多路访问)。以太网链路组成的网络是典型的 BMA 网络。帧中继链路通过逻辑上的划分组成典型的 NBMA 网络。
-
DRother: 既不是 DR 也不是 BDR 的路由器就是 DRother 路由器
【2】DR 与 BDR 的选举规则
DR/BDR 的选举是非抢占式的。
DR/BDR 的选举是基于接口的。
-
接口的 DR 优先级越大越优先。
-
接口的 DR 优先级相等时,RouterID 越大越优先。
广播链路或者 NBMA 链路上 DR 和 BDR 的选举过程如下:
-
接口 UP 后,发送 Hello 报文,同时进入到 Waiting 状态。在 Waiting 状态下会有一个 WaitingTimer,该计时器的长度与 DeadTimer 是一样的。默认值为 40 秒,用户不可自行调整。
-
在 WaitingTimer 触发前,发送的 Hello 报文是没有 DR 和 BDR 字段的。在 Waiting 阶段如果收到 Hello 报文中有 DR 和 BDR,那么直接承认网络中的 DR 和 BDR,而不会触发选举。直接离开 Waiting 状态,开始邻居同步。
-
假设网络中已经存在一个 DR 和一个 BDR,这时新加入网络中的路由器,不论它的 Router ID 或者 DR 优先级有多大,都会承认现网中已有的 DR 和 BDR。
-
当 DR 因为故障 Down 掉之后,BDR 会继承 DR 的位置,剩下的优先级大于 0 的路由器会竞争成为新的 BDR。
-
只有当不同 Router ID,或者配置不同 DR 优先级的路由器同时起来,在同一时刻进行 DR 选举才会应用 DR 选举规则产生 DR。
【3】不同网络类型中 DR 与 BDR 的选举操作
【4】可按需调整设备接口的 OSPF 网络类型
-
OSPF 的网络类型是根据接口的数据链路层封装自动设置的。
-
图中的路由器采用以太网接口互联,因此这些接口的网络类型缺省均为 Broadcast。
-
每段链路实际上都是点对点链路,因此在链路上选举 DR 与 BDR 是没有必要的。
-
为了提高 OSPF 的工作效率,加快邻接关系的建立过程,可以把这些互联接口的网络类型都修改为 P2P。
-
在接口视图使用 ospf network-type p2p 即可修改接口网络类型。
5. 模块总结
如果您认真学完以上模块,您将能够:
-
描述 OSPF 路由计算的整体过程
-
阐明 DR 与 BDR 的作用
-
描述 OSPF 报文类型和作用
-
区分 OSPF 邻居关系和邻接关系
三.OSPF 路由计算
1. 前言
-
同一区域内的 OSPF 路由器拥有完全一致的 LSDB,在区域内部,OSPF 采用 SPF 算法完成路由计算。
-
随着网络规模不断扩大,路由器为了完成路由计算所消耗的内存、CPU 资源也越来越多通过区域划分可以在一定程度上缓解路由器的压力。
-
在大规模网络中除了 OSPF 之外,还可能存在其它路由协议,OSPF 支持外部路由引入,从而使得 OSPF 路由器知晓到达域外的路由。
-
该模块主要介绍 OSPF 路由计算原理,包括区域内部路由、区域间路由及外部路由的计算过程。
2. 区域内路由计算
(1)LSA 概述
【1】LSA 的基本概念
-
LSA 是 OSPF 进行路由计算的关键依据。
-
OSPF 的 LSU 报文可以携带多种不同类型的 LSA。
-
各种类型的 LSA 拥有相同的报文头部。
重要字段解释:
-
LS Age (链路状态老化时间):此字段表示 LSA 已经生存的时间,单位是秒。
-
Options (可选项):每一个 bit 都对应了 OSPF 所支持的某种特性。
-
LS Type (链路状态类型):指示本 LSA 的类型。
-
Link state lD (链路状态 ID):不同的 LSA,对该字段的定义不同。
-
Advertising Router (通告路由器):产生该 LSA 的路由器的 Router ID,
-
LS Sequence Number (链路状态序列号):当 LSA 每次有新的实例产生时,序列号就会增加。
-
LS Checksum (校验和):用于保证数据的完整性和准确性。
-
Length:是一个包含 LSA 头部在内的 LSA 的总长度值。
链路状态类型、链路状态 ID、通告路由器三元组唯一地标识了一个 LSA。
链路状态老化时间 、链路状态序列号 、校验和用于判断 LSA 的新旧。
LS Age:当 LSA 被始发时,该字段为 0,随着 LSA 在网络中被泛洪,该时间逐渐累加,当到达 MaxAge (缺省值为 3600s) 时,LSA 不再用于路由计算。
LS Sequence Number:该字段用于判断 LSA 的新旧或是否存在重复的实例。席列号范围是 0x80000001-0x7FFFFFFF,路由器始发一个 LSA,序列号为 0x80000001,之后每次更新序列号加 1,当 LSA 达到最大序列号时,重新产生该 LSA,并且把序列号设置为 0x80000001。
【2】常见 LSA 类型
在许多场合中,我们习惯使用类型值来称呼对应的 LSA,例如 1 类 LSA 等同于 Router LSA,2 类 LSA 等同于 Network LSA,以此类推。
(2)Router-LSA
【1】Router-LSA 详解 1
-
Router LSA (1 类 LSA): 每台 OSPF 路由器都会产生。它描述了该路由器直连接口的信息。
-
Router LSA 只能在所属的区域内泛洪。
-
V (Virtual Link): 如果产生此 LSA 的路由器是虚连接的端点,则置为 1。
-
E (External): 如果产生此 LSA 的路由器是 ASBR,则置为 1
-
B (Border): 如果产生此 LSA 的路由器是 ABR,则置为 1.
-
links: LSA 中的 Link (链路) 数量。Router LSA 使用 Link 来承载路由器直连接口的信息。
Link State lD:1 类 LSA 的 Link State lD 为 OSPF 的 Rouer lD 。
【2】Router-LSA 详解 2
-
Router LSA 使用 Link 来承载路由器直连接口的信息。
-
每条 Link 均包含 “链路类型”、“链路 ID”、“链路数据” 以及 “度量值” 这几个关键信息。
-
路由器可能会采用一个或者多个 Link 来描述某个接口。
(3)Network-LSA
【1】Network-LSA 详解
-
Network LSA (2 类 LSA): 由 DR 产生,描述本网段的链路状态,在所属的区域内传播。
-
Network LSA 记录了该网段内所有与 DR 建立了邻接关系的 OSPF 路由器,同时携带了该网段的网络掩码。
-
Link state lD :DR 的接囗 IP 地址。
-
Network Mask:MA 网络的子网掩码。
-
Attached Router: 连接到该 MA 网络的路由器的 Router-ID (与该 DR 建立了邻接关系的邻居的 Router-ID,以及 DR 自己的 RouterID),如果有多台路由器接入该 MA 网络,则使用多个字段描述。
(4)SPF 计算过程
【1】SPF 算法 1
Phase 1: 构建 SPF 树。
-
路由器将自己作为最短路径树的树根,根据 Router-LSA 和 Network-LSA 中的拓扑信息,依次将 Cost 值最小的路由器添加到 SPF 树中。路由器以 Router ID 或者 DR 标识。
-
广播网络中 DR 和其所连接路由器的 Cost 值为 0。
-
SPF 树中只有单向的最短路径,保证了 OSPF 区域内路由计算不会出现环路。
【2】SPF 算法 2
Phase 2: 计算最优路由。
-
将 Router-LSA、Network-LSA 中的路由信息以叶子节点形式附加在对应的 OSPF 路由器上,计算最优路由。
-
已经出现的路由信息不会再添加到 SPF 树干上。
【3】SPF 算法举例
a. 构建 SPF 树阶段 1