先建邻居、再同步数据库、最后各算各的树。 泛洪让所有人拿到同一份地图,所以不会互相骗。
7.5.2 讲的是「零件」,这一节讲「装配顺序」。 这一节的泛洪量是 7.5.4「为什么划区域」的直接铺垫。
一、四个阶段
OSPF 干活的顺序是固定的四步:
一、用 Hello 找邻居,建立双向关系。 二、交换 DD 目录,弄清「谁有我没有的」。 三、用 LSR 和 LSU 把缺的补齐,数据库变成一致。 四、各自跑 Dijkstra,算出以自己为根的最短路树,填路由表。
注意第三步和第四步的主语不同:前两步是「协商」,第三步是「同步」,第四步是「各算各的」。 没有「中心节点算完告诉大家」这一步—— 每台都自己算,但算出来的结果是一致的,因为它们手里的地图一样。 「地图一样」这件事是整套机制的地基: 如果两台的地图不一样,它们算出来的路就会对不上,一个往左送、一个往右送,环路就出现了。 所以 OSPF 花了很大力气保证「数据库同步」——这也是它比 RIP 复杂得多的根本原因。
二、LSA:地图的最小单位
地图不是一整块传的,是一块一块的,每一块叫一个 LSA(链路状态通告)。 常见的几种:
| 类型 | 谁产生 | 内容 | |---|---|---|---| | 1 类 | 每台路由器 | 我周围有哪些链路、通向谁 | | 2 类 | DR | 这个广播网段上有哪些路由器 | | 3 类 | ABR | 别的区域有哪些网段 | | 5 类 | ASBR | 从外部引进来的路由 |
1 类是最基础的:每台路由器都产生一条,描述「我连着谁、代价多少」。 把所有 1 类 LSA 拼起来,就是整张图的边。 2 类是为了描述广播网段——因为广播网段上「谁和谁相连」不是两两的,得单独描述。 3 类和 5 类的性质完全不同:它们描述的不是「链路」,是「汇总信息」。 3 类说的是「别的区域有 10.1.0.0/24,从我这儿走」,它不告诉你那个区域内部长什么样。 所以「划区域」的收益,本质是「用 3 类 LSA 换掉一堆 1 类 LSA」。
三、泛洪:一份地图传遍全网
一条 LSA 产生之后,要从「产生它的接口」以外的所有接口发出去。 收到的那台再往外发,直到全网都有一份。 这个动作叫泛洪。 泛洪有一个「防重复」的机制: 每条 LSA 有一个序号,收到比自己旧的直接丢,收到一样的不再往外发。 所以泛洪不会无限循环。 这个「序号」是 OSPF 的关键设计——没有它,泛洪会变成广播风暴。 泛洪的报文数是多少:n 台路由器,每台产生 1 条 1 类 LSA,每条要发给 n 减 1 个邻居, 所以总共是 n 乘 (n 减 1) 次发送。 100 台就是 9900 次。 这个数字看着大,但只在「拓扑变化」时发生一次——稳态下除了 Hello,什么都不发。
四、稳态下的开销为什么反而低
这是链路状态最容易被误解的一点:很多人一听「泛洪」,就觉得它比 RIP 费带宽。 其实要看「什么时候发」。
| 场景 | RIP | OSPF |
|---|---|---|
| 拓扑稳定 | 每 30 秒全量发 | 只有 Hello |
| 一条链路变了 | 下一轮带上 | 立刻泛洪一波 |
| 大网 | 表大,每 30 秒都很大 | 稳态极小,变化时一波 |
第一行是关键:拓扑稳定的时候,RIP 还在每 30 秒发整张表, 而 OSPF 只有 10 秒一个 44 字节的 Hello。 所以「长期平均带宽」上,OSPF 通常更省。 代价在第二行:变化的那一刻,OSPF 会瞬间产生一波泛洪。 网络越大,这波越猛。 所以「OSPF 适合大网」这句话要加一个条件:「必须划区域,把泛洪关在小范围内」。 不划区域的大网,一次抖动就能把 CPU 打满。
五、动手 Demo:链路状态要泛洪多少份
算不同规模下的泛洪次数,再和距离向量的一轮开销对比。 注意第二张表里距离向量要乘「传播轮数」。
for n in (5, 10, 20, 50, 100):
flood = n * (n - 1) # 每台一条 LSA,发给 n-1 个邻居
dv_one = 2 * (n - 1) # 距离向量「一轮」只给邻居
dv_all = 2 * (n - 1) * (n - 1) # 要传 n-1 轮
print('%4d 泛洪 %6d DV一轮 %5d DV全传 %6d'
% (n, flood, dv_one, dv_all))
实跑输出:
--------------------------------------------------------------------
链路状态要泛洪多少份
--------------------------------------------------------------------
**链路状态的核心动作是「泛洪」**:**一条新信息进来,从除来源之外的所有接口发出去。**
**好处是大家都拿到同一份地图,坏处是报文数涨得快。**
区域内的路由器数 泛洪次数 距离向量一轮 倍数
-----------------------------------------------------------
5 20 8 2.5 倍
10 90 18 5.0 倍
20 380 38 10.0 倍
50 2450 98 25.0 倍
100 9900 198 50.0 倍
**第一反应肯定是「链路状态太浪费」**,**100 台路由器要发 9900 份。**
**但这个对比不公平**:
区域内的路由器数 泛洪(只发一次) 距离向量(要 n-1 轮) 倍数
----------------------------------------------------------------------------
5 20 32 0.62 倍
10 90 162 0.56 倍
20 380 722 0.53 倍
50 2450 4802 0.51 倍
100 9900 19602 0.51 倍
**距离向量每轮只发给邻居(链式拓扑上共 2 乘 (n 减 1) 份),但要传 n 减 1 轮才能传遍整条链。**
**乘起来是「2 乘 (n 减 1) 的平方」,比泛洪还多。**
**更关键的是「什么时候发」**:
**距离向量是「定时全量发」**——**不管有没有变化,每 30 秒来一遍。**
**链路状态是「有变化才发」**——**拓扑稳定时,除了 Hello 什么都不发。**
**所以稳态下的开销,链路状态反而更低。**
**代价在「变化的那一刻」**:**链路状态会瞬间产生一波泛洪,网络越大这波越猛。**
**这就是下一节要「划区域」的直接原因**——**把泛洪关在一个小区域里,别让它传遍全网。**
第一反应肯定是「链路状态太浪费」,100 台路由器要发 9900 份。 但这个对比不公平:距离向量要传 n 减 1 轮才能传遍整条链, 乘起来是「2 乘 (n 减 1) 的平方」,比泛洪还多。 更关键的是「什么时候发」:距离向量是「定时全量发」——不管有没有变化,每 30 秒来一遍。 链路状态是「有变化才发」——拓扑稳定时,除了 Hello 什么都不发。 所以稳态下的开销,链路状态反而更低。 代价在「变化的那一刻」:链路状态会瞬间产生一波泛洪,网络越大这波越猛。 这就是下一节要「划区域」的直接原因——把泛洪关在一个小区域里,别让它传遍全网。
30 秒实验
- 算一下:50 台路由器的区域,一次拓扑变化泛洪多少份?
- 想一下:为什么每台自己算,结果还能一致?
- 想一下:泛洪为什么不会无限循环?
常见误区
- 以为「泛洪一直不停」。 只在变化时发,稳态下只有 Hello。
- 以为「OSPF 有个中心在算路」。 每台自己算,只是大家手里的地图一样。
- 以为「地图不用同步也能算对」。 地图不一致就会出环,所以同步是地基。
自测三问(点开对答案)
1. OSPF 干活的四个阶段是什么? —— **建邻居、交换目录、补齐数据库、各算各的树。** 2. 1 类 LSA 描述什么? —— **我周围有哪些链路、通向谁、代价多少。** 3. 为什么稳态下 OSPF 反而更省带宽? —— **只有 Hello**,而 RIP 每 30 秒还在发整表。下一节看「区域」怎么把泛洪关小。
- ☐ (本节完,下一节 7.5.4 将区域分层化进行细分管理)