Skip to content

RIP 路由协议(距离向量)

2026 大纲 四(五)3 RIP,同时是 四(二)2 距离-向量路由算法在具体协议上的落地。Bellman-Ford 递推式的来历与收敛轮数的推导在《路由算法》,本篇只讲 RIP 这个协议的具体化。

一、把抽象的距离向量落成一个协议

上一篇的递推式 Dx(y)=minv[c(x,v)+Dv(y)] 是数学,它没有回答三个工程问题:和谁交换、交换什么、什么时候交换。RIP 就是对这三问的一组具体回答——而且回答得极其简单,这正是它的最大优点。

和谁交换? 只和相邻路由器。交换什么? 整张路由表,也就是"我到各个网络的距离和下一跳"——是结论,不是原料。什么时候交换?30 s 一次,外加度量值变化时的触发更新。

一组基本参数跟着这三问定下来:度量用跳数;可达的最大距离是 1516 即不可达180 s(3 分钟)收不到某个邻居的更新,就把它记为不可达(距离置 16);报文封装在 UDP 端口 520 里。

上限为什么偏偏是 16? 它被两头夹住:上限越小,能管的网络规模越小;上限越大,无穷计数的收敛越慢——后面会看到,坏消息要一格一格顶到上限才停,收敛轮数与上限成正比。16 是"够用的网络规模"与"可忍受的坏消息收敛时间"之间的折中。

还要说清 16 是什么:它是一个哨兵值,不是一个真实的度量值。任何计算结果只要 16,一律读作"不可达"。

距离从 0 起还是从 1 起,两本书口径不同,这里要写明。谢希仁的口径是直连网络距离为 1,"一条路径最多包含 15 个网络";另一种常见口径是直连为 0,"最多 15 跳"。两者只差一个常数 1,比较大小完全等价、选路结果相同,而且 16 在两种口径下都是不可达。做题时按题面给定的口径算,题面没给就用直连 = 1 并写清自己的口径。

交互可视化

加载可视化中...

二、三条更新规则

路由器 X 收到相邻路由器 Y 发来的距离向量,对其中每一项「目的网络 N,距离 d」,先做预处理:距离改成 d+1、下一跳改成 Y

这一步不能省,也不能挪到后面。 Y 报的是"到 N 多远",而 X 要用的是"我经过 Y 到 N 多远",两者主语不同。不换算就直接和本表比大小,比的是两个不同主语的数。

预处理完再逐行比对,三种情形:

本表里有没有到 N 的记录处理理由
没有添加新条目 (N, d+1, Y)新学到一个目的网络
有,且下一跳就是 Y无条件更新(N, d+1, Y)不管变大还是变小这是最新消息,必须以最新为准
有,但下一跳不是 Y只有 d+1< 原距离时才更新;否则什么也不做更短才值得换,相等换了也没好处

更新时还有一处细节:距离与下一跳必须一起改。第三条规则触发时若只改距离不改下一跳,这张表就自相矛盾了——距离说的是经过新邻居的长度,下一跳却还指着老邻居。

为什么"下一跳是发送者"必须无条件更新

这是三条里唯一反直觉的一条。设本表写着「Net2,距离 3,下一跳 R2」,它的完整含义是:"我到 Net2 的这条路是从 R2 学来的,全程要经过 R2。"

现在 R2 说"我到 Net2 要 6 跳了"。若只在变短时更新,本表就一直停在 3——可 3 这个数本来就是从 R2 那里推出来的,R2 的路变长了,那条经过 R2 的路不可能还是 3。旧值已经失去依据,继续留着就是撒谎。

极端情形正说明这条规则的必要性:R2 报 16(不可达)时,本表更新成 min(16+1,16)=16坏消息正是靠这条规则才传得下去——若"变大不更新",故障信息永远传不出去,路由表会永久停在一条已经断掉的路径上。

走一遍完整的更新

R1 当前表为「Net1,1,直连」「Net2,3,R2」「Net3,4,R3」「Net4,5,R2」;R2 报来的距离向量是 Net1=2、Net2=1、Net3=2、Net4=6、Net5=3。

预处理后(全部 +1、下一跳全改 R2)得 Net1=3、Net2=2、Net3=3、Net4=7、Net5=4。逐行比对:

目的网络结果距离下一跳触发的规则与理由
Net1不变1直连第三条:下一跳不是 R2 且 3>1。直连最短,绕道 R2 只会更远
Net23 → 22R2第二条:下一跳就是 R2,无条件跟随变近
Net34 → 33R2第三条:3<4 更新,距离与下一跳一起从 R3 改成 R2
Net45 → 77R2第二条:距离变大也要更新——原来的 5 是从 R2 学来的,R2 的路变长,5 就失去了依据
Net5新增4R2第一条:本表里没有

五行恰好覆盖全部分支(不更新/无条件变小/更短才换/无条件变大/新增),逐一对号入座就不会漏。

