📚 第七章 路由协议
📄 一句话概括

先建邻居、再同步数据库、最后各算各的树。 泛洪让所有人拿到同一份地图,所以不会互相骗。

📝 本节和前面几节的关系

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 秒实验

  1. 算一下:50 台路由器的区域,一次拓扑变化泛洪多少份?
  2. 想一下:为什么每台自己算,结果还能一致?
  3. 想一下:泛洪为什么不会无限循环?

常见误区

  1. 以为「泛洪一直不停」。 只在变化时发,稳态下只有 Hello。
  2. 以为「OSPF 有个中心在算路」。 每台自己算,只是大家手里的地图一样。
  3. 以为「地图不用同步也能算对」。 地图不一致就会出环,所以同步是地基。
自测三问(点开对答案) 1. OSPF 干活的四个阶段是什么? —— **建邻居、交换目录、补齐数据库、各算各的树。** 2. 1 类 LSA 描述什么? —— **我周围有哪些链路、通向谁、代价多少。** 3. 为什么稳态下 OSPF 反而更省带宽? —— **只有 Hello**,而 RIP 每 30 秒还在发整表。

下一节看「区域」怎么把泛洪关小。

相关笔记