RIP 距离矢量原型
课程(6 节,按顺序学)
RIP 是怎么工作的:一句话说完
入门 · 约 8 分钟
本课目标:把距离矢量的工作方式讲清楚,顺便看清它和链路状态的分水岭在哪。
一句话:把整张路由表念给邻居听
RIP 的全部工作方式就是:
每 30 秒,把自己整张路由表念给所有邻居听。
邻居收到之后做一件事:度量 +1,比我现在的小就换成它。
没有邻居状态机、没有拓扑图、没有 SPF —— 就这么两句。
这也是它当年流行的原因:简单到几乎不会配错。
度量就是跳数
经过一台路由器算 1 跳。直连是 0 跳。
· 最大 15 跳
· 16 = 无穷 = 不可达(不是「很远」,是到不了)
⚠️ 度量只看跳数,完全不看带宽。一条 64K 的串口和一条万兆以太,在 RIP 眼里一样好(都是 1 跳)。
这是它最被诟病的地方,也是 EIGRP/OSPF 引入带宽度量的直接理由。
和链路状态的分水岭
| | RIP(距离矢量) | OSPF(链路状态) |
| --- | --- | --- |
| 知道什么 | 只知道邻居报的距离 | 全网拓扑图 |
| 怎么算 | 邻居的值 +1,取最小 | 自己跑 Dijkstra |
| 发什么 | 整张路由表,每 30 秒 | 只发变化的 LSA |
| 防环 | 一堆补丁 | 天然无环(图是完整的) |
「只知道邻居报的距离」这一点推出了 RIP 的全部问题 ——下一课就看它会出什么事。
动手:看一条链上跳数怎么长
当前场景是 R1 - R2 - R3 一条链。看 R1 到 R3 后面那个网段是几跳、R3 到 R1 后面的是几跳。
顺便注意:每台路由器对同一个目的地只记一条路由 ——它不像 EIGRP 那样保留所有邻居报的距离。这一点在第 3 课会变得很重要。
实验重点
- RIP = 每 30 秒把整张路由表念给邻居;邻居收到就 +1,比现在小就换
- 度量是跳数,最大 15,16 = 不可达
- 度量完全不看带宽 —— 64K 串口和万兆一样是 1 跳
- 每个目的地只记一条路由(对比 EIGRP 保留所有邻居的距离)
★ 计数到无穷:距离矢量的原罪
进阶 · 约 15 分钟
本课目标:看清环路是怎么形成的。这一课是整个模块的核心。
先看一条规则:来自下一跳的坏消息必须接受
距离矢量有一条不得不遵守的规则:
如果当前下一跳告诉我「变远了」,我必须接受。
为什么必须?因为它是这条路由的权威 ——我到那个网段本来就是靠它转发的,它说变远了就是真的变远了。
这条规则完全合理。但它就是环路的来源。
回声是怎么形成的
R1 —— R2 —— 目标网段。R1 从 R2 学到「1 跳」。
目标网段断了,而且 R2 只是默默把路由删掉(没有路由毒化):
① R2 删掉了,但 R1 还记着「经 R2 到它,1 跳」
② R1 按周期把这条告诉 R2 —— R2 听到「R1 说它 1 跳能到」
③ R2 想「那我经 R1 走,2 跳」→ 学下来
④ R2 告诉 R1「我 2 跳」→ R1 的下一跳就是 R2 → 必须接受 → 3 跳
⑤ R1 告诉 R2 → 4 跳 → …
每一轮 +1,一直数到 16 才停。
而这中间的每一轮,R1 和 R2 都认为「经对方能到」——流量在两台之间来回打,是真实的环路,不只是表项难看。
动手:亲眼看它数到 16
去仿真页,把所有防环机制都关掉,断掉目标网段,一轮一轮点下去。
看度量怎么 1 → 2 → 3 → … → 16,以及一共花了多少秒。
16 是止损,不是解法
「16 = 无穷」的作用只有一个:万一真成了环,让它有个地方停下来。
它不阻止环路形成,只是限制损失。代价是 RIP 的网络直径最多 15 跳 ——这也是它无法用于中大型网络的直接原因。
实验重点
- ★ 来自当前下一跳的坏消息必须接受 —— 这条合理的规则就是环路的来源
- 回声:我把陈旧信息告诉邻居,邻居 +1 再告诉我,我作为它的下游必须接受
- 计数到无穷期间流量真的在环里打,不是表项难看而已
- 16 是止损不是解法,代价是网络直径限死在 15 跳
四个补丁:各自能解决什么、解决不了什么
进阶 · 约 16 分钟
本课目标:逐个理解四个防环机制,并且搞清楚它们的边界。
补丁一:水平分割
从一个接口学到的路由,不再从同一个接口通告回去。
回到上一课的例子:R1 是从连 R2 的那个口学到目标网段的,所以它不会再从那个口告诉 R2 → 回声在第一步就被切断。
✅ 能解决:两台设备之间的直接回声。
❌ 解决不了:某台路由器从「非源头方向」学到这条路由的情况。
水平分割的边界(这一点常被讲错)
常见说法是「水平分割挡不住三台以上成环」——这个说法不准确。
对称的三角形、四节点环、链形拓扑,水平分割其实都挡得住:因为丢了路由的那台,它的邻居全都是从它这儿学来的,所以全部被水平分割挡住,回声形不成。
真正失效需要一个不对称条件:某台路由器从别的方向学到了这条路由。
现网里造成这种不对称的常见原因:passive-interface 配错、路由过滤不对称、或者更新在传输中交错。
所以准确的说法是:水平分割只保证挡住两台之间的直接回声,不保证任意拓扑无环。
补丁二:路由毒化 + 触发更新
路由毒化:链路断了不是默默删掉,而是主动通告 16(不可达)。
触发更新:不等 30 秒周期,立刻发。
两者配合,坏消息几秒就传遍全网 —— 而不是每台都各自等 180 秒超时。
这两个是对收敛速度影响最大的机制。 去对比页看数字:关掉它们,收敛要几百秒;打开,几十秒。
补丁三:毒性逆转
水平分割的加强版:从某个接口学来的路由,照样从这个接口通告回去,但度量写成 16。
比水平分割好在哪:
· 水平分割是「什么都不说」
· 毒性逆转是「明确说我到不了」
明确的坏消息比沉默可靠 —— 因为沉默有可能只是丢包。
代价是更新报文变大(要带上那些 16 的条目)。
补丁四:抑制计时器
路由变不可达后,180 秒内不接受任何度量更差的更新,等全网都知道坏消息。
⚠️ 这是个纯粹的「用时间换正确」的补丁,代价很实在:
就算真有一条好的备份路径,也要干等抑制期过完。
RIP 收敛慢主要就慢在这里。
动手:跑一遍四组对比
对比页会一次跑完五种配置(全关 / 只开水平分割 / 加毒化+触发 / 全开 / 用毒性逆转),把「有没有数到无穷、收敛几轮、多少秒」并排列出来。
在两台和不对称三台两个场景各跑一次,结论就很清楚了。
实验重点
- 水平分割:从哪个口学的不往那个口通告 —— 只保证挡住两台之间的直接回声
- 路由毒化 + 触发更新:对收敛速度影响最大的两个机制
- 毒性逆转比水平分割可靠 —— 明确的坏消息比沉默强
- 抑制计时器是用时间换正确,代价是有备份也得干等
- ★ 四个都是补丁,没有一个能根治
四个定时器:收敛慢在哪
进阶 · 约 10 分钟
本课目标:把 30 / 180 / 180 / 240 这四个数字背后的因果搞清楚。
四个定时器
| 定时器 | 默认 | 作用 |
| --- | --- | --- |
| Update | 30 秒 | 周期性把整张路由表发一遍 |
| Invalid | 180 秒 | 多久没收到更新就判定失效(= 6 个周期) |
| Holddown | 180 秒 | 多久内不接受更差的更新 |
| Flush | 240 秒 | 多久后从路由表彻底删除 |
记住两个关系就够了:
· Invalid = 6 × Update —— 容忍连续丢 5 次更新
· Flush = Invalid + 60 —— 失效后还留 60 秒,继续通告毒化信息
为什么 Flush 要比 Invalid 晚 60 秒
这个细节很多人没想过:路由都失效了,为什么不立刻删掉?
因为要继续把「16」通告出去。 删掉了就没东西可通告了,邻居只能各自等自己的 180 秒 —— 那样收敛会慢得多。
所以这 60 秒是故意留的窗口,用来做路由毒化。
收敛慢的三个来源
① 发现慢 —— 没有路由毒化时,要等 180 秒 Invalid 超时才知道邻居没了
② 传播慢 —— 每跳都要等一个 30 秒周期(触发更新能缓解)
③ 抑制期 —— 180 秒内拒绝更差的更新,有备份也得等
三者叠加,RIP 的收敛是几十秒到几分钟级别的。
对比:EIGRP 有可行后继时是亚秒级,OSPF 是几秒。
调定时器要全网一起改
⚠️ 定时器必须全网一致。
一端 30 秒发、另一端认为 90 秒没收到就失效 →会出现「一端已经删了、另一端还在通告」的持续震荡。
而且调小 Update 会显著增加带宽消耗(因为是全量发送)——这就是 RIP 的两难:想快就得多发,多发就费带宽。
实验重点
- Invalid = 6 × Update(容忍丢 5 次),Flush = Invalid + 60
- Flush 晚 60 秒是故意的 —— 留窗口继续通告毒化信息
- 收敛慢来自三处:发现慢(180s)+ 每跳一个周期 + 抑制期 180s
- 定时器必须全网一致;调小 Update 会显著增加带宽(因为是全量发)
v1 vs v2:一个字段的差别推出全部局限
进阶 · 约 12 分钟
本课目标:搞清楚「不带掩码」这一个缺陷造成了多少后果。
v1 的原罪:报文里不带子网掩码
RIPv1 的更新报文里只有网络号,没有掩码。
于是收到方只能猜:
· 如果这条路由和接收接口在同一个主类网络里 → 沿用接收接口的掩码
· 否则 → 按 A/B/C 类的自然掩码
猜对了就没事,猜错了路由就是错的。
推论一:不支持 VLSM
同一个主类网络里如果掩码不统一(比如互联用 /30、业务网段用 /24),v1 一定会猜错。
当前场景就是这个:172.16.100.0/30 是互联段,172.16.2.0/24 是业务段。R1 从 /30 的接口收到 172.16.2.0,就会沿用 /30 → 学成 172.16.2.0/30,而真实网段是 /24 → 一大半地址到不了。
推论二三四:不支持 CIDR、不连续子网、没有认证
· 不支持 CIDR / 无类汇总 —— 没有掩码就没法表达任意长度的前缀
· 不支持不连续子网 —— 只能按主类通告,两侧同主类必然互相覆盖
· 用广播 255.255.255.255 —— 网段里所有设备都被迫收包,包括不跑 RIP 的(浪费 + 安全隐患)
· 没有认证 —— 谁都能往网段里注入假路由
v2 补上了什么
v2 把 v1 报文里原本填 0 的字段用起来了:
· 携带子网掩码 → 支持 VLSM / CIDR / 不连续子网
· 组播 224.0.0.9 而不是广播 → 不跑 RIP 的设备不受打扰
· 支持明文 / MD5 认证
· 带下一跳字段 → 可以指向非通告者本身(NBMA 场景省一跳)
· 带路由标记 → 标记外部引入的路由
⚠️ 但有一个坑:auto-summary 默认还是开的 ——支持无类不等于默认无类行为,要显式 no auto-summary。
最坑的是默认行为造成的单向
思科默认:发 v1,收 v1 和 v2。
所以「一端配了 version 2、另一端忘了配」时:
· v1 那端发 v1 → v2 那端收得到(它收 v1 和 v2)
· v2 那端发 v2 → v1 那端收不到
结果是单向可达 —— 比完全不通难查得多,因为「有一半是通的」。
结论:两端都要显式配 version 2。
实验重点
- v1 的原罪只有一条:报文里不带子网掩码
- 由此推出:不支持 VLSM / CIDR / 不连续子网,还用广播、没认证
- v2 补上了掩码、组播、认证、下一跳、路由标记
- ⚠️ v2 的 auto-summary 默认还是开的,要显式
no auto-summary - ★ 两端都要显式配 version 2 —— 只配一端会形成单向
三个协议放在一起看:RIP 教会了我们什么
进阶 · 约 12 分钟
本课目标:把 RIP / EIGRP / OSPF 串成一条演进线。这才是学 RIP 的真正收获。
先承认:RIP 现网基本不用了
RIP 的问题是硬伤,不是调参能解决的:
· 网络直径最多 15 跳
· 收敛几十秒到几分钟
· 度量只看跳数,一条 64K 串口和万兆一样好
· 每 30 秒全量发送,规模一大就费带宽
当前场景就是第三条:R1 到 R3 后面的网段,RIP 会选那条 64K 串口(1 跳),而不是两跳万兆。
EIGRP 是怎么修的
EIGRP 仍然是距离矢量(只知道邻居报的距离、没有拓扑图),但它加了一个判据:
可行性条件:RD < FD(邻居到目的地比我近)
为什么这一条就够:如果邻居比我近,它就不可能是绕过我走的(绕我走至少要「我的距离 + 回来那段」)→ 拿它当备份一定不成环。
于是:
· 备份路径的无环性提前证明好了 → 后继一挂直接切换、0 个报文
· 不需要抑制计时器那种「用时间换正确」的补丁
· 度量换成带宽 + 延迟,不再只看跳数
EIGRP 就是「把 RIP 的补丁换成一个数学判据」。
OSPF 是怎么修的
OSPF 换了整个思路:不再只听邻居报距离,而是让每台设备都拿到全网拓扑图,自己跑 Dijkstra。
有了完整的图,环路在数学上就不可能出现 ——所以 OSPF 根本没有水平分割、毒性逆转、抑制计时器这些东西。
代价是:LSDB 占内存、拓扑一变要全区域重跑 SPF、要划区域控制规模、配置复杂。
三方对照
| | RIP | EIGRP | OSPF |
| --- | --- | --- | --- |
| 类型 | 距离矢量 | 高级距离矢量 | 链路状态 |
| 知道什么 | 邻居报的距离 | 邻居报的距离 | 全网拓扑图 |
| 每个目的地记几条 | 1 条 | 全部(拓扑表) | 全网图 |
| 度量 | 跳数 | 带宽 + 延迟 | cost(带宽反比)|
| 直径上限 | 15 跳 | 很大 | 很大 |
| 防环 | 四个补丁 | 可行性条件 | 完整拓扑 |
| 收敛 | 几十秒~几分钟 | 有 FS 时亚秒级 | 几秒 |
| 更新方式 | 每 30 秒全量 | 只发变化 | 只发变化 |
| 厂商 | 标准 | 思科私有 | 标准 |
「每个目的地记几条」那一行是最关键的差别 ——RIP 只记 1 条,所以后继一挂手里什么都没有,只能慢慢重新学。
所以为什么还要学 RIP
不是为了配它,而是因为:
它把「为什么需要 EIGRP 和 OSPF」讲清楚了。
· 不理解计数到无穷 → 不会真的理解 EIGRP 的可行性条件在防什么
· 不理解「只记一条路由」的代价 → 不会理解拓扑表为什么要保留所有邻居的距离
· 不理解「只听邻居说」的局限 → 不会理解 OSPF 为什么要费那么大劲同步 LSDB
RIP 是这条演进线的起点,它的每个缺陷都对应后面某个设计。
实验重点
- RIP 的硬伤:15 跳上限、收敛几十秒~几分钟、度量只看跳数、每 30 秒全量发
- EIGRP = 把 RIP 的补丁换成一个数学判据(可行性条件)
- OSPF = 换思路,让每台设备拿到全网拓扑图 → 环路数学上不可能
- ★ 最关键的差别是「每个目的地记几条路由」:RIP 只记 1 条
- 学 RIP 的收获不是会配它,而是理解另外两个协议为什么长成那样