Appearance
RIP 路由协议(距离向量)
2026 大纲 四(五)3 RIP,同时是 四(二)2 距离-向量路由算法在具体协议上的落地。Bellman-Ford 递推式的来历与收敛轮数的推导在《路由算法》,本篇只讲 RIP 这个协议的具体化。
一、把抽象的距离向量落成一个协议
上一篇的递推式
和谁交换? 只和相邻路由器。交换什么? 整张路由表,也就是"我到各个网络的距离和下一跳"——是结论,不是原料。什么时候交换? 每 30 s 一次,外加度量值变化时的触发更新。
一组基本参数跟着这三问定下来:度量用跳数;可达的最大距离是 15,16 即不可达;180 s(3 分钟)收不到某个邻居的更新,就把它记为不可达(距离置 16);报文封装在 UDP 端口 520 里。
上限为什么偏偏是 16? 它被两头夹住:上限越小,能管的网络规模越小;上限越大,无穷计数的收敛越慢——后面会看到,坏消息要一格一格顶到上限才停,收敛轮数与上限成正比。16 是"够用的网络规模"与"可忍受的坏消息收敛时间"之间的折中。
还要说清 16 是什么:它是一个哨兵值,不是一个真实的度量值。任何计算结果只要
距离从 0 起还是从 1 起,两本书口径不同,这里要写明。谢希仁的口径是直连网络距离为 1,"一条路径最多包含 15 个网络";另一种常见口径是直连为 0,"最多 15 跳"。两者只差一个常数 1,比较大小完全等价、选路结果相同,而且 16 在两种口径下都是不可达。做题时按题面给定的口径算,题面没给就用直连 = 1 并写清自己的口径。
交互可视化
二、三条更新规则
路由器 X 收到相邻路由器 Y 发来的距离向量,对其中每一项「目的网络 N,距离
这一步不能省,也不能挪到后面。 Y 报的是"我到 N 多远",而 X 要用的是"我经过 Y 到 N 多远",两者主语不同。不换算就直接和本表比大小,比的是两个不同主语的数。
预处理完再逐行比对,三种情形:
| 本表里有没有到 N 的记录 | 处理 | 理由 |
|---|---|---|
| 没有 | 添加新条目 | 新学到一个目的网络 |
| 有,且下一跳就是 Y | 无条件更新为 | 这是最新消息,必须以最新为准 |
| 有,但下一跳不是 Y | 只有 | 更短才值得换,相等换了也没好处 |
更新时还有一处细节:距离与下一跳必须一起改。第三条规则触发时若只改距离不改下一跳,这张表就自相矛盾了——距离说的是经过新邻居的长度,下一跳却还指着老邻居。
为什么"下一跳是发送者"必须无条件更新
这是三条里唯一反直觉的一条。设本表写着「Net2,距离 3,下一跳 R2」,它的完整含义是:"我到 Net2 的这条路是从 R2 学来的,全程要经过 R2。"
现在 R2 说"我到 Net2 要 6 跳了"。若只在变短时更新,本表就一直停在 3——可 3 这个数本来就是从 R2 那里推出来的,R2 的路变长了,那条经过 R2 的路不可能还是 3。旧值已经失去依据,继续留着就是撒谎。
极端情形正说明这条规则的必要性:R2 报 16(不可达)时,本表更新成
走一遍完整的更新
R1 当前表为「Net1,1,直连」「Net2,3,R2」「Net3,4,R3」「Net4,5,R2」;R2 报来的距离向量是 Net1=2、Net2=1、Net3=2、Net4=6、Net5=3。
预处理后(全部
| 目的网络 | 结果 | 距离 | 下一跳 | 触发的规则与理由 |
|---|---|---|---|---|
| Net1 | 不变 | 1 | 直连 | 第三条:下一跳不是 R2 且 |
| Net2 | 3 → 2 | 2 | R2 | 第二条:下一跳就是 R2,无条件跟随变近 |
| Net3 | 4 → 3 | 3 | R2 | 第三条: |
| Net4 | 5 → 7 | 7 | R2 | 第二条:距离变大也要更新——原来的 5 是从 R2 学来的,R2 的路变长,5 就失去了依据 |
| Net5 | 新增 | 4 | R2 | 第一条:本表里没有 |
五行恰好覆盖全部分支(不更新/无条件变小/更短才换/无条件变大/新增),逐一对号入座就不会漏。
三、快慢为什么不对称
RIP 有一句流传很广的评语:"好消息传得快,坏消息传得慢"。这不是修辞,两边走的是不同的规则分支。
好消息命中的是第三条"更短才更新"——毫无阻力,沿最短路一跳一轮扩散,总时间与网络直径成正比。
坏消息命中的是第二条"无条件更新"——它必须把一条根本不存在的绕行路径一格一格顶到 16,总时间与上限成正比,与网络多大无关。
无穷计数究竟走多少轮:逐轮表与水平分割的对照(想手动模拟一遍时展开)
R1 直连 Net1(距离 1),R2 经 R1 到 Net1(距离 2),未启用水平分割;更新严格轮流,且 R2 的周期性更新恰好先于 R1 的更新到达。现在 Net1 故障。
| 轮 | R1 到 Net1 | R2 到 Net1 | 这一轮发生了什么 |
|---|---|---|---|
| 0 | 16 | 2(下一跳 R1) | Net1 故障,R1 把直连项置 16 |
| 1 | 3(下一跳 R2) | 2 | R1 收到 R2 报的 2, |
| 2 | 3 | 4(下一跳 R1) | R2 收到 R1 报的 3,下一跳就是 R1 → 无条件更新为 4 |
| 3 | 5 | 4 | R1 此时下一跳已是 R2 → 无条件更新为 5 |
| 4 | 5 | 6 | 同理 |
| 5 | 7 | 6 | 同理 |
| … | … | … | 每两轮,双方各加 2 |
| 13 | 15 | 14 | R1 涨到 15 |
| 14 | 15 | 16 | R2 收到 15, |
| 15 | 16 | 16 | R1 收到 16,无条件更新, |
共 15 轮,按 30 s 一轮约
三点要读出来:第 1 轮是祸根——R1 明知 Net1 断了,却因为 R2 报了一个"看起来更好"的 3 而接受了它,距离向量只报"多远"不报"怎么走",R1 无从知道 R2 那条路正好穿过自己;第 2 轮起两边下一跳互指,每轮都命中"无条件更新",数值只能单调上涨;上限 16 是唯一的刹车,没有它这个循环会真的无穷下去。
对照:启用水平分割。 R2 从 R1 学来的 Net1 路由不再从这个接口发回给 R1,于是第 1 轮 R1 收不到那个致命的 2、保持 16;R1 把 16 告诉 R2,R2 下一跳是 R1,无条件更新为不可达。2 轮收敛,约 1 分钟。 但水平分割只挡两点环——若拓扑是 R1-R2-R3 绕成的三点环,坏消息仍会绕圈回来。开了触发更新仍然是 15 轮,只是每轮不必等满 30 s。
三种缓解措施可以用三个动词概括:水平分割是"不说"——记住路由从哪个接口学来的,不从该接口反向发回;毒性逆转是"说清楚"——照发,但把距离写成 16;触发更新是"早点说"——度量一变就发,不等满 30 s。
只有前两个改变了"会发生什么",第三个只改变"什么时候发生"。 触发更新的因果链一步没少,逐轮表上还是 15 轮,只是每轮不必等满 30 s——轮数由上限 16 决定,时间由发送时机决定。所以它一个环都挡不住,严格说根本不算防环措施。
毒性逆转比水平分割强在哪? 水平分割是沉默,邻居只能等表项老化(180 s)才敢判定失效;毒性逆转把沉默换成一句明确的 16,邻居当场无条件更新,省掉的正是那 180 s。代价是每轮多发一批注定是 16 的表项,报文变大。两者挡的环一样多——都只挡两点环。
四、局限与它今天的位置
RIP 的局限有五条,前三条教材点名,后两条同样要记:距离上限 15 决定它只能用于小型互联网;坏消息传得慢、收敛期间存在环路;交换的是完整路由表,规模一大开销随之增加;只以跳数为度量,会舍弃"网络数多但高速低时延"的好路径;不能在两个网络之间同时使用多条路由,做不了等价负载均衡。
但 RIP 没有死。 在直径小于 15、拓扑稳定、路由器算力有限的小网里,它的极简实现仍是合理选型。RIP2 支持 CIDR、提供简单鉴别、支持多播,协议本身并无多大变化。
最后纠一个常见的错说法:"所有路由器的路由表最终相同"是错的。 所有路由器最终都拥有全局路由信息,但每台的位置不同,路由表当然各不相同。链路状态协议保证的是数据库一致,路由表同样各不相同。
本节小结
- 基本参数一组:跳数度量、可达最大 15、16 = 不可达、30 s 广播完整路由表、180 s 判邻居失效、UDP 端口 520、仅与相邻路由器交换。上限 16 是"网络规模"与"坏消息收敛时间"的折中,不是随便定的。
- 三条更新规则的枢纽是第二条:先把距离
、下一跳改成发送者,再逐行比——没有就新增,下一跳就是发送者则无条件更新(变大也更新),下一跳不同则更短才更新且距离与下一跳一起改。第二条必须无条件,是因为旧值本来就是从这个邻居推出来的;坏消息全靠它才传得出去。 - 快慢不对称与防环:好消息一跳一轮扩散,坏消息要把虚假路径一格一格顶到 16。水平分割"不说"、毒性逆转"说清楚"(省掉 180 s 老化等待)、触发更新"早点说"(只压缩时间不减少轮数,一个环都挡不住)。所有路由器的路由表各不相同是正常的。
考点速记
RIP 在真题里被考过的形式有三种,从"读懂一个数"到"算一次收敛时间"层层加码。
① 收到 16 意味着什么(cn-2010-35)。R1 收到邻居 R2 的距离向量里有 <net1, 16>,问能得出什么结论,答 D:R1 不能经过 R2 到达 net1。逐项判:B 说"R2 可以到达 net1,跳数为 16"——16 是哨兵值不是距离,它的含义恰恰是"到不了";C 说"R1 可以经过 R2 到达 net1,跳数为 17"——
② 一次通告之后距离变成几(cn-2016-37)。R1、R2、R3 两两互连、R3 直连 Net2,已收敛(R3 距离 1,R2、R1 各 2)。R3 检测到 Net2 不可达并向 R2 通告一次,问 R2 更新后到该网络的距离,答 B:3。
这道题的巧妙之处在于它把"坏消息传得慢"做成了题面。R2 收到 R3 报的 16,经 R3 这条路判为不可达;但 R3 只通告了 R2,没通告 R1,R1 手里还捏着过期的"我到 Net2 距离 2",按周期发给 R2 → R2 算得
③ 用 RIP 的规则算一次收敛时间(cn-2024-47,9 分)。这道题把 RIP 和 OSPF、BGP 摆在一起考,前三问都落在 RIP 上:
第 (1) 问,AS4 内任意两主机通信可能经过 20 多个路由器,超过 RIP 的 15 跳上限,所以只能选 OSPF。要点是15 跳限的是"任意一对端点之间的跳数",不是"网络里有多少台路由器"——一条物理上走得通的路,只要超过 15 跳,RIP 就当它不可达。
第 (2) 问,AS3 内通信最多经过 15 个路由器,每经过一个 TTL 减 1,要保证到达时还活着,初始 TTL ≥ 16。
第 (3) 问是本题重点:R11~R16 同时启动、每 30 s 交换一次,问两个网络的路由都收敛至少需多久。做法是分别算每个网络"离源头最远的那台路由器有几跳":210.2.4.0/24 直连在 R16,最远的 R11 距它 3 跳;210.2.3.0/24 直连在 R14,最远才 2 跳。而第一次交换发生在
这里最容易错的是把交换次数和秒数对应错:
本篇练习区里还会出现另外五道题,机制分别讲在别处:cn-2013-47 与 cn-2017-37 考 BGP 的会话与封装,在 BGP;cn-2014-43 与 cn-2026-38 考 OSPF 的链路状态与区域划分,在 OSPF;cn-2021-37 考距离向量的一轮计算,在路由算法。
易错:16 是哨兵值不是距离,读作"不可达"。计算结果
一律截断为 16。
易错:15 跳限的是"任意一对端点之间的跳数",不是网络里路由器的总数。
易错:收敛耗时是
s——第一次交换发生在 , 跳需要 次交换。
易错:预处理(距离
、下一跳改发送者)必须先做,否则比的是两个不同主语的数。
易错:下一跳就是发送者时必须无条件更新,距离变大也更新。 坏消息全靠这条才传得出去。
易错:更新时距离与下一跳要一起改,只改一个表就自相矛盾了。
易错:触发更新不减少轮数,只压缩每轮的等待时间,它一个环都挡不住。
易错:水平分割和毒性逆转都只挡两点环,三点以上的环挡不住。
易错:"所有路由器路由表相同"是错的。 位置不同,路由表当然不同;链路状态协议保证一致的是数据库。
教材出处
- 谢希仁《计算机网络》(第 8 版)4.6.2 内部网关协议 RIP,印刷版 p159–p164:
- RIP 的定位与距离定义见 p159——"RIP 是一种分布式的基于距离向量的路由选择协议,是互联网的标准协议,其最大优点就是简单";"从一路由器到直接连接的网络的距离定义为 1",到非直接连接的网络则定义为所经过的路由器数加 1;"RIP 允许一条路径最多只能包含 15 个网络。因此'距离'等于 16 时即相当于不可达"。
- 两种距离口径等价的说明见 p160 脚注与正文——"到直接连接的网络的距离也可定义为 0。但这两种不同的定义对实现协议 RIP 并无影响,因为这对选择最佳路由的过程其实是一样的";同页还给出"RIP 不能在两个网络之间同时使用多条路由。RIP 选择一条具有最少网络数的路由(即最短路由),哪怕还存在另一条高速(低时延)但网络数较多的路由"。
- "和哪些路由器交换信息?交换什么信息?在什么时候交换信息?"这三个要点与 RIP 的三条答案(仅和相邻路由器交换、交换整张路由表、周期性交换)在 p160。
- 三条更新规则与"解释 1~解释 5"在 p161:解释 1 说明为什么要先把距离加 1、下一跳改为发送者;解释 3 正是"无条件更新"的理由——"因为这是最新的消息,要以最新的消息为准。到目的网络的距离有可能增大或减小,但也可能没有改变";解释 4、5 说明"更短才更新、相等不更新"。同页给出"若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离置为 16"。
- 路由表各不相同的结论在 p162——"虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的";同页给出 RIP2 支持无分类域间路由选择 CIDR、提供简单鉴别与支持多播,以及"RIP 报文作为运输层用户数据报 UDP 的数据部分进行传送(使用 UDP 的端口 520)"。
- RIP 的三条缺点与适用面在 p164——"首先,RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。其次,路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。最后,'坏消息传播得慢',使更新过程的收敛时间过长";"然而目前在规模较小的网络中,使用协议 RIP 的仍占多数"。同页还给出水平分割的思路——"让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送"。
- ⚠️ 本篇未引教材的部分:毒性逆转与触发更新这两个名词,谢希仁书中没有对应表述——该书在 p164 只给出了水平分割一种措施(并以"可以采取多种措施"带过)。这两条出自 RIP 的协议实现与工程实践,本篇按"能自洽推出"的口径写:毒性逆转的动作(发 16 而不是不发)与"下一跳是发送者就无条件更新"这条已引证的规则完全一致,触发更新的效果(只压缩时间不减少轮数)可由折叠块里的逐轮表直接读出。不编造页码。
相关知识
路由算法:距离向量 vs 链路状态|OSPF 路由协议|BGP 路由协议|网络层功能:路由、转发与异构网络互联