三、快慢为什么不对称

RIP 有一句流传很广的评语:"好消息传得快,坏消息传得慢"。这不是修辞,两边走的是不同的规则分支。

好消息命中的是第三条"更短才更新"——毫无阻力,沿最短路一跳一轮扩散,总时间与网络直径成正比。

坏消息命中的是第二条"无条件更新"——它必须把一条根本不存在的绕行路径一格一格顶到 16,总时间与上限成正比,与网络多大无关。

无穷计数究竟走多少轮:逐轮表与水平分割的对照(想手动模拟一遍时展开)

R1 直连 Net1(距离 1),R2 经 R1 到 Net1(距离 2),未启用水平分割;更新严格轮流,且 R2 的周期性更新恰好先于 R1 的更新到达。现在 Net1 故障。

R1 到 Net1R2 到 Net1这一轮发生了什么
0162(下一跳 R1)Net1 故障,R1 把直连项置 16
13(下一跳 R2)2R1 收到 R2 报的 2,2+1=3;R1 原记录下一跳是"直连"不是 R2,走第三条规则,3<16更新环路就在这一步形成
234(下一跳 R1)R2 收到 R1 报的 3,下一跳就是 R1 → 无条件更新为 4
354R1 此时下一跳已是 R2 → 无条件更新为 5
456同理
576同理
每两轮,双方各加 2
131514R1 涨到 15
141516R2 收到 15,15+1=16判定不可达
151616R1 收到 16,无条件更新,min(16+1,16)=16收敛

15 轮,按 30 s 一轮约 15×30=450 s =7.5 分钟。

三点要读出来:第 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、提供简单鉴别、支持多播,协议本身并无多大变化。

最后纠一个常见的错说法:"所有路由器的路由表最终相同"是错的。 所有路由器最终都拥有全局路由信息,但每台的位置不同,路由表当然各不相同。链路状态协议保证的是数据库一致,路由表同样各不相同。

本节小结

  1. 基本参数一组:跳数度量、可达最大 15、16 = 不可达、30 s 广播完整路由表、180 s 判邻居失效、UDP 端口 520、仅与相邻路由器交换。上限 16 是"网络规模"与"坏消息收敛时间"的折中,不是随便定的。
  2. 三条更新规则的枢纽是第二条:先把距离 +1、下一跳改成发送者,再逐行比——没有就新增,下一跳就是发送者则无条件更新(变大也更新),下一跳不同则更短才更新且距离与下一跳一起改。第二条必须无条件,是因为旧值本来就是从这个邻居推出来的;坏消息全靠它才传得出去
  3. 快慢不对称与防环:好消息一跳一轮扩散,坏消息要把虚假路径一格一格顶到 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"——16+1=1716,同样是不可达,而且 RIP 里根本不存在 17 这个可用度量;A 把方向说反了。这道题只考一件事:16 读作"不可达",不读作"很远"。

② 一次通告之后距离变成几(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 算得 2+1=3,比 16 小,于是改走 R1,距离 3。选项里的 16 和 17 就是给"只看 R3 那一路"的人准备的。这个 3 本身就是一条不存在的路径——无穷计数的第一步。

③ 用 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 跳。而第一次交换发生在 t=0,所以扩散 3 跳只需 t=0,30,60 三次交换、即 60 s;另一个网络 30 s 就够。取较大值,答 60 s

这里最容易错的是把交换次数和秒数对应错n 跳需要 n 次交换,而第一次在 t=0,所以耗时是 (n1)×30 s,不是 n×30 s。

本篇练习区里还会出现另外五道题,机制分别讲在别处:cn-2013-47 与 cn-2017-37 考 BGP 的会话与封装,在 BGP;cn-2014-43 与 cn-2026-38 考 OSPF 的链路状态与区域划分,在 OSPF;cn-2021-37 考距离向量的一轮计算,在路由算法

易错16 是哨兵值不是距离,读作"不可达"。计算结果 16 一律截断为 16。

易错15 跳限的是"任意一对端点之间的跳数",不是网络里路由器的总数。

易错收敛耗时是 (n1)×30 s——第一次交换发生在 t=0n 跳需要 n 次交换。

易错预处理(距离 +1、下一跳改发送者)必须先做,否则比的是两个不同主语的数。

易错下一跳就是发送者时必须无条件更新,距离变大也更新。 坏消息全靠这条才传得出去。

易错更新时距离与下一跳要一起改,只改一个表就自相矛盾了。

易错触发更新不减少轮数,只压缩每轮的等待时间,它一个环都挡不住。

易错水平分割和毒性逆转都只挡两点环,三点以上的环挡不住。

易错"所有路由器路由表相同"是错的。 位置不同,路由表当然不同;链路状态协议保证一致的是数据库

教材出处
  • 谢希仁《计算机网络》(第 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 路由协议网络层功能:路由、转发与异构网络互联

真题练习