静态是「人写死」,动态是「自己学」。 怎么选不是风格问题,是规模问题:条目数是网的平方。
7.1.1 讲清了「表怎么用」,这一节讲「表怎么来」。 这是全章的总纲:后面 7.3 到 7.7 讲的全是「动态怎么动」。
一、两种做法的分界
静态路由:管理员手工往表里写一条,写完就不动。 动态路由:路由器之间互相通告,表自己长出来。 这个区别听起来像「手动挡和自动挡」,其实不是—— 因为「动手的工作量」随规模增长的斜率完全不同。 静态是「线性地动一次手」,动态是「一次配置,之后自动」。 网小的时候静态更好,网大的时候静态根本做不了。
| 对比项 | 静态路由 | 动态路由 |
|---|---|---|
| 谁决定 | 管理员 | 协议自己算 |
| 占带宽 | 零 | 有(要发通告) |
| 故障自愈 | 不会 | 会 |
| 可控性 | 完全可控 | 受协议约束 |
| 规模上限 | 几十条 | 几十万条 |
第二行和第三行是一对:不占带宽的代价是「不自己发现变化」。 这不是缺点,是取舍——出口那条默认路由一辈子不会变,为什么要让它去发通告?
二、静态路由该用在哪儿
三个典型场景:
一是默认路由:「其他都交给网关」,这条永远不会变。 二是末梢网络:只有一条出口的小办公室,写一条静态就够了,跑动态协议纯属浪费。 三是刻意控制:想让某段流量必须走某条线(比如审计、合规),静态路由是唯一能「钉死」的手段。 第二点值得展开:很多人给只有一台路由器的小办公室配 OSPF,理由是「以后会扩展」。 但 OSPF 要维护邻居、要算 SPF、要发 Hello,一台路由器的网里这些开销全是白花的。 而且一旦配错(比如区域号不一致),排查成本远高于一条静态路由。 「以后会扩展」不是理由,「现在就扩展了」才是。
三、为什么规模一大就必须动态
假设有 n 个网段,每个网段一台路由器,每台都要能到其他所有网段。 静态路由要写 n 减 1 条,全网就是 n 乘 (n 减 1) 条。 这是平方增长:网段从 100 涨到 1000,条目从 9900 涨到 999000。 没有任何团队能手工维护住一百万条记录——而且每加一个网段,就要回头改一千台设备。 更麻烦的是「变更」:一个网段断了,静态路由不会自己消失。 流量会继续往一个死胡同里送,直到有人发现并去改表。 动态路由的邻居超时机制就是为这件事设计的——它不依赖「有人发现」,它依赖「定时确认还活着」。
四、动态路由的代价
动态不是免费的:要发通告(占带宽)、要算路(占 CPU)、要存邻居状态(占内存)。 而且它有「收敛时间」——拓扑变化之后,要过一会儿全网才达成一致。 这段时间里,一部分包会走错路甚至被丢。 所以「动态比静态好」这句话是错的,正确的是「在会变化的、规模大的场景里,动态更好」。 一个永远不会变的网络,静态反而是最优解——不占带宽、没有收敛、没有协议漏洞。 工程上的判断标准从来不是「哪个更先进」,而是「哪个的代价更小」。
五、动手 Demo:静态路由的成本是「网的平方」
把「n 个网段全互联」需要的静态路由条目数算出来,看它怎么涨。 顺便算一下「改一次要改多少台设备」。
for n in (5, 10, 50, 100, 1000):
per = n - 1 # 每台要写的条数
total = n * (n - 1) # 全网条目合计
links = n * (n - 1) // 2 # 网段间链路数
print('%5d %8d %10d %10d' % (n, per, total, links))
实跑输出:
--------------------------------------------------------------------
静态路由的成本是「网的平方」
--------------------------------------------------------------------
**静态路由就是「人工往表里写一条」。**
**网小的时候很省事,网一大就变成灾难。**
**下面算一下到底有多灾难。**
网段数 每台要写 全网条目合计 网段间链路数
------------------------------------------------------
5 4 20 10
10 9 90 45
50 49 2450 1225
100 99 9900 4950
1000 999 999000 499500
**网段数从 100 涨到 1000(十倍),条目从 9900 涨到 999000(一百倍)。**
**这就是平方增长**——**1000 个网段要写将近一百万条静态路由,没有任何团队能手工维护住。**
**而且这还只是「初始配置」,没算「改一次要改多少处」。**
**假设 1000 个网段里有 1 个断了**:
**静态路由:得有人发现它断了,然后去 999 台路由器上各改一条。**
**动态路由:断掉的那台路由器自己不再通告,邻居的表在几十秒内自动失效。**
**没人需要动手。**
**所以「静态还是动态」不是风格问题,是规模问题**:
**出口网关那条默认路由用静态就够了**(它不会变),**而机房内部几百个网段之间,必须靠动态。**
网段从 100 涨到 1000(十倍),条目从 9900 涨到 999000(一百倍)。 这就是平方增长——一千个网段要写将近一百万条静态路由,没有任何团队能手工维护住。 「网段间链路数」这一列是另一件事:如果真要让每两个网段直连,一千个网段要拉将近五十万条线。 所以现实里没人这么干——大家用「一个骨干加一堆分支」的树形结构,把平方级的链路压成线性级的。 这也解释了为什么真实网络是「分层」的:不是为了好看,是为了把 n 的平方变成 n 乘 log n。
30 秒实验
- 算一下:一百个网段,每台路由器的静态表要写多少条?
- 想一下:一条永远不会变的默认路由,为什么不该用动态协议维护?
- 想一下:一个只有一台路由器的小办公室,配 OSPF 有什么实际坏处?
常见误区
- 以为「动态路由一定比静态好」。 静态不占带宽、没有收敛、完全可控, 在不变的场景里是最优解。
- 以为「静态路由不用维护」。 网段一变就得手工改,而且没人改的话流量会一直往死胡同里送。
- 以为「配了动态协议就不用管路由表」。 协议只管算,策略和聚合还是人在配。
自测三问(点开对答案)
1. 静态和动态最本质的区别是什么? —— **表是「人写死的」还是「自己学来的」**,连带决定了「能不能自愈」。 2. 为什么网一大就必须用动态? —— **条目数是网段数的平方**,一千个网段要近一百万条,手工维护不了。 3. 小办公室为什么不该跑 OSPF? —— **一台路由器没有邻居可建**,Hello、SPF 全是白花的开销,配错还难查。下一节看动态路由到底「动」的是什么。
- ☐ (本节完,下一节 7.1.3 动态路由的基础)