开放最短路径优先协议 OSPF
OSPF 协议是使用分布式链路状态路由算法的典型代表,也是内部网关协议(IGP)的一种(算法原理见 4.4.1)。
本页 4 道错题,是第 4 章 4.4 节错题最集中的地方。 三道是概念判断(与 RIP 的对比、问候分组、四类路由器),一道是 OSPF 选路加存储转发时延的综合计算。概念题的关键是 OSPF 的”全部”和”部分”:它向全部路由器发送,发送的是部分信息。
机制
OSPF 与 RIP 的比较
与 RIP 相比,OSPF 有下面 4 个主要特点(OSPF 和 RIP 的比较 2024 年考过):
| 比较项 | OSPF | RIP |
|---|---|---|
| 向谁发送 | 使用洪泛法向本自治系统中所有路由器发送信息:路由器通过所有输出端口向所有相邻的路由器发送信息,而每个相邻的路由器又将此信息发往所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器),最终整个区域中所有的路由器都得到了这个信息的一个副本 | 仅仅向自己相邻的几个路由器发送信息 |
| 发送什么 | 与本路由器相邻的所有路由器的链路状态,这只是路由器所知道的部分信息 | 本路由器所知道的全部信息,即整个路由表 |
| 何时发送 | 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息,并且更新过程收敛得快,不会出现 RIP”坏消息传得慢”的问题 | 不管网络拓扑是否发生变化,路由器之间都要定期交换路由表的信息 |
| 协议层次 | 网络层协议,不用 UDP 或 TCP,而直接用 IP 数据报传送(其 IP 数据报首部的协议字段为 89) | 应用层协议,在传输层使用 UDP |
“用 UDP 传送”是指将该信息作为 UDP 报文的数据部分,而”直接使用 IP 数据报传送”是指将该信息直接作为 IP 数据报的数据部分(封装 OSPF 报文所采用的协议 2017 年考过)。
除以上区别外,OSPF 还有以下特点:
- OSPF 允许对每条路由设置成不同的代价,对于不同类型的业务可计算出不同的路由。
- 若到同一个目的网络有多条相同代价的路径,则可将通信量分配给这几条路径。
- OSPF 分组具有鉴别功能,从而保证仅在可信赖的路由器之间交换链路状态信息。
- OSPF 支持可变长度的子网划分和无分类编址 CIDR。
- 每个链路状态都带上一个 32 位的序号,序号越大,状态就越新。
OSPF 的基本工作原理
因为各路由器之间频繁地交换链路状态信息,所以所有路由器最终都能建立一个链路状态数据库,即全网的拓扑结构图。然后,每个路由器利用链路状态数据库中的数据,使用 Dijkstra 算法计算自己到达各目的网络的最优路径,构造出自己的路由表。此后,当链路状态发生变化时,每个路由器重新计算到达各目的网络的最优路径,构造出新的路由表。
虽然使用 Dijkstra 算法能计算出完整的最优路径,但路由表中不会存储完整路径,而只存储”下一跳”(只有到了下一跳路由器,才能知道再下一跳应当怎样走)。
区域
为了使 OSPF 能用于规模很大的网络,将一个自治系统再划分为若干更小的范围,称为区域。划分区域的好处是,把利用洪泛法交换链路状态信息的范围局限在各个区域,而不是整个 AS,从而减少了整个网络上的通信量。
- 在一个区域内,由一个或多个区域边界路由器负责为流向该区域以外的分组提供路由选择。
- 在 AS 内只有一个区域配置成主干区域(标识符 0.0.0.0),它包含 AS 内的所有区域边界路由器,可能还包含一些非边界路由器,主干区域的作用是连通其他区域。
- 当分组在 AS 内的不同区域之间传送时,要先找到本区域内的一个区域边界路由器,再通过主干区域路由到位于目的区域的区域边界路由器,最后路由到目的地。
- 主干区域还要有一个路由器专门负责和本 AS 外的其他 AS 交换路由器信息,称为自治系统边界路由器。
flowchart LR subgraph A1["区域 0.0.0.1"] R1["R1<br/>区域内部路由器"] R2["R2<br/>区域内部路由器"] end subgraph A0["主干区域 0.0.0.0"] R5["R5<br/>主干路由器"] R6["R6<br/>自治系统边界路由器"] end subgraph A2["区域 0.0.0.2"] R8["R8<br/>区域内部路由器"] end subgraph A3["区域 0.0.0.3"] R9["R9<br/>区域内部路由器"] end R1 --- R3["R3<br/>区域边界路由器"] R2 --- R3 R3 --- R5 R5 --- R4["R4<br/>区域边界路由器"] R4 --- R8 R5 --- R7["R7<br/>区域边界路由器"] R7 --- R9 R6 --- R5 R6 -. 至其他自治系统 .-> X(("其他 AS"))
图中 R3、R4 和 R7 都是区域边界路由器,每个区域至少有一个区域边界路由器;R6 是自治系统边界路由器。区域边界路由器同时属于主干区域和它所连的区域,所以它既是主干路由器,也是区域边界路由器。
在一个区域内部的路由器只知道本区域的网络拓扑,而不知道其他区域的网络拓扑情况。采用分层次划分区域的方法虽然使交换信息的种类增多了,同时也使 OSPF 协议更加复杂了,但却能使每个区域内部交换路由信息的通信量大大减少,进而使 OSPF 协议能够用于规模很大的自治系统中。
错题复盘:划分区域使交换信息的种类增多、协议更复杂,换来的是区域内通信量大大减少
王道 4.4.6 第 6 题:以下关于自治系统的描述中,错误的是(A. 自治系统划分区域的好处是,将利用洪泛法交换链路状态信息的范围局限在每个区域内,而不是整个自治系统 B. 采用分层划分区域的方法使交换信息的种类增多,同时也使 OSPF 协议更加简单 C. OSPF 协议将一个自治系统再划分为若干更小的范围,称为区域 D. 在一个区域内部的路由器只知道本区域的网络拓扑,而不知道其他区域的网络拓扑的情况)。答案 B。
划分区域的好处是,将利用洪泛法交换链路状态信息的范围局限在每个区域内,而不是整个自治系统(A 对);因此,在一个区域内部的路由器只知道本区域的网络拓扑,而不知道其他区域的网络拓扑情况(D 对)。采用分层次划分区域的方法虽然使交换信息的种类增多了,同时也使 OSPF 协议更加复杂了,但这样做却能使每个区域内部交换路由信息的通信量大大减少,进而使 OSPF 协议能够用于规模很大的自治系统中。
B 前半句对、后半句错。分层换来的是可伸展性,付出的是复杂性,不会让协议变简单。
OSPF 的五种分组
| 分组 | 作用 |
|---|---|
| 问候(Hello)分组 | 用来发现和维持邻站的可达性 |
| 数据库描述分组 | 向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息 |
| 链路状态请求分组 | 向对方请求发送某些链路状态项目的详细信息 |
| 链路状态更新分组 | 用洪泛法对全网更新链路状态,它是 OSPF 最核心的部分 |
| 链路状态确认分组 | 对链路更新分组的确认 |
通常网络中传送的大多数 OSPF 分组都是问候分组。OSPF 规定,两个相邻路由器每隔 10 秒要交换一次问候分组,以便知道哪些邻站可达。若 40 秒没有收到某个相邻路由器发来的问候分组,则认为该相邻路由器不可达,应立即修改链路状态数据库,并重新计算路由表。
路由器刚开始工作时,它只能通过问候分组得知它与哪些路由器相邻,以及相应链路的代价。为了得到链路状态数据库,若让所有路由器都将自己的本地链路状态信息进行全网广播,则未免开销太大。因此,OSPF 让每个路由器使用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息;然后,路由器使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这种分组交换,就建立了全网同步的链路数据库。
sequenceDiagram participant A as 路由器 A participant B as 路由器 B Note over A,B: 确定可达性 A->>B: 问候 B->>A: 问候 Note over A,B: 达到数据库的同步 A->>B: 数据库描述 B->>A: 数据库描述 A->>B: 数据库描述 B->>A: 数据库描述 Note over A,B: 新情况下的同步 A->>B: 链路状态请求 B->>A: 链路状态更新 A->>B: 链路状态确认
在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用可靠的洪泛法向全网更新链路状态,其他路由器在收到更新分组后要发送确认。为了确保链路状态数据库与全网的状态保持一致,OSPF 还规定每隔一段时间(如 30 分钟)要刷新一次数据库中的链路状态。因为一个路由器的链路状态只涉及与相邻路由器的连通状态,与整个网络的规模并无直接关系,所以当互联网规模很大时,OSPF 要比 RIP 好得多。
计算模板
OSPF 选路加传输时延
- 先选路:把各链路的度量当作边权,用 Dijkstra(或直接枚举几条候选路径)求出总度量最小的路径。度量不是距离,也不是跳数。
- 再算分组数:每个分组的数据部分 = 分组长度 − 首部长度;分组数 = 文件大小 ÷ 每个分组的数据部分。
- 最后算时延:路径上有
段链路( 个路由器存储转发), 个分组,每个分组发送时间 分组长度 ÷ 带宽。忽略传播时延时,总时间 :第一个分组要走完 段,之后每个分组紧跟着到达。
错题复盘:OSPF 按代价选路,不按跳数;选定路径后再按存储转发计算时延
王道 4.4.6 第 23 题:某分组交换网络的拓扑如上图所示,各路由器使用 OSPF 协议且均已收敛,各链路的度量已在图中标注。假设各段链路的带宽均为 100Mb/s,分组长度为 1000B,其中分组的首部长度为 20B。若主机 A 向主机 B 发送一个大小为 980000B 的文件,忽略分组的传播时延和封装/解封时间,从 A 发送开始到 B 接收完毕为止,需要的时间是(A. 80.08ms B. 80.16ms C. 80.32ms D. 80.64ms)。答案 C。
选路:上方直连路径的代价为
,下方绕行路径为 。OSPF 选代价最低的下方路径,依次经过代价为 2、3、1、1、2 的 5 段链路,一共经过 4 个路由器。 分组数:每个分组的数据长度为
B,共 个分组。每次存储转发时延为 ms。 时延:第一个分组从 A 到 B 的时间为
ms,剩下的 999 个分组每经过 0.08ms 就到达一个,总时间为 ms。 另外三个选项正好对应三种错误:按跳数选上方路径(3 段)得 80.16ms(B);把代价之和 9 当成链路段数得 80.64ms(D);A 则只算了 2 段。
边界
OSPF 发给”所有路由器”,指的是本区域内的所有路由器。 划分区域后,洪泛的范围局限在区域内部;RIP 则只发给相邻路由器。
OSPF 发的是”部分信息”,RIP 发的是”全部信息”。 OSPF 只报告与自己直接相连的链路的状态,RIP 发送整个路由表。
错题复盘:RIP 是应用层协议,OSPF 才是网络层协议
王道 4.4.6 第 14 题:下列关于 RIP 和 OSPF 协议的叙述中,错误的是(A. RIP 和 OSPF 协议都是网络层协议 B. 在进行路由信息交换时,RIP 中的路由器仅向自己相邻的路由器发送信息,OSPF 协议中的路由器向本自治系统中的所有路由器发送信息 C. 在进行路由信息交换时,RIP 中的路由器发送的信息是整个路由表,OSPF 协议中的路由器发送的信息只是路由表的一部分 D. RIP 的路由器不知道全网的拓扑结构,OSPF 协议的任何一个路由器都知道自己所在区域的拓扑结构)。答案 A。
RIP 是应用层协议,它使用 UDP 传送数据;OSPF 才是网络层协议,直接用 IP 数据报传送。B、C、D 正是本页开头比较表的三行。
两个协议都”为网络层服务”(算出路由表供转发使用),但协议所在的层次看的是它的报文封装在哪里:RIP 报文是 UDP 报文的数据部分,OSPF 分组是 IP 数据报的数据部分。
错题复盘:OSPF 用问候(Hello)分组维持邻居关系,Keepalive 是 BGP 的
王道 4.4.6 第 15 题:OSPF 协议使用( )分组来保持与其邻居的连接(A. Hello B. Keepalive C. SPF(最短路径优先) D. LSU(链路状态更新))。答案 A。
这是记忆性题目:OSPF 协议使用 Hello 分组来发现和维持与邻居的连接,每 10 秒一次,40 秒收不到就认为邻居不可达。
另外三项各有所指:Keepalive 是 BGP 用来周期性证实邻站连通性的报文(4.4.5);SPF 是算法的名字,不是分组;LSU 用于洪泛更新链路状态,不负责维持邻居。
OSPF 直接用 IP 传送,协议字段 89。 所以它是网络层协议;RIP 用 UDP,BGP 用 TCP,它们都是应用层协议。
错题复盘:主干路由器可以兼作区域边界路由器
王道 4.4.6 第 18 题:下列关于 OSPF 协议特征的描述中,错误的是(A. OSPF 协议将一个自治域划分成若干域,有一种特殊的域称为主干区域 B. 域之间通过区域边界路由器互连 C. 在自治系统中有 4 类路由器:区域内部路由器、主干路由器、区域边界路由器和自治域边界路由器 D. 主干路由器不能兼作区域边界路由器)。答案 D。
在主干区域中,用于连接主干区域和其他下层区域的路由器称为区域边界路由器;只要是在主干区域中的路由器,就都称为主干路由器。区域边界路由器一只脚在主干区域,一只脚在下层区域,所以主干路由器可以兼作区域边界路由器。
四类路由器是按不同维度划分的,并不互斥:在不在主干区域里(主干路由器)、连不连两个区域(区域边界路由器)、连不连别的 AS(自治系统边界路由器)。图中的 R3、R4、R7 同时属于前两类。
路由表只存下一跳。 Dijkstra 算出的完整路径不会写进路由表。
对照速查
| 说法 | 对错 |
|---|---|
| OSPF 使用分布式链路状态路由算法 | ✅ |
| OSPF 路由器仅向相邻路由器发送信息 | ❌(洪泛给区域内所有路由器) |
| OSPF 路由器发送的是整个路由表 | ❌(相邻链路的状态) |
| OSPF 只在链路状态变化时洪泛更新 | ✅(另有约 30 分钟的定期刷新) |
| OSPF 使用 UDP 传送 | ❌(直接用 IP,协议字段 89,2017) |
| OSPF 支持 CIDR 和变长子网掩码 | ✅ |
| 一个 AS 内可以有多个主干区域 | ❌(只有一个) |
| 区域内部路由器知道其他区域的拓扑 | ❌ |
| 用于发现和维持邻站可达性的是问候分组 | ✅ |
| OSPF 的路由表中存储完整的最优路径 | ❌(只存下一跳) |
考点
- 洪泛给所有路由器、只发相邻链路状态、变化时才发、网络层直接用 IP(协议 89)(2017、2024)
- 链路状态数据库 + Dijkstra;路由表只存下一跳
- 区域、主干区域、区域边界路由器、自治系统边界路由器
- 五种分组;问候分组 10 秒一次,40 秒未收到则不可达
- OSPF 选路 + 存储转发时延综合计算
链接
- 🏠 返回总览:计算机网络第 4 章:网络层总览
- ⬅️ 上一节:4.4.3 路由信息协议 RIP
- ➡️ 下一节:4.4.5 边界网关协议 BGP
- 🔗 4.4.1 链路状态路由算法
- 🔗 4.4.2 分层次的路由选择
- 🔗 数据结构 6.4 最短路径(Dijkstra)
- 📖 名词库:第 4 章名词库
