RIP协议Routing Information Protocol:在TCPIP环境开发中第一个路由选择协议(由Xerox公司开发)。是距离矢量协议,内部网关IGP协议,v1是有类的,v2是无类的(关于动态路由的分类可参考动态路由协议分类。

虽然大型网络中目前OSPF用的比较多,但小型网络中还是有大量采用RIP协议的(本文说的RIP协议一律指RIPv2协议。RIPv1是无类的早已被淘汰,忘了它吧)。而且作为TCPIP环境开发中第一个路由选择协议,它奠定了很多思想,了解了RIP后,对学习其他协议如EIGRP,OSPF能起到事半功倍的效果。

RIP包被封装在UDP 520端口,组播地址是224.0.0.9,每30秒发送自己完整的路由表。当报文传至IP层时,相邻路由器先检查报文是否来自端口520的UDP,如果是再看源IP地址是否来自直接相连的邻居,如果是才依据报文更新自己的路由表(当然如果报文内AD值大于15会忽略)。虽然UDP是不可靠传输,有丢包的概率,但每30秒就发送完整的路由表给邻居,基本能保证网络OK。

RIP的AD值是120,度量是跳数,最大15跳,如果度量为16就不再继续传递了以避免无限环路。自然跳数越小表示路径越优。前缀掩码AD度量均相同,而下一跳不同的话就负载均衡。(这些概念如果不明白,建议参考静态路由介绍)

本篇将介绍动态路由协议RIP(配置,禁用RIP,单播更新,自动汇总,手动汇总,默认路由,认证,兼容,防止环路)

配置RIP:

RIPv2_第1张图片

RIPv2_第2张图片

由于v1已被淘汰,因此上面version都设成2,并关闭自动汇总(自动汇总下面会讲到,现在请先无视)。RIP是主类宣告,因此network 11.0.0.0等价于network 11.0.0.0 255.0.0.0。但请别误会,主类宣告不是通告宣告的路由,而是表明在某个接口启用RIP,最终通告出去的是此接口下的直连路由。因此R2得到的不是12.0.0.0/8,而是12.1.1.0/24。下图是R1学习邻居R2的结果:

RIPv2_第3张图片

先看下面两条红线划出的路由,这两条是R2上宣告的,虽然是R2上是主类宣告23.0.0.0/8,22.0.0.0/8,但R1学习到的仍旧是明细路由23.1.1.0/24,22.1.1.0/24。再看第一条红线划出的路由,该路由R2上并没有宣告这条路由,该路由是R3上宣告的,R2从邻居R3上学习到之后,R1再从邻居R2上学习到。同理R1宣告的路由经由R2后也能被R3学习到,这样两两都能相通了。是不是比静态路由一条条手动加要方便许多 ^_^

另外注意图中红框部分[120/2],120就是AD值(RIP的AD值是120),2是度量值(RIP里以跳数为度量值,R3宣告该路由,经R2后传到R1,因此是2跳)。下面两条从R2学习到的路由均是[120/1]表示AD值为120即RIP协议,度量为1即1跳

端口禁用RIP:

例如不想让R2学习到R1的路由,可以将R1连接R2的f0/0口禁用RIP,这样R1将不再发送路由表给R2,但R2发送过来的路由R1仍旧可以接收并学习。

RIPv2

这样R2的路由表中将不再能学习到R1上的路由条目。(如果要双方都不能学习,那可以将双方连接的端口都passive掉)

RIP单播更新:

上面提到如果双方连接的端口都passive掉,那双方就老死不相往来了。哪天感情恢复想破镜重圆怎么办?通常用单播更新:

RIPv2

然后去R1和R2上看路由表,会发现又能重新学到对方路由表里的条目了。

你可能会有疑惑,为何要用单播更新指定邻居呢?将passvie掉的端口no passive不就行了吗?这得分场合,如果是像例子中R1和R2简单直连的话,将passive掉的端口no passive就能恢复RIP学习。但现实中情形可能有点复杂,如下图:

RIPv2_第4张图片

R2和多台终端PC通过二层交换机和R1连接,此时R1,R2和终端PC处于同一广播域中。如果不passive掉任何端口,R1会发送RIP组播包,R2收到RIP包没问题,但终端PC不需要,R1发送过来的RIP包对终端PC来说毫无用处,反而占用带宽。因此可以passvie掉R1和R2的端口,但R1和R2互相指为邻居用单播更新的方式学习RIP。这样两台路由器通过RIP协议能学到对方的路由,且终端PC不会收到任何对它来说毫无用处的RIP包。

RIP自动汇总:

通常都是关闭自动汇总no auto-summary(最好默认就是关闭自动汇总,可惜不是,所以配置RIP协议时记得用no auto-summary关闭一下自动汇总)

自动汇总顾名思义就是汇总自己或邻居宣告的路由,汇总到主类。但要注意只有到达网络边界才汇总,连续子网内仍旧是明细路由。什么叫连续子网呢?同一主类网络称为连续子网。举个例子1.1.1.1/24和1.2.3.4/24就是连续子网,因为它们都属于A类网络1.0.0.0/8,但它们和2.1.2.1/24就不是连续子网,后者属于A类网络2.0.0.0/8。具体可以参考VLSM

RIPv2_第5张图片

配好IP和RIP协议(不要no auto-summary,默认是开启自动汇总的)后,查看各自路由表:

RIPv2_第6张图片

但通常我们更愿意关闭自动汇总。汇总的好处是可以缩小路由表,原本多条路由被汇总成一条。但这点好处抵消不了它带来的坏处。坏处是容易造成错误转发。比如R1:3.1.1.1/24,R3:3.1.3.1/24,主类网络都是3.0.0.0/8,那R2收到宣告后,选哪个呢?如果选了R1发送过来的主类网络,ping R3就ping不通了。

RIP手动汇总:

自动汇总不推荐用,手动汇总有时还是可以用一下的,原理都一样不赘述了。手动汇总在路由的出方向做,总是在接口上做。拓扑图同上,关闭自动汇总后,R1应该学习到3条明细路由:1.1.22.0/24,1.1.23.0/24,1.1.33.0/24,可以将3条汇总成1.1.0.0/16,R1的出接口是R2上的f0/0口,因此进入R2的f0/0口:

RIPv2_第7张图片

RIP默认路由:

默认路由的思想和静态默认路由一样,没啥区别,基本就是保底用的,哪条路由都匹配不了,就往默认路由的那个下一跳端口上转。但是默认路由是相当重要的,通常在边界网段设一条默认路由,这样网段内的数据如果要往外转,都经过边界网段的路由器,才能实现访问外网的功能。

假定R3就是边界路由器,那在R3上声明边界后,在R1和R2上都能学到一条默认路由,访问外网时通过默认路由转给R3,再由R3转出去

RIPv2_第8张图片

RIP认证:

认证的意思大家都明白,如果一端开启认证,另一端只有通过认证才能学到对方的路由:

RIPv2_第9张图片

R1和R2的连接的端口上需要md5加密认证,因为两端钥匙名一样(均为1),密码一样(均为Jack),因此认证通过,双方可以互相学习对方的路由。如果一端不加密,或钥匙名错,或密码错将通不过认证,有兴趣可以debug ip rip会看到invalid authentication。

另外,将上面md5改为text就可以用明文认证,但谁会用明文去认证呢。。。

RIP防止环路:

网络中最忌讳出现环路,RIP有一套自己的防环机制:

1.最大跳数15跳(但这只是回避环路问题,没有解决该问题)

2.水平分割:不能向路由的来源方向返回路由。比如R3的f0口传给R2的f0口的路由信息,不会被R2的f0口返回给R3,因为这样做毫无意义。但可能会被R2的f1口返回给R3。因此也不能彻底解决环路

3.路由毒化和毒性反转。路由毒化:将已经断开的路由的距离通告为无穷大(度量=16),例如:R3的f1口的度量设为16并通告R2,R2的路由表中该IP的度量更新为16表示已断开。毒性反转:R2知道已断开后,再发给R3做确认(此时毒性反转会忽略水平分割)。为何要毒性反转?因为不毒性反转告诉R3我知道了,R3会持续给R2发该路由已断开的信息

4.抑制计数器:没什么用已经废弃。无效计时器invalid timer:一条路由更新180秒内没收到就将跳数设为16。flush timer:如果一条路由180秒内没更新,还不是马上不能用,而是possibly down,直到240秒内无更新才从路由表中删除

5.触发更新:一旦网络拓扑发生变化,路由器将立即发送路由更新给邻居,不需要等30秒

实验有兴趣可以参考别人写的这篇:RIP防环机制实验

PS:

RIPv2兼容RIPv1:

虽然RIPv1已被淘汰,但不代表就遇不到v1的路由器。攻城狮常遇到一些被淘汰的应用,APP等,再不情愿也得想办法去解决。比如R1和R2是v2,R3是v1的话,R2就学不到R3的路由了,但R3可以学到R2的路由。即v2视v1为非法,但v1能学习到v2。为了解决兼容问题,可以在R2上:

RIPv2

R2上链接R3的f1/0口上不再发送v2的更新,而是接收v1的更新。实现了R2的v2和R3的v1的兼容。(有兴趣可以debug ip rip events看一下v2视v1为illegal version)