
把RIP这个实验从头到尾做一遍我最大的感受是一个看起来“老掉牙”的协议反而是理解动态路由最好的教材。这次我用GNS3搭了一个三路由器环境把RIPv1、RIPv2都跑了一遍抓包看了RIP的更新报文也想办法制造了路由环路来观察防环机制整个过程踩了不少坑。这篇报告就把这些实验现象、配置命令和排错思路完整整理出来。如果你正在学网络协议或者准备备考认证拿RIP练手是最划算的因为它足够简单简单到你能看清动态路由每一步的动作而不是像OSPF那样一上来就被一堆概念淹没。1. 实验前先搞明白RIP到底是个什么协议1.1 距离矢量算法每个路由器都是“消息二传手”RIP全称是Routing Information Protocol路由信息协议。它属于典型的距离矢量协议工作的核心算法是Bellman-Ford也叫“通过邻居学路由”。理解这个算法的关键就一句话每台路由器只信任直连邻居告诉它的路由信息然后把自己学到的整张路由表再原样转发给下一个邻居。打个比方你在北京问路去上海一个路人告诉你“沿这条路走到天津再问”。你到了天津再问当地人他说“走这条路到济南再问”。每一步你都只拿到了下一跳的碎片信息但最终能拼出一条完整路径。RIP就是这么做的它把“到某个网段有多远”定义成一个数字——跳数每经过一台路由器跳数加1。RIP有个非常关键的边界值最大有效跳数是1516代表不可达。一旦路由的度量值变成16路由器就直接把它丢弃或者标记为不可达。这也是RIP被诟病不适合大型网络的核心原因网络直径稍微大一点超过15跳路由就传不过去了。实验前我把RIP的计时器背了一遍后来在排错时发现这些参数特别有用计时器默认值作用Update更新30秒周期性广播完整路由表Invalid无效180秒超过180秒没收到更新路由标记为无效Holddown抑制180秒路由无效后进入抑制状态暂不接收新路由Flush刷新240秒抑制结束后彻底从路由表删除你会发现一个有意思的规律更新周期30秒连续6个周期没收到邻居消息180秒才判定对方出了问题。这个“慢收敛”特性在后面的实验中会用实际操作展示出来。1.2 RIPv1和RIPv2一版本之差差了一整个子网时代RIP有两个在大规模网络中广泛部署的版本很多初学者搞不清楚为什么有了v2还在用v1。其实RIPv1出生在有类网络时代那时候IP地址严格按A/B/C类划分路由更新包里根本不需要携带子网掩码接收方自己“猜”带不带掩码就行。但后来CIDR和无类域间路由普及后子网划分越来越灵活RIPv1这种不带掩码的行为就水土不服了于是有了RIPv2。两个版本最关键的差异我做成了一张对比表特性RIPv1RIPv2类路由/无类路由有类无类更新报文是否携带子网掩码否是VLSM/CIDR支持不支持支持更新方式广播255.255.255.255组播224.0.0.9认证无可启用明文或MD5认证自动汇总控制无法关闭可手动关闭实验里我把RIPv1和RIPv2分别跑了一遍最直观的区别是抓包时看到的报文格式完全不同v1里每条路由条目后没有掩码字段v2则多出了子网掩码、下一跳和路由标记。如果你实验时有划分子网的网段一定要用v2否则RIPv1的自动汇总会把子网搞得面目全非这个问题我在第6部分验收时会具体展示。2. 实验环境与拓扑设计2.1 模拟器选型GNS3加思科镜像最省心我这次的实验是在GNS3上完成的加载的是思科的c3745IOS镜像。选GNS3而不是其他模拟器主要是因为在动态路由实验上GNS3跑的是真实IOS镜像协议栈行为跟真机几乎一致尤其抓包时能看到完整的RIP报文这对理解协议非常有用。如果你用的是H3C的模拟器或者eNSP命令体系稍有差别但RIP的原理和实验思路完全通用。比如思科写router rip华为是rip进程号思科用network通告网段华为也是network只是思科默认主类网络华为则直接按接口通告。原理都是一样的不必纠结用哪家平台关键是把行为看懂。GNS3环境里有一个建议给路由器加路由接口时建议用串行口或者用Ethernet口加no switchport避免默认二层接口带来的干扰。我第一次配置时直接把路由器接口接到了交换模块上结果RIP更新广播全被二层转发逻辑吃了路由表一直学不到条目排查了十分钟才发现接口模式不对。后面第6部分排错里还会提到这个坑。2.2 三台路由器拓扑与IP规划麻雀虽小五脏俱全实验拓扑我选择了最简单的三台路由器串联结构R1连接R2R2连接R3每台路由器上再配一个环回口Loopback模拟真实用户网段。为什么不用两台路由器因为两台只能演示最基础的邻居关系和路由通告而三台可以展示中间路由器转发路由、跳数累计、以及链路故障时的收敛过程多一台就多了很多可观察的现象。具体IP规划如下设备/接口IP地址所属网段用途R1 F0/0192.168.12.1/24192.168.12.0/24R1-R2互联R2 F0/0192.168.12.2/24192.168.12.0/24R1-R2互联R2 F1/0192.168.23.2/24192.168.23.0/24R2-R3互联R3 F1/0192.168.23.3/24192.168.23.0/24R2-R3互联R1 Loopback0192.168.1.1/24192.168.1.0/24模拟用户网段R3 Loopback0192.168.3.1/24192.168.3.0/24模拟用户网段选择10.0.0.0这类私有地址也可以但我刻意避开了A类大网段用192.168.x网段便于观察主类边界和子网汇总。Loopback口的作用是模拟一台终端PC后面的局域网网段因为Loopback口是始终up的逻辑接口不会因为线路抖动导致路由抖动非常适合测试RIP路由通告。这个拓扑还隐含了一个RIP的重要观察点R1和R3之间隔着一台R2所以R1学到192.168.3.0/24的跳数是2R2学到两个末端网段的跳数都是1。实验后你可以通过show ip route rip观察度量值的变化这个细节比单纯看概念要直观得多。3. RIP配置实操从接口到协议全流程3.1 接口IP配置与链路状态核对我习惯先把所有接口IP配好再去做路由协议配置避免协议起来了但底层链路不通排错时还要来回切。以R1为例标准配置如下R1# configure terminal R1(config)# interface FastEthernet0/0 R1(config-if)# ip address 192.168.12.1 255.255.255.0 R1(config-if)# no shutdown R1(config-if)# exit R1(config)# interface Loopback0 R1(config-if)# ip address 192.168.1.1 255.255.255.0 R1(config-if)# exit配完后先不要急着配RIP用show ip interface brief确认所有接口都是up/up状态。如果看到某个接口是administratively down八成是忘了打no shutdown这是新人最容易犯的错误。如果是up/down则要检查对端接口是否配置了同一网段地址或者模拟器里的链路是否连接正确。R2和R3按同样的方式完成IP配置。我这里特意把R1和R2之间叫F0/0、R2和R3之间叫F1/0在真实设备上物理接口命名可能不同但只要记住逻辑拓扑配哪块接口都一样。配置完成后可以在R2上直接ping R1的192.168.12.1和R3的192.168.23.3通了两条链路才算合格。这一段的基础虽然简单但它决定了后续RIP实验能不能顺利进行。我见过不少人一上来就配router rip结果show ip route里什么都没有最后发现互联地址掩码错了或者接口没起来白折腾半小时。先把底层打通永远是最稳妥的思路。3.2 启动RIP进程router rip、version与network命令接口配置就绪后开始进入RIP的核心配置。我在三台设备上都输入了如下命令以R1为例R1(config)# router rip R1(config-router)# version 2 R1(config-router)# network 192.168.1.0 R1(config-router)# network 192.168.12.0 R1(config-router)# no auto-summary R1(config-router)# end每条命令的作用需要拆开看**router rip**是进入RIP进程配置模式。思科设备会自动启动RIPv1所以如果你不敲version 2运行的还是老协议。**version 2**把RIP切换到RIPv2模式。命令敲完后之后所有的更新都改用组播224.0.0.9发送报文带子网掩码。实验时建议全程用v2除非你想专门对比v1和v2的报文差异。**network**命令是RIP里最需要理解的地方。这条命令的作用并不是“宣告某个网段”而是“让路由器上属于该网段的所有接口都激活RIP并且把这个网段通告给邻居”。这里有个经典误区很多人以为写network 192.168.1.0就是把该网段放进路由表实际上它是说“192.168.1.0这个直连接口要跑RIP同时告诉邻居我这里有这个网段”。思科RIP的network命令默认按主类网络来处理。比如你输入network 192.168.12.0它会自动归并成network 192.168.0.0这个主类意味着R1上只要属于192.168.0.0/16的接口都会参与RIP。如果R1上还有一个其他用途的192.168.x.x接口不想被RIP通告你没法通过network精准排除只能借助passive-interface。RIPv2在较新的IOS版本中支持直接通告精确子网号但为了兼容老设备我还是按主类写法演示。**no auto-summary**是RIPv2不见得会配置但强烈建议配置的命令。如果不关闭自动汇总RIPv2在有主子网时会自动汇总成主类网段。比如R1有两个loopback192.168.1.0/24和192.168.2.0/24启用自动汇总后它可能只通告192.168.0.0/16导致对端路由器路由表里是一条汇总路由后续做精确路由或策略控制会非常别扭。RIPv1无法关闭自动汇总这也是我坚持用RIPv2做完整实验的原因。配置完R1后R2和R3也按各自的直连网段配置。注意R2要写三个network分别是两个互联网段和自身可能存在的loopback网段R2(config)# router rip R2(config-router)# version 2 R2(config-router)# network 192.168.12.0 R2(config-router)# network 192.168.23.0 R2(config-router)# no auto-summary3.3 验证RIP是否生效show ip route rip与show ip protocols配置完成后先在R1上验证邻居关系和学习到的路由条目。RIP没有OSPF那种复杂的邻居状态机它没有“邻居表”它唯一关心的就是有没有周期性收到更新。所以最直接的验证是看路由表R1# show ip route rip 192.168.23.0/24 [120/1] via 192.168.12.2, 00:00:24, FastEthernet0/0 192.168.3.0/24 [120/2] via 192.168.12.2, 00:00:24, FastEthernet0/0输出里两个关键参数[120/1]前面的120是RIP的管理距离Administrative Distance1是度量值跳数。R3的loopback网段192.168.3.0/24的度量值是2因为中间隔了两跳。后面那个00:00:24表示这条路由距离上一次更新过去了24秒接近30秒更新周期是正常的如果超过30秒还没重置说明更新链路有波动。再配合show ip protocols查看协议级的状态R1# show ip protocols Routing Protocol is rip Output delay 500 milliseconds between packets Outgoing update filter list for all interfaces is not set Redistributing: rip Default version control: send version 2, receive version 2 Routing Information Fields: Send Recv Version 2 Version 2 Interface Send Recv Keyed FastEthernet0/0 2 2 Loopback0 2 2 Automatic network summarization is not in effect Maximum path: 4 Routing for Networks: 192.168.1.0/24 192.168.12.0/24 Routing Information Sources: Gateway Distance Last Update 192.168.12.2 120 00:00:22我最常看的是最后几行Routing Information Sources它列出了从哪个邻居的哪个接口学到了路由。如果这里能看到192.168.12.2说明R1和R2之间的RIP通信已经建立。如果这里为空那问题就复杂了需要进入第4部分的抓包排查环节。4. 抓包分析从报文层面看RIP怎么“说话”4.1 Wireshark抓RIP报文三步抓到完整交互跑实验最爽的部分就是抓包。我这次在R1的F0/0接口上启动了Wireshark抓包也就是R1和R2之间的链路。由于RIPv2使用组播224.0.0.9发送更新Wireshark默认就能抓到组播包不需要额外设置。抓包前记得在路由器上执行clear ip rip或者等30秒组播更新报文会自动出现。抓到的RIPv2报文在协议列里会显示为RIP展开后能看到核心字段Command值为1表示请求值为2表示响应。RIP路由器启动时会发请求邻居回响应平时周期更新的都是响应报文。Version值为2就是RIPv2。Address Family Identifier值为2表示后面跟的是IP地址。如果开启了认证这个字段可能变成0xFFFF后面跟着认证信息。IP Address通告的路由条目网段。Metric该条目的跳数。我观察到R1发出的响应报文里包含了两条路由一条是192.168.1.0/24另一条是192.168.12.0/24度量值分别为1和1。这两条就是R1直连的网段也就是说RIP把路由器自己的直连路由作为最初始的路由表内容然后不停向邻居广播。这个现象从报文层面验证了network命令的实际效果不只是模块化的理论。还有一个值得记录的细节每一条RIP报文中最多携带25条路由条目。如果你的路由表超过25条RIP会分多个报文发送抓包时能看到一连串的目的MAC地址相同、但报文内容不同的RIP包。如果开启了认证则一条报文最多只能携带24条路由认证信息占一个条目空间。这个知识点在抓包时会非常直观。4.2 RIPv1广播和RIPv2组播从包上就能看出版本我在实验里特意把R1的版本临时改回RIPv1重新抓包对比。RIPv1更新报文的目的IP地址是255.255.255.255也就是说广播到整个广播域而RIPv2的更新报文目的IP是224.0.0.9。只看目的地址就能判断版本这是最直观的区分方式。为什么RIPv1要广播而v2用组播因为广播会让广播域内所有主机都处理这个包浪费CPU资源。组播只有加入该组的设备才会处理其他设备在数据链路层就会把包丢弃资源消耗小得多。同时组播也比广播更适合在路由网络中传递路由器可以从组播地址迅速识别出这是RIP协议。抓包时还能看到UDP端口号绑定RIP使用UDP 520端口。源端口和目的端口都是520。这里有个容易被忽略的点RIP的更新报文发送间隔不一定严格等于30秒为了错开网络中不同路由器的更新时间思科IOS加入了sleep和slew机制更新时刻会有随机偏移抓包时看到30.1秒或29.8秒都是正常现象。如果启用了RIPv2认证在抓包里还能看到认证字段。RIPv2支持两种认证方式明文密码和MD5摘要。明文认证在Wireshark里直接能看到密码字符串MD5认证则是一段摘要值。实验时我特意配了一次MD5认证发现同一个网段内所有路由器必须使用相同的密钥和认证类型否则RIP邻居会静默丢弃认证失败的报文不会在路由器日志中直接报错排错难度一下就上来了。这一点我在第6部分的速查表里也会提到。5. 环路与防环为什么RIP老是拿“16跳”说事5.1 无限计数问题两个路由器你推我让的怪圈距离矢量协议最经典的病理就是路由环路也叫“无限计数问题”。我用两台路由器复现了这个现象虽然实验拓扑是三台但环路问题本质在任意距离矢量网络中都会出现。想象一个最简单的场景路由器A有一条直连网段X路由器B从A这里学到了X路由条目为X via A, metric 1。现在X网段在A上宕掉了A发现X不可达。按RIP规则A会在下一次更新中向B通告X metric 16告诉B“我这边到不了X了”。问题是B还没来得及收到这条毒化消息B自己可能已经把X via A这条路由作为自己的路由通告给了A。A收到后一看呀从B能学到X于是把路由表改成X via B, metric 2。然后A又把这个条目通告给BB一看自己到X是2从A学到的也是2两者相等保留原条目继续下一轮更新A把metric改成3再通告回来……两边就这样互相抬价跳数不断增长直到到达16跳被当作不可达丢弃。环路造成的最大危害是报文在这些路由器之间来回弹射消耗链路带宽同时路由器CPU被不断触发更新的报文抢占。RIP用16跳这个上限给无限计数画了句号但它等于是让问题在“数值溢出”前粗暴结束并不能真正避免环路的形成。5.2 四大防环机制水平分割、毒性反转、触发更新、抑制计时器为了缓解环路RIP在算法层面加入了几个防环机制我在实验里逐个验证了它们的行为。水平分割Split Horizon规则是“从哪个接口学来的路由不再从该接口通告回去”。在这个规则下上面的场景中B从A学到了X那么B就不会向A通告X。这样A在X网段down掉之后不会从B那边学到一条“绕回来”的路环路从根源上被切断。这个机制在路由器上默认启用你在抓包中会发现R1发出的更新里一般不会包含从R2接口学来的路由。路由毒化Poison Reverse与毒性反转Poison Reverse with Triggered Updates当某条路由失效时路由器不是默默删除它而是把它在下一轮更新中通告成metric 16也就是这条路由“有毒”了。邻居收到16跳的条目后会立即把对应的路由标记为不可达。比单纯删除更能加速全网对故障的认知。毒性反转则是把水平分割的策略反过来将原本要抑制的路由条目宣告为16跳。第一次听可能懵其实就是“我不但不隐藏我还直接告诉你这个网段废了”。触发更新Triggered Update正常情况下RIP每30秒才发送一次完整路由表如果网络发生变化也要等上30秒那环路空窗期就太长了。触发更新的意思是一旦路由度量值发生变化路由器立即发送更新报文通知所有邻居不用等周期计时器。配合毒性反转一台路由器发现直连网段失效后会立刻向所有邻居发送包含16跳毒化路由的更新包邻居收到后再立即转发形成级联通知。抑制计时器Holddown Timer这个机制的目的是防止路由器频繁采纳不稳定路由。路由进入无效状态后会启动180秒的抑制计时器在这段时间内如果收到一条度量值更好的路由路由器不会立即采纳。只有计时器结束后新的路由才会被接受。我实验时故意在R2上关闭了一个互联接口然后在30秒之内重新打开你会发现R2的路由表在抑制期内一直保留旧条目不会因为临时断线而反复震荡。这个机制牺牲了收敛速度换来了稳定性。要说清楚的是这四种机制配合在一起让RIP在小型网络里能够有效抑制环路但它们都属于“事后补救”。RIP没有OSPF那样的全网拓扑数据库无法在计算路径时直接从物理结构上排除环路所以只能靠这些传播层面的规则来减轻问题。这也是RIP最终被OSPF等链路状态协议取代的核心原因之一。6. 常见问题与排错实录6.1 路由学不到按这个顺序排查最有章法配置完RIP后最常遇到的状况就是show ip route rip里一片空白。我这次实验也复现了好几个原因总结下来按顺序排查效率最高。第一步检查接口物理状态。show ip interface brief看所有参与RIP的接口是否up/up。很多模拟器默认接口是shutdown状态忘了no shutdown时接口显示administratively downRIP根本不会从down接口发送任何更新。这是最基础但也最高频的错误。第二步检查network宣告范围。思科RIP的network命令用的是主类网络号如果你的接口IP是192.168.12.1但你写的是network 192.168.1.0那这个接口根本没有被激活RIP。用show ip protocols可以看到Routing for Networks下列出了哪些网段把宣告范围和实际接口IP对照一下就能发现。第三步开启debug ip rip看实时输出。我第一次看到RIP处理细节就是靠这个命令R1# debug ip rip RIP: sending v2 update to 224.0.0.9 via FastEthernet0/0 (192.168.12.1) RIP: build update entries 192.168.1.0/24 via 0.0.0.0, metric 1, tag 0 RIP: received v2 update from 192.168.12.2 on FastEthernet0/0 192.168.23.0/24 via 0.0.0.0, metric 1, tag 0 192.168.3.0/24 via 0.0.0.0, metric 2, tag 0看到sending和received两行说明RIP报文收发正常。如果只有sending没有received那么问题在对端路由器可能对方没有配置RIP、接口IP不同网段、或者被访问控制列表拦住了。6.2 路由学到但ping不通自动汇总和不连续子网的坑还有一个让人抓狂的场景show ip route rip里明明有路由但PC之间ping还是丢包。这个问题很大概率出在RIPv1的自动汇总上。我在实验里先把R1和R3改成RIPv1然后在R1的loopback上配置两个子网192.168.10.1/24和192.168.20.1/24另一边R3的loopback配置192.168.30.1/24。RIPv1发送更新时会自动汇总为主类网络192.168.0.0/16导致R3收到一条指向R1的192.168.0.0/16汇总路由但它自己又直连了192.168.30.0/24直连路由更优先就会产生路由冲突或次优路径。RIPv2配合no auto-summary可以规避这个问题但如果你看到路由表里出现了一个掩码比实际子网小很多的路由那就证明自动汇总还在生效。用show ip protocols里的Automatic network summarization is not in effect来判断这是排查不连续子网路由问题的关键输出。6.3 等价路径与负载均衡为什么RIP同时看到两个下一跳RIP还有个特性让我一开始很困惑同一个目标网段路由表里居然出现了两条到下一跳不同的路由。其实这是RIP的等价路径负载均衡机制它不像OSPF默认只保留一条最优路由而是会把所有度量值相等的路径都放进路由表。思科IOS默认最多支持4条等价路径部分平台是6条或8条通过maximum-paths命令可以调整。当路由表出现两条等价路由时R1去往192.168.3.0/24的数据流会在两个下一跳之间负载分担。实验时我在R1上ping R3的loopback然后观察Wireshark能看到数据包的目标MAC地址在R2的两个接口之间轮换。这个机制对网络来说是件好事但如果你在实验中看到的“两条路由”让你误判了拓扑记住是等价路径导致就好。6.4 常见问题速查表下单排错直接对照把实验里踩过的坑整理成一张速查表以后出了问题对着看能减少很多反复试验的时间现象可能原因排查命令路由表无RIP条目接口down、network宣告错误、版本不匹配、被动接口误设show ip interface brief、show ip protocols、debug ip rip只发不收对端没启用RIP、对端接口IP不同网段、ACL过滤show ip protocols、debug ip rip学到路由但ping不通自动汇总导致的不连续子网问题、下一跳不可达show ip route、ping扩展参数路由表出现/消失反复震荡有环路、抑制计时器引发的临时收敛延迟show ip route、debug ip rip一个目标多条路由等价路径负载均衡show ip route、show ip protocols开启了认证但路由学不到密钥不一致、认证类型不匹配show run interface、debug ip ripRIPv1能通RIPv2不通版本不一致v1设备无法解析v2报文show ip protocols、抓包对比第六部分这条速查表是我这次实验最值钱的产出之一。很多思科文档写的是“应该怎么配”但很少告诉你“配完劈了该从哪里看”这个是实操后才知道的。7. 实验总结RIP能干什么不能干什么7.1 RIP的定位小而稳定网络的“老黄牛”做完整个实验我对RIP的定位有了更清醒的认识。它适合那些规模不大、网络结构简单、路由变化不频繁的小型网络。比如一个几十台设备的办公局域网划分几个VLAN跑RIPv2完全够用配置量小排错简单任何网络工程师都能快速上手。只要网络直径不超过15跳RIP就能保证所有网段互相可达。它不擅长的是那些大规模、高动态的网络。15跳的限制本身就框死了RIP的使用场景而且30秒完整路由表广播在链路带宽紧张的广域网上就是灾难。更重要的是RIP的收敛速度太慢了一次链路故障要等180秒甚至240秒才能稳定下来这在现代网络中不可接受。企业核心网、运营商网络基本看不到RIP的身影这些场景都交给了OSPF和BGP。7.2 从这次实验里带走的三个关键认知第一“动态路由”的本质是路由器之间交换信息并自主计算路径而不是由工程师逐条写死静态路由。跑完RIP后我再看静态路由和默认路由感觉视角完全不同了它们是手工的、确定性的而动态路由是自动的、分布式的各有各的适用场景。第二协议设计都是在做取舍。RIP用跳数做度量简单却粗糙用周期广播做更新可靠但浪费带宽用16跳上限防环路粗暴但有效。你理解了它为什么这样设计也就理解了为什么后来者OSPF要引入 SPF算法、要维护链路状态数据库、要精确计算cost值。RIP就是那张“正态分布图的极端案例”让你看清基础协议的天花板在哪里。第三模拟器实验一定要抓包不要只看路由表。路由表只是结果报文交换过程才是活的协议。我这次在Wireshark里看着RIP更新包每30秒准时出现、看着毒化路由从R2传到R1那种对协议的直观理解是看十遍教科书都换不来的。这次实验做完我又把拓扑里的路由器清空配置重新用OSPF跑了一遍同样场景。对比之下瞬间明白了为什么专业网络里大家宁愿牺牲配置复杂度也要用OSPF也明白了“收敛时间”对网络意味着什么。如果你也在学路由协议建议你用同一套拓扑把RIP和OSPF都跑一遍这种对照实验带来的收益远比单独背一种协议要高得多。