前文我们了解了RIP的基础概念、RIP的特点、RIP报文格式、RIP度量以及RIP配置认证等相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15008522.html;今天我们来聊一聊RIP的防环机制;
在聊RIP防环机制之前,我们先来说说什么是环路?所谓环路就是当一个数据包从a设备的某个接口发送出去,又从a设备的某个接口收到该数据包,中间数据包所走到路径是一个闭环(封闭的链路);我们知道在网络里环路是必须要避免的,在二层网络里一旦产生环路,它可以让整个二层网络全部瘫痪,当然二层网络中也有一些机制可以防止环路(比如stp);对于三层网络,虽然TTL这个字段能一定程度的破环环路,但始终也会造成网络短暂的不可用;对于RIP来讲,如果没有防环的机制,那么从RIP的工作原理我们就可以推断出来,当路由器A开启了RIP并宣告了对应的网络,路由器B也开启了RIP和宣告了相应的网络,那么此时路由器A会收到路由器B发送到路由更新包,从而将对应的路由条目学习并更新到自己的路由表中;此时路由器A就会有到达目标网络的路由;然后路由器B也会收到路由器发送过来的路由更新包,此时我们想一个问题,路由器A会不会把刚才路由器B发送过来的路由,一同发送给B呢?默认在没有任何防环机制的条件下,路由器A会向路由器B发送自己从B哪里学习到的路由,但是B是不会相信的;因为B会比对和自己路由表中的路由,看看那个最优,很显然B路由表中的路由要比A发送过来的路由更优(因为B向A发送路由,会将对应路由的跳数+1,所以A再把同一条路由发送给B,此时A发送出来的路由跳数又会+1,所以B自己路由表中的路由是最优的,所以B不会学习A发送过来的路由);这是目标网络正常的情况下,环路不会产生;假如在路由器A向路由器B发送路由更新包之前,目标网络宕了,会发生什么呢?首先目标网络宕了,此时路由器B上的路由会随之不可用,即对应网络的路由跳数会变为16;此时如果A再向B发送路由,此时B就会学习A发送过来的路由;同样的道理当B把从A学习到的路由更新到路由表中以后,B也会把对应路由再次发送给A;此时A会不会相信呢?A会相信,因为A上的路由是从B学习到的,所以B给它发送路由更新,A会毫不犹豫的学习和更新路由表;同样的道理,A又会把新学习到的路由发送B,B也会毫不犹豫的学习(因为B上的路由是从A那边学习到的),这样一来环路就产生了;但这个环路不会持续太久,当对应的跳数达到16条以后,A和B中的路由表都会将对应路由删除,此时环路就终止了;
实验:如下图,路由器A上有一个回环口其地址为1.1.1.1/32,R2上有一个回环口其地址为2.2.2.2/32,中间路由器A和路由器B直连的网络为12.0.0.0/24
配置各路由器名称和对应接口ip地址,并将各路由器各接口网络通过RIP将其宣告出去
配置R1
<Huawei>sys Enter system view, return user view with Ctrl+Z. [Huawei]sys R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.0.0.01 24 Jul 14 2021 19:49:45-08:00 R1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP on the interface GigabitEthernet0/0/0 has entered the UP state. [R1-GigabitEthernet0/0/0]int lo1 [R1-LoopBack1]ip add 1.1.1.1 32 [R1-LoopBack1]rip 1 [R1-rip-1]ver 2 [R1-rip-1]net 12.0.0.0 [R1-rip-1]net 1.0.0.0 [R1-rip-1]d th [V200R003C00] # rip 1 version 2 network 12.0.0.0 network 1.0.0.0 # return [R1-rip-1]q [R1]dis ip int b *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 3 The number of interface that is DOWN in Physical is 2 The number of interface that is UP in Protocol is 3 The number of interface that is DOWN in Protocol is 2 Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 12.0.0.1/24 up up GigabitEthernet0/0/1 unassigned down down GigabitEthernet0/0/2 unassigned down down LoopBack1 1.1.1.1/32 up up(s) NULL0 unassigned up up(s) [R1]
配置R2
<Huawei>sys Enter system view, return user view with Ctrl+Z. [Huawei]sys R2 [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 12.0.0.2 24 Jul 14 2021 19:50:17-08:00 R2 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP on the interface GigabitEthernet0/0/0 has entered the UP state. [R2-GigabitEthernet0/0/0]int lo2 [R2-LoopBack2]ip add 2.2.2.2 32 [R2-LoopBack2]rip 1 [R2-rip-1]ver 2 [R2-rip-1]net 12.0.0.0 [R2-rip-1]net 2.0.0.0 [R2-rip-1]d th [V200R003C00] # rip 1 version 2 network 12.0.0.0 network 2.0.0.0 # return [R2-rip-1]q [R2]dis ip int b *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 3 The number of interface that is DOWN in Physical is 2 The number of interface that is UP in Protocol is 3 The number of interface that is DOWN in Protocol is 2 Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 12.0.0.2/24 up up GigabitEthernet0/0/1 unassigned down down GigabitEthernet0/0/2 unassigned down down LoopBack2 2.2.2.2/32 up up(s) NULL0 unassigned up up(s) [R2]
验证:查看R1、R2的路由表,看看是否都学习到对方lo接口网络的路由?
查看R1的路由表
查看R2的路由表
提示:可以看到正常情况下两个路由器都能相互学习到对方的路由;
验证:在R1上抓包,看看R1是否将从R2学习的路由发送给R2呢?
提示:默认情况下,R1是不会将从R2学习到的路由再次发送给R2,其原因是默认RIP启用了水平分割机制;
什么是水平分割呢?
所谓水平分割是指,路由器从一个接口收到的路由信息,不会将路由信息再从同一个接口发送给邻居路由器;
提示:上图就是表示路由器A从RB学习到的路由,不能从同一个接口再次发送给B;以上就水平分割,它能有效的阻止环路的产生;
验证:关闭水平分割,看看对应RA是否将从RB学习到的路由发送给RB呢?
关闭R1上对应接口的水平分割
关闭R2上对应接口上的水平分割
提示:关闭水平分割特性,需要在对应接口上关闭;
验证:再次在R1上抓包,看看是否会将从R2学习到的路由再次发送给R2呢?
提示:可以看到关闭了水平分割以后,R1会将从R2学习到的2.0.0.0这条路由再次发送给R2;同样的道理R2也会将从R1上学习到的1.0.0.0路由发送给R1;如下
提示:虽然都在给对方发送从对方学习到的路由,但对方不会学习,其原因就是发送给对方的路由没有对方路由表中的路由更优(从抓包的跳数可以看到),所以环路并不会产生;但是当我们R1或R2上的对应lo接口被删除后,可能就会形成环路;
实验:删除R1上的lo接口,抓包看看对应数据包会发生什么?
提示:从上面的录屏可以看到,当R1上的lo接口故障以后,如果没有开启水平分割,则对应路由信息就会在R1和R2之间一直循环发送;
触发更新
什么是触发更新呢?默认情况路由器会每隔30s发送一次路由更新包,其目的就是告诉邻居路由器,本路由器路由有哪些更新等等,触发更新就是指当路由器感知到路由发生变化时,它会立刻发送路由更新包告诉其邻居路由器路由发生了变化,并依次产生触发更新通知它们的邻居路由器;
提示:我们可以简单理解,只要路由器感知到对应网络发生变化,它不会等到下一个30s秒到来,而是立刻向邻居路由器发送路由更新包,告诉邻居赶快更新路由;
实验:在R1上把lo1 的接口新建出来,并配置1.1.1.1 32的ip地址,然后抓包,看看R1是否立刻通知R2更新路由呢?
提示:可以看到,当我们在R1上把lo接口恢复以后,R1并没有等到下一个更新周期发送更新路由信息,而是直接发送路由更新信息,R2收到更新路由信息以后,对应也会发送路由更新包,当R2学习到更新的路由以后,对应R1和R2又会回到每隔30s(我这里抓包是30秒左右,不是很精准)发送一次路由更新;
毒性逆转
什么是毒性逆转呢?在RIP里毒性逆转是指当路由器从某个接口收到一条路由更新以后,它会把对应的路由的跳数置为16跳,然后再从这个接口发送给邻居路由器;这句话本质上是和水平分割是矛盾的,所以当水平分割和毒性逆转同时启用,最终生效的是毒性逆转;因为毒性逆转的优先级高于水平分割;默认情况下RIP只开启了水平分割,毒性逆转没有开启;
验证:还是上述的实验拓扑,我们在R1和R2上开启毒性逆转,然后抓包看看对应的数据包会这么发送?
配置R1开启毒性逆转
配置R2开启毒性逆转
提示:开启毒性逆转也是需要在对应的接口上开启,需要先进入到对应接口模式,才能开启毒性逆转;
验证:在R1和R2之间抓包,看看对应R1和R2会怎么发送数据报文?
提示:可以看到R1会把在R2上学习到的路由将其路由的跳数置为16跳,然后发送给R2,同样R2也会把在R1上学习到的路由将其跳数置为16跳,发送给R1;其实我们可以理解为,当路由器从某个接口收到路由更新,它会从这个接口告诉邻居路由器,对应网络从该接口出去是不可达的;
验证:将R1和R2的水平分割也开启,看看水平分割生效还是毒性逆转生效
开启R1的水平分割
开启R2的水平分割
验证:在R1和R2之间抓包,看看R1或者R2是否将从对方学习到的路由再次发送给对方呢?
提示:可以看到对应R2还是会把从R1学习到的路由置为16跳后,再次发送给R1,说明我们配置的水平分割没有生效,这也就意味着水平分割和毒性逆转同时启用,毒性逆转优先生效;
RIP度量值的修改
默认情况下,当一个路由从一个路由器发出,默认会将对应路由的跳数+1以后再发送,对应收到路由默认是不做任何修改;当然RIP的度量值跳数我们是可以通过命令修改的,一般情况修改RIP的度量值,最直接的目的就是影响对应网络的选路,尽可能避开那些低速链路,从而达到我们期望数据包走的链路;
修改R1接受到路由时将其对应路由的跳数+3
提示:默认R1收到路由以后,不会对其度量值进行修改,我们现在修改为收到路由以后将其路由的跳数+3;
验证:查看R1上的路由表,看看对应学习到R2上的路由对应跳数为多少?
提示:可以看到现在R1学习到R2的路由其跳数变为了4,这是因为在R2发送之前对应路由会在+1,然后R1收到路由以后又会+4,所以在R1的路由表中显示的是4;
修改R1发送路由将其路由的度量值修改为8
验证:查看R2的路由表,看看对应学习到R1的路由对应的跳数为多少?
提示:可以看到R2收到R1发送过来的路由其跳数就为8;这里需要注意一点metricout是将跳数固定一个数发送出去,而metricin是将收到的路由增加多少,一个是自己修改后发送出去,一个是收到以后进行修改;
我们知道RIP的选路是根据对应路由的跳数来选,也就是说它不会去看链路的带宽,只要在多条链路中,它始终选择跳数最少的链路走;这样一来RIP就有可能选择次优路径,所以在实际应用中我们可以通过修改对应路由的跳数来影响RIP的选路,从而避开次优路径的选择;
RIP的接口抑制
对应RIP来说,RIP在配置时,我们只能宣告主类地址,然后对应匹配主类地址的接口都会开启RIP并周期性发送路由更新报文;这样一来我们不想让某些接口的网络被其他路由器通过RIP学习到,该怎么办呢?为了解决这样的需求,RIP还支持抑制接口发送或接受路由更新报文或者配置某些接口只收不发路由更新报文;其实这样做的目的也是为了影响数据包选择链路的方式;
配置R1的g0/0/0接口不发送路由更新报文
提示:上述命令表示在g0/0/0这个接口,取消RIP的从该接口发送路由更新报文,默认情况该接口会收发路由更新报文的;
验证:在R1的g0/0/0接口抓包,看看对应接口是否还能抓到R1向R2发送到路由更新报文呢?
提示:可以看到此时只有R2向R1发送到路由更新报文;这样一来R2就无法正常学习到R1上的路由;
验证:查看R2的路由表,看看对应是否能够学习到R1上的路由呢?
提示:可以看到此时R2上就没有R1上的1.1.1.1的路由;
配置R1上的g0/0/0接口不收路由更新报文
提示:上述命令表示R1上的g0/0/0接口只发送路由更新,并不接收路由更新,即R1不学习从g0/0/0收到的路由更新;
验证:在R1的g0/0/0上抓包,看看是否能够抓到R2 发送到路由更新报文?
提示:可以看到在g0/0/0上抓包还是可以抓到R2发送到路由更新报文;
验证:查看R1的路由表,看看R1是否学习了R2发送到路由?
提示:可以看到R1并没有学习R2发送到路由信息,其原因是我们配置了R1禁止接收路由更新报文,当然R1也就无法学习到R2的路由;
配置R1g0/0/0接口为抑制接口,所谓抑制接口是指对应接口为沉默状态(只收不发路由更新报文)
提示:配置抑制接口需要进入到rip模式下;
验证:现在在R1的g0/0/0上抓包,看看对应是否有R1向R2发送路由更新报文呢?
提示:可以看到此时在R1的g0/0/0接口上抓包,就没有发往R2的路由更新报文,只有R2发送给R1的路由更新报文;这里可能你会感觉有些矛盾,之前我们配置的R1接口只发不收,现在又将g0/0/0接口配置为抑制接口,两者不是矛盾吗?当实验告诉我们抑制接口生效了,对应只发不收没有生效,说明抑制接口优先只发不收(undo rip input);
验证RIP的配置信息
查看RIP 1进程的简要信息
查看对应接口RIP的简要信息和详细信息
提示:ver是verbose的简写,表示详细之意;