前文我們了解了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的簡寫,表示詳細之意;