先把一句话放在前面:我做过不少网络项目,也带过新人,但凡提到“学路由”,我一般先不让他们碰OSPF,而是先把RIP吃透。不是因为它强大,而是因为它足够原始、足够简单,所有动态路由协议的思路——度量、更新、防环、收敛——它全都沾边。很多人觉得RIP这玩意儿老掉牙了,现实中谁还用?但你要真把RIP的原理弄明白了,后面学OSPF甚至BGP,都会顺很多。这篇文就把RIP从设计思路到配置排查完整拆一遍,适合刚入行的网络工程师、考取认证的备考党,以及那些在模拟器里搭了半天环境却始终“学不到路由”的人。
1. 为什么还需要RIP:从静态路由的坑说起
1.1 静态路由的三大痛点
先别急着鄙视RIP,咱们回到最原始的组网场景:三台路由器互联,每台设备后面挂了一个网段。用静态路由怎么搞?每台路由器上手动敲 ip route,把去往所有非直连网段的路径都写一遍。三台设备还好,十台呢?五十台呢?
静态路由的第一个坑就是维护成本。链路一多,路由条目成倍增长,每加一条链路,所有相关设备的路由表都可能要动。第二个坑是冗余失效。我见过很多生产环境,明明有主备两条链路,却只在主链路上配了静态路由,备份链路完全成了摆设。问起来就说“先通着,以后再优化”——结果“以后”就是三年。第三个坑是错误难以排查。路由写错一条,数据包就绕圈圈,而且它是静默失败的,线上出问题,短时间内很难定位是哪台设备的哪条路由写错了。
动态路由解决的就是这三个问题:自动发现拓扑、自动选路、链路挂了自动切换。而RIP恰恰是最早被广泛部署的动态路由协议之一,它用一种极其朴实的方式完成这件事——把“自己怎么到某个网段”的经验告诉邻居,邻居再告诉自己的邻居,一传十、十传百,整个网络就都知道了。
1.2 动态路由的两条技术路线
要理解RIP,先得知道现在动态路由大体分两派:距离矢量(Distance Vector)和链路状态(Link State)。
链路状态的代表是OSPF和IS-IS,思路是每台路由器把自己“周边有哪些邻居、链路开销多少”的信息广播出去,最终全网每台设备都攒出一张完整的网络地图(LSDB),然后各自拿地图跑最短路径算法。这种方案信息全、收敛快,但代价是复杂度高,配置和排障门槛都不低。
距离矢量的代表作就是RIP,思路完全相反:我不需要知道全网的拓扑,我只关心“去某个目的地,走哪个邻居最近”。每个运行RIP的路由器把自己路由表的摘要信息定期扔给邻居,邻居收到后对照自己的表,能优化就优化,然后继续往下传。就像村子里的消息传播,每个人不一定见过全村所有人,但只要大家都把自己知道的消息往外传,最终消息还是能覆盖全村。
RIP作为距离矢量协议的鼻祖,把“邻居之间传路由信息”这个过程表达到了极致,这也就注定了它简单、收敛慢,但极其容易理解和排障。
1.3 RIP的版本与生存位置
RIP有两个主流版本:RIPv1和RIPv2。RIPv1诞生于1980年代,属于有类路由协议,更新报文里不携带子网掩码,它做不了VLSM和CIDR;RIPv2在1994年前后推出,更新报文里带了掩码信息,同时支持组播发送更新(224.0.0.9)以及简单密码认证,这就让RIP在小规模网络中有了继续存活的理由。
别觉得RIP只在教科书里活着。实际上很多老旧网络、嵌入式设备、小型分支机构,依然在跑RIP。有些厂商的路由器默认支持RIP,物理机上装个Linux用Quagga/FRR也能轻松跑起来。它最大的价值在于:不需要复杂的规划和Tuning,宣告一下网段,就能自动完成全网路由互通,对于“小、稳、省事”这三个诉求,RIP反而是个不错的答案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 距离矢量思维:RIP到底是怎么选路的
2.1 跳数作为度量:RIP的“距离”定义
RIP用“跳数(hop count)”作为路由的唯一度量标准。什么叫跳数?就是从当前路由器出发,到达目的网段要经过几台路由器。注意,它不关心带宽、不关心延迟、不关心线路质量,只看“隔了几跳”。
这个设计让RIP极度简单,但也带来了最出名的问题——最大有效跳数只有15跳,16跳视为不可达。为什么通信协议的标准(RFC 1058)当初定这个数?主要是为了抑制路由环路。所有距离矢量协议都面临一个经典难题:A告诉B“我能到X”,B告诉C“我能到X”,C又告诉A“我能到X”,这样互相“打气”,路由条目就会无限增长、永远不收敛。限制最大跳数等于给这个“吹牛”过程画了一条线,超过15跳就宣告“无路可走”,环路自然被切断了。
阈值设得越小,防环能力越强;但也不能设得太小,否则大一点的网络就没法用了。15这个数字是当时权衡的结果——满足绝大多数企业网、校园网的纵深需求,同时能有效遏制计数到无穷的问题。放到今天的网络规模来看,RIP只能在中小型网络里玩,也是出于这个原因。
路由条目的工作逻辑是这样的:路由器从直连接口启动RIP后,每30秒向所有开启RIP的接口发送一次完整的路由表更新。邻居收到这条更新后,检查里面的每条路由:如果自己路由表中没有这条目的地,就学过来,度量加1;如果自己已有这条路,就比较新旧度量的优劣。新路由比旧路由更短,替换;新路由跟旧路由来自同一个下一跳但度量变了,刷新;新路由比旧路由更长并且不是来自同一个下一跳,丢弃。
2.2 30秒更新与定时器家族
RIP的整个生命周期由一组定时器驱动,这是它和OSPF最大不同的地方。OSPF靠触发更新和Hello机制做到秒级收敛,RIP则固执地相信“周期性广播”才是稳定的唯一来源。
关键定时器有四个:
- 更新定时器(Update Timer):默认30秒,每台路由器周期性地把自己的完整路由表通过UDP 520端口发出去。
- 失效定时器(Invalid Timer):默认180秒,如果一条路由在180秒内没有收到更新,就标记为“可能失效”,但不会马上删除,而是进入抑制期。
- 抑制定时器(Holddown Timer):默认180秒,从标记失效开始,这条路由在一段时间内不接受任何新信息。这个机制是为了防止因为链路抖动导致的反复震荡。
- 刷新定时器(Flush Timer):默认240秒,到期后这条路由就从路由表里彻底删除。
举个实际场景来理解。A和B之间有一条直连链路,A每30秒给B发一次更新。假设某一天B去往某个网段的直连链路被管理员shutdown了,B会在路由表中把这条直连路由标记为失效,同时立即触发一次更新告诉邻居“我这边去不了那个网段了”。但如果你没有启用触发更新,B只能等下一轮周期更新才能把这个消息传出去——这就是RIP收敛慢的最根本原因。
2.3 防环三件套:水平分割、毒性逆转、触发更新
RIP最大的敌人是环路。经典的距离矢量环路场景是:路由器A、B、C串成一条链,A有一个网段X。某天A和X之间断掉,A会把X标记为不可达,但B这时候还没收到消息,B仍然认为“去X可以走A”。C则从B那里学到“去X走B”。等A声明X不可达后,C那边关于X的路由可能会继续保存,因为C是从B学的,B又从A学的——在更新周期之间,环路就已悄然形成。
为了对付这种局面,RIP制定了三个防环机制:
第一,水平分割(Split Horizon),核心原则是“从哪个接口学到的路由,不再从这个接口发回去”。B从A那里学到“去X走A”,那么B就绝不会再跟A说“去X走我”。这就像你跟张三说“我知道李四在哪”,你不可能再把“李四在哪”这个消息原封不动传回给张三——他自己知道得更清楚。
第二,毒性逆转(Poison Reverse),比水平分割更进一步,它不但不发回原始路由,反而会把该路由的度量直接改成16(不可达)再发回去,等于明确告诉对方“这条路我这儿已经死了”。实践配置中,华为设备的RIP接口默认开启水平分割,而思科则默认是毒性逆转的逻辑。
第三,触发更新(Triggered Update),链路状态一变化,不等30秒周期,立刻把变化的路由条目广播出去,让邻居尽快更新,缩短环路存活的窗口。
这三板斧配合最大跳数15,基本能保证RIP在一个规模适中的网络中不会因为环路把路由表搞爆。但教科书没说的是:这些防环机制只对“典型拓扑”有效,如果拓扑里出现了次优路径,或者有人手动改了计时器,RIP依然会翻车。这点后面排查章节细说。
3. 实战:三台路由器5分钟跑通RIPv2
3.1 拓扑规划与地址分配
纸上谈兵到此为止,实际操作走一遍。以一个最常见的三路由器串接拓扑为例,来模拟一个小型分支机构组网。
设备规划如下:
- R1:连接网段 192.168.1.0/24,接口 G0/0 的 IP 是 192.168.1.1,连接 R2 的接口 S1/0 是 10.0.12.1/30。
- R2:串接中间节点,S1/0 是 10.0.12.2/30,连接 R3 的接口 S1/1 是 10.0.23.2/30。
- R3:连接网段 192.168.3.0/24,接口 G0/0 的 IP 是 192.168.3.1,连接 R2 的接口 S1/0 是 10.0.23.3/30。
三台设备之间的物理链路都用 /30 掩码,保留两个可用地址,足够以后扩展。这里有个规划细节:RIP宣告网络时按主类网络来宣告,所以 10.0.12.0/30、10.0.23.0/30 这两个子网在实际宣告时统一敲 network 10.0.0.0,RIP会找出匹配的接口并对其启用。你看,这就是RIPv2的好处——它虽然宣告时是主类写法,但更新报文中携带了真正的子网掩码,所以 /30 的明细路由可以正确传递。如果用RIPv1,两个 /30 之间就会因为“有类路由”的规则产生掩码问题,甚至直接学不到路由。
地址规划的原则也很简单:互联地址和业务地址严格分开,业务地址单独开一个段,互联地址统一用 /30。这样以后写ACL、做汇总、排查二三层问题,都会轻松很多。我见过不少人图省事,三台设备互联各自用了一个 /24 网段,你品品,十六台设备以后地址表怎么排——这种坑从地址规划阶段就能避免。
3.2 配置命令与逐条解读
三台设备的配置大同小异,以R1为例:
code复制system-view
rip 1
version 2
undo summary
network 192.168.1.0
network 10.0.0.0
return
逐条拆解:
rip 1创建一个RIP进程,编号1,设备上可以同时跑多个RIP进程,实际场景中基本用不到,但华为设备要求必须给进程编号,养成习惯就好。version 2:指定运行RIPv2,这一步是最关键的。如果不敲,华为设备默认是RIP兼容模式,可能同时发v1和v2报文,也可能因为版本不一致导致路由学不到。undo summary:关闭自动汇总。默认情况下RIP会在主类网络边界自动汇总路由,如果两个子网分属同一个主类网络(比如10.0.12.0/30和10.0.23.0/30都属于10.0.0.0),路由器会把这个主类网络汇总后宣告,可能导致明细路由丢失。配置中建议永远保留这条,防止各种“学得到路由但明细不对”的怪问题。network 192.168.1.0:宣告业务网段。这条命令的本质不是“宣告192.168.1.0这个网段本身”,而是“让192.168.1.1这个接口运行RIP”,明细路由自然而然就从该接口发出去。同理network 10.0.0.0是让10.0.12.1这个接口运行RIP。一定要记住这个底层逻辑,很多人误以为network命令是往路由表里加网段,实际上它是匹配接口的手段。
R2和R3的配置同理,R2上不需要宣告任何业务网段,只需要:
code复制rip 1
version 2
undo summary
network 10.0.0.0
R3上宣告自己的业务网段和互联网段。
配置完成后,在所有路由器上执行 display rip 1 route 查看RIP学习到的路由。正常情况下,R1的路由表中会同时看到10.0.23.0/30和192.168.3.0/24,度量分别是2(经过R2、R3两跳,初始直连路由度量为0,学习到后每次加1)。
3.3 抓包验证RIP更新过程
命令层面的验证只能告诉你结果对不对,想看过程还得抓包。在R1的G0/0接口上抓包,或直接在R1和R2之间做端口镜像,用Wireshark抓UDP 520端口的报文。
方法很简单:R1和R2互联的接口上,用tcpdump -i g0/0 udp port 520,或者直接在Wireshark里设置过滤条件 udp.port == 520。RIPv2的报文每隔大约30秒出现一次,内容包含:命令字段(1表示请求、2表示响应,平时看到的都是响应)、版本号(2)、路由条目数量(最多25条)、以及每个条目的IP地址、子网掩码、下一跳、度量和路由标记。
抓包时你会看到一个重要现象:R1周期性发送的RIPv2更新报文里头,有10.0.23.0/30和192.168.3.0/24,但绝不会有从R2学来的那条“10.0.12.0/30去往R1”的路由。为什么?因为水平分割——R1从R2那里学到的路由,本身就知道R2比自己更了解这条路径,不会再把这个信息发回给R2。抓包看到这个现象,才说明你真正理解了RIP的防环机制,而不只是会敲命令。
另外注意一下RIPv2的更新目标是组播地址224.0.0.9,不是广播。这意味着只有运行了RIP的接口才会处理这个报文,其他接口完全无视,既节省了带宽,又降低了无关设备的CPU负担。对比RIPv1用255.255.255.255广播更新,在同一网段内有大量主机时二者效率差别非常明显。
4. 路由学不到、环路抖动:这些坑都是这么排出来的
4.1 为什么路由表里始终看不到邻居的网段
这是所有人跑RIP时第一个会遇到的问题:明明配置没问题,display rip 1 route 却一条外部路由都没有。按我的经验,九成原因出在这几个地方。
第一,版本不一致。R1跑v2,R2没敲version 2而在默认兼容模式下只发送v1报文,两边报文格式不匹配,谁也学不到谁。排查思路特别简单:抓包看一眼端口520上是不是同时存在版本1和版本2的报文,或者在接口上执行display rip 1 interface看接口的收发版本状态。
第二,network宣告漏了。这是最常见的配置失误。R1上只宣告了network 192.168.1.0,忘了宣告互联接口所在的network 10.0.0.0,那么R1和R2之间的链路就没有运行RIP,两边自然无法交换路由。记住network命令匹配的是接口,不是直接的网段宣告。所以排查时检查每个互联接口是否都被RIP进程“覆盖”到了。
第三,RIPv2更新被过滤或阻止。检查中间有没有ACL拦掉了UDP 520端口,或者接口上有没有配置rip authentication-mode但密钥不一致。这两个问题都比较隐蔽,但抓包都能一眼识破——抓半天没有520报文,就是ACL问题;报文里有认证字段且显示invalid,就是密钥问题。
4.2 路由翻来覆去:环路、次优路径与收敛震荡
跑通了RIP之后,另一个经典难题是路由震荡。具体表现是某条路由在路由表中一会儿出现一会儿消失,或者去往某个网段的路径一会儿走A、一会儿走B,延迟和丢包率还不稳定。这种事在生产环境中非常恶心,因为网络看起来“好像通”,但丢包卡顿就像定时炸弹一样。
最常见的根因是水平分割被关闭。某些改制设备、或者你在接口下敲了undo rip split-horizon,那么从邻居学来的路由可能原封不动发回给邻居,两个直连设备之间就会形成互相学习、互相覆盖的环路反馈。排查方法:接口视图下执行display rip interface,查看Split Horizon和Poison Reversion的状态,确保是enabled。
另一个根因是计时器被人动过。有人为了“让RIP收敛快一点”,把更新定时器改成5秒、把失效定时器改成30秒,这种做法带来的后果就是网络稍微抖动一下,路由表就疯狂刷新,甚至出现临时环路。RIP的定时器改动必须遵循一个原则:失效定时器至少是更新定时器的3倍,刷新定时器要比失效定时器长30到60秒。如果你不确定怎么调,就别调,默认值虽然在现代网络里明显偏保守,但至少是稳定的。
还有次优路径问题。RIP只认跳数,不认带宽。比如去往同一个目标网段有两条路径:一条是高速光纤直连,中间隔了两跳;另一条是慢速拨号链路,只隔了一跳。RIP会毫不犹豫地选那条只隔一跳的慢速线路。这不是RIP的bug,就是它的设计。如果你网络里存在这种“多路径但性能差异巨大”的场景,强烈建议直接换OSPF,而不是绞尽脑汁在RIP里折腾。这一点上,RIP就像交通工具选型里的自行车——灵活简单,但上了高速就力不从心。
4.3 RIP到底过时了吗:场景判断与替代方案
不少人在评论区问过一个问题:RIP都三十多年了,现在学它还有什么意义?
我的观点很明确:RIP不是用来撑大网络的,它是用来撑起你“对动态路由的底层理解”的。它把所有动态路由协议都会遇到的基本问题——选路、宣布、防环、收敛——都用最简单的方式呈现了一遍。搞懂RIP之后,再去学OSPF里的DR/BDR、区域划分、LSA类型,你会明显感觉到“原来OSPF的这么多机制都是在解决RIP解决不好的问题”,学起来会顺畅很多。
现实中还在用RIP的场景大致有三类:一是超小型企业网或门店网络,设备数量有限,路由规模不超过十台路由器,RIP配置简单、维护成本极低的优势依然很有吸引力;二是老旧设备兼容场景,一些服役十余年的设备只支持RIP,替换成本又高,只能继续跑RIP;三是教学与考试环境,思科、华为、H3C的认证体系中RIP始终是动态路由入门的第一课。
如果你真的在规划一个新建网络,路由规模在几十台以上,或者对收敛时间有明确要求,那就别用RIP了。OSPF基本是标准答案:它收敛快、无跳数限制、支持多路径等价负载均衡,虽然复杂一点,但对应的收益完全值得付出。而在运营商骨干或跨域场景,RIP更是完全没有立足之地,那里是BGP的天下。选型就是个匹配问题——小网络用RIP省心,大网络用OSPF求稳,骨干网用BGP接天下。
最后再分享一个我在实战里反复用到的习惯
很多人跑RIP只关心“路由通了没有”,我建议你再多走一步:把display rip 1 route、display rip 1 interface、display rip 1 neighbor这三条命令形成肌肉记忆。排障时按固定顺序来——先看邻居是否建立成功,再看接口上的协议状态,最后查具体路由条目,基本十步之内能定位九成的问题。我在带新人的时候总是强调一句:RIP这种东西,真正的门槛不在命令,而在你愿不愿意从30秒一条的周期性报文里去理解网络的真实状态。把它看懂了,后面那些更复杂的路由协议,不过是在这个原始模型上做加法罢了。
