RIP路由协议深度实验:距离矢量与防环机制全解析
不管你现在用的是OSPF还是IS-IS只要你还在跟路由打交道我都建议你花一晚上把RIP认真玩一遍。我这么说不是让你在现网把路由协议换回RIP而是因为RIP这个协议太适合用来理解路由协议到底在做什么了。它简单到你看完原理就能在模拟器里复现但又包含了一个分布式路由协议必须具备的全部要素度量值、定时器、防环机制、版本演进。这种协议你不亲手抓一遍报文、亲眼看看它怎么收敛后面学BGP、OSPF总是会缺那么一块。RIP的全称是路由信息协议工作在应用层依靠UDP 520端口跟邻居交换路由信息。距离矢量的思想是它最底层的逻辑——每台设备只掌握自己身边的道路信息通过邻居之间的定期广播最终让全网知道所有网段怎么走。有点像一个村子里的消息传递谁也不清楚全村地图但你把自己听说的路线告诉邻居邻居再告诉他的邻居最后人人都知道去任何一户该怎么走。RIP的度量单位就是跳数简单粗暴但从这个看似简陋的设计出发你能看到路由协议面对的核心问题怎么防止谣言扩散、怎么保证收敛、怎么避免环路。这篇文章就以RIP为样本把原理和实验串起来讲一遍适合刚学路由的新人也适合想补基础的在职网络工程师。1. 先回答一个问题为什么这套老掉牙协议还值得死磕RIP诞生于上世纪八十年代那个年代一个企业网络里可能就几十台路由器网段分配也规规矩矩。今天再去看它确实浑身都是毛病收敛慢、跳数上限低、不支持负载均衡权重。但恰恰是这些缺陷把路由协议的核心问题暴露得清清楚楚比直接上手OSPF要友好得多。1.1 学RIP到底在学什么RIP是距离矢量协议家族里结构最简单的代表。它不计算全网拓扑不维护链路状态数据库不做SPF算法它只做一件事听邻居说然后算出一张去某个网段最少要跳几次的表。这个听邻居说的模型其实和BGP有异曲同工之处——BGP也是一种基于路径向量的协议它同样不要求全网拓扑一致只信任邻居通告的路径信息。你先搞懂RIP的信任模型再学BGP的防环设计会发现思路是连贯的。另一点是协议演进逻辑。RIPv1时期没有掩码概念、用广播发更新、没有任何认证后来网络规模一大马上暴露出问题于是出现RIPv2补上了掩码、组播和认证再后来大家嫌它收敛太慢、度量太粗糙又有了OSPF和IS-IS。这条发展线本身就是一部微缩的路由协议史。你在实验里先亲手配一遍RIPv1再升级到RIPv2体会肯定比光看表格深刻。1.2 RIP在真实网络里的存活场景很多刚入门的朋友以为RIP已经绝迹了其实并没有。在一些低端接入设备、老旧网络改造的过渡期、以及某些对协议开销极敏感的嵌入式网络场景里RIP依然在服役。原因是它实现太简单了不需要维护大状态表不要求设备有很强的CPU和内存配置也就几行命令。出了故障排查也容易路由表一看就懂。所以别觉得学它是浪费时间真遇到这些环境能看得懂RIP报文的人反而能救场。不过我必须强调这篇文章的目标不是让你在现网部署RIP而是通过实验把路由协议的基本动作练成肌肉记忆。等到你能清楚说出我的路由表里这条路由是从哪个邻居、通过哪个接口学来的时这个目的就达到了。2. RIP的底层逻辑距离矢量、跳数与四大定时器2.1 距离矢量协议眼中的网络拓扑RIP的核心是分布式Bellman-Ford算法。说人话就是每个路由器的路由表里维护到达某个网段的最小跳数和下一跳地址。每个RIP周期默认30秒路由器把自己整张路由表通过启用RIP的接口发出去。邻居收到后把每一条路由的跳数加1然后跟自己的路由表比较如果新学到的跳数更小就更新路由下一跳指向通告给我的那台路由器。这个机制有个关键点RIP没有显式的邻居状态不像OSPF那样有Hello报文和邻居数据库。RIP路由器只是单方面周期性地发送自己的路由表也单方面地接收邻居传来的报文。如果一台设备连续好几个周期都没收到某个邻居的更新它不会说我跟邻居断开了而是把它从该邻居学到的所有路由标记为不可达。这种靠收不到来判断故障的设计是理解RIP很多异常行为的钥匙。2.2 跳数度量的设计与15跳上限RIP衡量路径优劣的标准只有跳数也就是数据包经过的路由器数量。直连网段跳数为0每经过一个路由器加1。协议规定跳数小于等于15的路由是可达的16被视为无穷大代表不可达。为什么偏偏是15这源自一个很实际的原因距离矢量协议的更新报文会沿着环路在路由器之间反复兜圈如果不给跳数设一个上限一条已经失效的路由会被邻居之间不断互相刷高永远停不下来。设了15这个上限最多只要刷到16大家就都知道这条路不可达了。这也解释了为什么RIP天生不适合大型网络——一个网络只要横向超过15跳边缘网段就互相不可达了。所以在设计网络层次时一般把网络控制在较小的范围这也是RIP慢慢退出核心网络的原因之一。2.3 四大定时器如何驱动收敛节奏RIP的所有行为都围绕四个定时器转记住它们就掌握了RIP的时间节奏定时器默认值作用更新定时器30秒周期性地把整张路由表发送给邻居失效定时器180秒连续180秒没收到某路由的更新就将其标记为不可达抑制定时器180秒收到关于某路由的更差消息后在抑制期内不轻易采纳更新防止谣言回流清除定时器240秒达到该时间后把路由从表中彻底删除这里有个细节值得注意所谓的30秒更新并不是所有路由器齐齐整整地每隔30秒发一次那样全网设备同时发包会造成广播风暴。RIP报文发送时间会加入随机抖动实际你看到的是28秒、31秒、33秒各不一样。这就是为什么抓包时你会发现更新间隔不是严格的30.0秒。失效定时器180秒正好等于六个更新周期意味着如果我连续六轮都没听说某条路由的新消息那我就不再相信它。抑制定时器是防环的重要一环但它的行为在不同厂商实现里有些差异你在实验里观察到的现象以你的模拟器默认配置为准。3. 路由环路与防环机制RIP最精华的部分3.1 环路是怎么形成的计数到无穷大RIP最容易让人困惑的问题就是路由表怎么会越算越错。给你画个最简单的场景两台路由器A和B直连B还连着网段X。B到X的链路突然断了B本能地知道自己到X不可达。但此时A的心里还留着到X经过B跳数为2的旧路由并且按计划在30秒后把这条路由通告给B。B收到A的通告说我能到X2跳再算上从B到A的1跳觉得那我到X应该是3跳更新路由指向A。然后B又把这条3跳的路由通告给AA发现自己到达X变成4跳再通知B……就这么一路涨上去直到涨到16大家才统一认定X不可达。这就是距离矢量协议著名的计数到无穷大问题。你千万别觉得这只是个理论场景实际网络里链路抖动、接口连闪、误配置都会诱导这个过程发生。RIP的所有防环机制本质上都是在跟谣言回流作斗争。3.2 水平分割与毒性反转解决两个节点之间的环路最有效的办法就是水平分割。规则很简单从哪个接口学到的路由绝不再从那个接口发回去。还是刚才的场景A的到X经过B这条路由是从B的接口学来的水平分割禁止A再把这条路由通告回BB就不会收到那个我能到X2跳的谣言环路在源头上就被掐断了。毒性反转则是水平分割的更激进变体我不但把这条路由藏着不发反而主动把到X不可达16跳这个信息通告回去。对方收到一条毒化路由后会立刻意识到这条路线已经失效不再抱有幻想。这两种机制各有取舍水平分割省报文毒性反转收敛更果断。不同厂商的RIP实现可能默认启用其一也可能两者相结合。实验中你可以在抓包里看到被毒化的路由条目metric直接显示16。3.3 触发更新与抑制计时器光靠周期性更新RIP的反应速度太慢了。链路断了以后如果邻居要等30秒才能知道等于网站在故障期间一直处于黑洞状态。所以RIP引入触发更新路由一旦发生变化立刻给邻居发送更新报文不用等下个周期。抑制计时器的思路则是不要轻信风言风语。当路由器收到一条关于某目的地的不可达或更差的更新时它会进入抑制状态在一段时间内不轻易采纳关于该目的地的新路由尤其是来自非原路径方向的更新。这个怀疑期是为了防止一段链路故障引发的谣言在整个网络里反复振荡等网络平静下来后再做最终决策。缺点同样明显抑制期内即使有更好的新路径出现路由器也可能拒绝学习造成不必要的延迟。这也是为什么RIP的收敛时间在秒级而OSPF可以做到亚秒级。4. RIPv1与RIPv2版本差异背后是整部协议演进史4.1 RIPv1的束缚有类别路由的代价RIPv1时期的路由协议有一个现在看来很别扭的假设IP地址都是有类别的A类、B类、C类天然固定网络号和主机号的分界在IP地址里写死了。因此RIPv1的报文里根本没有子网掩码字段。它通告一条路由时默认对方能根据IP地址的类别自动推断出掩码。这带来的直接后果是它不支持VLSM可变长子网掩码也不支持CIDR无类域间路由。这意味着什么假设你有一个B类地址段你想把它划分成一个子网用26位掩码、另一个子网用28位掩码RIPv1就完全无法正确通告这些信息。在九十年代之后地址规划越来越精细化的趋势下这个缺陷是致命的。另外RIPv1使用广播地址255.255.255.255发送更新所有收到广播的设备都得拆开报文看一眼既浪费资源又泄露拓扑信息还没有任何校验发送者身份的手段。4.2 RIPv2带来的关键改进RIPv2在报文格式上做了增量改动却解决了最核心的问题。最重要的一点是路由条目里增加了子网掩码字段从此RIP可以正常通告VLSM和CIDR路由。其次更新方式从广播改成组播目的地址是224.0.0.9。组播的好处是只有启用了RIP的接口才会监听这个地址其他主机和路由器完全不受打扰。RIPv2还增加了两个小功能路由标记和认证。路由标记可以在引入外部路由时打上特殊标签便于路由策略识别认证支持明文和MD5能防止有人向链路里注入伪造的路由更新。此外RIPv2允许通过no auto-summary关闭自动汇总这让子网路由能够以精确掩码被全网学习不再被强制压成主类网络。我把两个版本的特征做了个对照表方便记忆特性RIPv1RIPv2子网掩码字段无有VLSM/CIDR支持不支持支持更新方式广播255.255.255.255组播224.0.0.9认证能力无明文/MD5自动汇总强制开启可关闭对应RFCRFC 1058RFC 24534.3 实验里到底选哪个版本做除非你刻意想研究有类别路由导致的各种老网络怪象否则实验一律用RIPv2。原因很简单RIPv2能展示的知识点更完整你可以通过版本对比理解VLSM的必要性又可以通过开启和关闭自动汇总看到路由通告的差异。RIPv1本身很少在今天的网络里独立部署花太多时间意义不大。不过有一点很值得实验一下把一台设备配成RIPv2另一台配成RIPv1观察两台设备的互动。你会发现RIPv2能读懂RIPv1的报文RIPv1却解析不了RIPv2的掩码字段两台设备之间会形成一种单向沟通的状态——这比死记RIPv2向后兼容这类结论要直观得多。5. 实验配置全流程三台路由器完整跑通RIP5.1 拓扑设计与地址规划实验不需要复杂的网络三台路由器链式连接就够了。我用的拓扑是R1—R2—R3R1和R3各模拟一个用户网段R2作为中间中继。具体规划如下设备接口IP地址说明R1G0/0/0192.168.12.1/24与R2互联R1Loopback 0172.16.1.1/24模拟用户网段AR1Loopback 1172.16.2.1/24模拟用户网段BR2G0/0/0192.168.12.2/24与R1互联R2G0/0/1192.168.23.2/24与R3互联R3G0/0/0192.168.23.3/24与R2互联R3Loopback 010.1.0.1/24模拟用户网段C用Loopback接口模拟用户网段是网络实验里非常实用的做法它不会像物理接口那样因为线缆问题抖动你还能随时用shutdown命令模拟链路故障。R1上做了两个172.16.0.0/16主类下的子网R3上放了一个10.0.0.0/8主类下的网段这样R2正好处于主类网络边界上能用来观察自动汇总的影响。5.2 基础配置命令逐条说明RIP的配置量很少关键是理解每条命令为什么存在。以我实验环境里的CLI为例三台设备的配置如下R1 router rip version 2 no auto-summary network 192.168.12.0 network 172.16.0.0 R2 router rip version 2 no auto-summary network 192.168.12.0 network 192.168.23.0 R3 router rip version 2 no auto-summary network 192.168.23.0 network 10.0.0.0逐条来看router rip进入RIP进程配置模式。version 2指定协议版本这个一定不能省因为默认情况下有些设备会同时发送和接收v1、v2两种报文给实验观察带来干扰。no auto-summary关闭自动汇总R1的两个172.16.x.x子网和R3的10.1.0.0网段在跨主类边界通告时才会以精确掩码出现在邻居的路由表里。network命令是RIP里最容易让人迷惑的命令它后面跟的是网段号表示在这个网段所在的接口上启用RIP并把这个网段通告给邻居。R1上写了network 172.16.0.0实际效果是172.16.0.0这个B类主类网段下的所有子网接口都参与RIP包括我的两个Loopback。注意我在R2上只配置了互联网段没有配置任何用户网段这很正常R2就是一个纯粹转发路由信息的中间节点。5.3 路由表验证与连通性测试配置完成后先在三台设备上查看路由表。以R2为例你会看到它的路由表里出现了三条RIP学习到的路由172.16.1.0/24下一跳192.168.12.1metric为1从R1学来172.16.2.0/24下一跳192.168.12.1metric为110.1.0.0/24下一跳192.168.23.3metric为1而R1上看到的10.1.0.0/24metric为2下一跳是192.168.12.2。metric为2的含义是这条路由到R3的Loopback需要经过R1→R2→R3两跳。路由表里还有协议来源标识RIP协议学习的路由会标明来源协议这是排障时最重要的依据——如果你ping不通目的网段先去查路由表里有没有这条路由没有就是路由没有学到学错了就是度量或下一跳有问题。完成路由表检查后在R1上ping R3的Loopback地址10.1.0.1通了就说明全网路由已经收敛。如果ping不通先看R2到R3的直连链路是否正常再逐台看路由表不要一上来就怀疑RIP配置。5.4 验证命令速查实验过程中这几条命令建议背下来show ip route查看完整路由表重点看协议标识和metric。show ip route rip只查看RIP学习到的路由梳理协议状态时更清晰。show ip rip database查看RIP路由数据库能看到每条路由的来源接口和等待删除情况。debug ip rip打开RIP调试信息直接看设备正在发送和接收哪些更新报文。调试完记得关闭否则控制台会被刷爆。traceroute数据到底走了哪条路径一跳一跳看得清清楚楚。这五条命令配合使用基本能覆盖RIP实验里90%的验证需求。5.5 故意不关自动汇总看看会发生什么这是我最推荐做的对比实验。把三台设备的no auto-summary去掉重新触发一下更新然后看R1和R3的路由表。你会发现R1看到的10.0.0.0不再是精确的10.1.0.0/24而是被汇总成10.0.0.0/8R3看到的172.16.0.0也只剩一条172.16.0.0/16172.16.1.0/24和172.16.2.0/24的明细全部消失。这个现象背后的逻辑是R2在向R1通告时发现10.1.0.0/24属于10.0.0.0/8主类网络另一个方向的接口属于192.168.0.0/16跨主类边界时默认启用自动汇总于是把子网汇总成主类网络再通告给R1。如果实际网络中真的这样配置R1想去10.1.0.1它只会把数据发到汇总路由指向的下一跳而R2再根据更精确的路由表继续转发。在RIP的世界里主类边界自动汇总是历史包袱你动手做一次比看十遍理论都记得牢。6. 故障演练与抓包实测看清RIP的真实行为6.1 抓包观察RIP周期更新配置都跑通之后别急着收工把抓包工具挂到R1和R2互联的链路上观察RIP的实际报文。抓包前要有个预期RIPv2的报文封装在UDP里源端口和目的端口都是520目的地址是组播224.0.0.9大约每30秒出现一批。真正抓到报文后你会有几个直观发现。报文里每条路由占20字节一个UDP报文最多封装25条路由如果路由表很大会分成多个报文发送。打开报文内容能看到目标网段、子网掩码、下一跳和metric。比如R1通告172.16.1.0/24给R2时metric是1等到R2再转发给R3时metric就变成2。抓一次包跳数累加的过程就从抽象描述变成了亲眼所见。还有一个容易被忽略的细节你在抓包里看到的更新间隔不是整整30秒而是有随机扰动。这是RIP刻意设计的去同步化机制所有路由器同时发包会把链路的突发流量拉满错开反而更稳定。6.2 故障模拟一条链路down掉的完整演变接下来做最有教学价值的故障演练。把R3的Loopback 0接口shutdown模拟用户网段从网络里消失。此时抓包和路由表会呈现出清晰的演变过程R3立刻感知到自己的直连网段消失通过触发更新向R2发送一条毒化路由10.1.0.0/24metric为16。R2收到毒化路由将原本的10.1.0.0/24标记为不可达并进入抑制状态。R2随后触发更新给R1R1收到后同样把这条路由标为不可达。此时全网都知道10.1.0.0/24不可达ping立刻失败。但路由表里那条路由还在只是metric为16等待清除定时器到期后彻底消失。你留意一下整个过程的时长从shutdown到全网不可达大约在几秒内完成这主要归功于触发更新但从路由被标记为不可达到彻底从表中消失却可能要等240秒的清除定时器到期。这种业务中断立即生效、表项清理慢慢来的特点是RIP这类老协议的真实写照。把接口重新起来你会看到反向过程R3发送触发更新通告10.1.0.0/24恢复可达R2、R1依次更新路由表网络重新归位。整个实验做完你对RIP收敛机制的理解就会从背诵四大定时器升级成知道每个定时器在什么阶段起作用。6.3 实验里的几个坑被动接口、调试信息与杂散报文实验做到这里有一个配置细节值得单独讲被动接口。如果你的路由器和一台主机相连比如R1的某个接口接了一台PC而这个接口也配置了RIP的network命令设备会默认周期性地往这个接口发送RIP组播更新。主机的网卡本来没监听224.0.0.9但如果装了抓包工具你会看到这些无意义的协议报文不断发给终端既浪费链路资源又把网络拓扑暴露给了终端侧。正确的做法是把这个面向主机的接口配置为被动接口让RIP在该接口上不再发送更新但该接口的网段仍然会被通告。命令是passive-interface不同厂商的关键字大同小异。这个习惯非常重要生产环境里网络设备向终端发送路由协议报文是一种需要避免的行为。还有个小坑是调试指令的开关。debug ip rip打开后刷屏速度非常快尤其在多路由器互连的网络里控制台消息会严重影响设备性能。我见过不少同学开着debug忘记关结果设备卡得连命令都敲不进去。实验结束后记得用对应的undebug all或no debug ip rip关掉这是网络工程师的基本修养。另外如果你在某个实验场景里给链路接了两台以上路由器别忘了RIP支持等价路径同样metric的多条路径会同时出现在路由表里。这是一种有用的特性但也意味着你抓包时会看到来自多个邻居的更新要分清每条路由的来路。7. 这个实验还能怎么玩最后的一点扩展到这里RIP的原理和基础实验已经全部闭环了。但如果你还有余力我个人建议再往三个方向扩展一下第一把拓扑改成双路径试一试RIP在多条等价/不等价路径上的选路行为直观感受只看跳数不看带宽的局限第二启用RIPv2的MD5认证在邻居之间配置相同的密钥链然后故意配错一个密钥看看认证失败时路由器是否会交换路由第三把RIPP和OSPF放到同一个拓扑里做路由重发布你会体会到不同协议的度量值之间需要做换算这正好是工作中经常遇到的难题。说句实在话RIP的实验不需要多复杂的设备和环境用任何主流模拟器半小时就能搭完。但请别把它当成一个过时协议的上机练习我每次带新人做这个实验时都会强调路由协议无外乎度量、收敛、防环、安全性这几件事RIP把每件事都做得足够简单清楚简单到你能看到它每一个动作的因果。等你哪天面对OSPF的海量状态、BGP的复杂策略不再发怵时回头看这三台路由器组成的RIP网络会感谢自己当年没嫌它老掉牙。