HCNA Routing&Switching之RIP防環機制
前文我們了解了RIP的基礎概念、RIP的特點、RIP報文格式、RIP度量以及RIP配置認證等相關話題,回顧請參考//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的簡寫,表示詳細之意;