HCNA Routing&Switching之動態路由協議OSPF建立鄰居的條件

1874發表於2021-07-20

  前文我們瞭解了OSPF的router id、資料包結構、型別、不同型別的資料包作用以及OSPF狀態機制,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/15027272.html;今天我們來了解下OSPF建立鄰居的條件;

  我們知道OSPF動態路由協議能夠正常學習到別的路由器的路由,最重要的是相鄰的路由器必須建立起鄰居關係,然後才能學習到對方的路由;那麼兩個相鄰的路由器,怎麼樣才能建立起鄰居呢?

  1、router id必須唯一;

  實驗:如下實驗拓撲,把兩個路由器的router id都設定成5.5.5.5,兩者是否建立起鄰居?

  配置R1

  配置R2

  提示:此時把R2的router id和R1都配置成5.5.5.5,ospf程式給我們提示了一條router id衝突的日誌;此時兩者鄰居關係並沒有建立起來;說明router id不唯一,是建立不起鄰居關係的;

  驗證:把R2的router id修改成2.2.2.2 ,然後重啟ospf程式,看看對應鄰居是否能夠建立起來呢?

<R2>sys
Enter system view, return user view with Ctrl+Z.
[R2]ospf 1 router-id 2.2.2.2
Jul 19 2021 22:01:28-08:00 R2 %%01OSPF/4/CONFLICT_ROUTERID_INTF(l)[0]:OSPF Router id conflict is detected on interface. (ProcessId=256, RouterId=5.5.5.5, AreaId=5.0.0.0, InterfaceName=GigabitEthernet0/0/0,  IpAddr=2.0.0.12, PacketSrcIp=1.0.0.12) 
[R2]ospf 1 router-id 2.2.2.2
Info: The configuration succeeded. You need to restart the OSPF process to validate the new router ID.
[R2-ospf-1]q
[R2]q
<R2>reset ospf process
Warning: The OSPF process will be reset. Continue? [Y/N]:y
<R2>sys
Enter system view, return user view with Ctrl+Z.
[R2]
Jul 19 2021 22:01:46-08:00 R2 %%01OSPF/4/NBR_CHANGE_E(l)[1]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=1.0.0.12, NeighborEvent=HelloReceived, NeighborPreviousState=Down, NeighborCurrentState=Init) 
[R2]
Jul 19 2021 22:01:46-08:00 R2 %%01OSPF/4/NBR_CHANGE_E(l)[2]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=1.0.0.12, NeighborEvent=2WayReceived, NeighborPreviousState=Init, NeighborCurrentState=2Way) 
[R2]
Jul 19 2021 22:01:46-08:00 R2 %%01OSPF/4/NBR_CHANGE_E(l)[3]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=1.0.0.12, NeighborEvent=AdjOk?, NeighborPreviousState=2Way, NeighborCurrentState=ExStart) 
[R2]
Jul 19 2021 22:01:46-08:00 R2 %%01OSPF/4/NBR_CHANGE_E(l)[4]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=1.0.0.12, NeighborEvent=NegotiationDone, NeighborPreviousState=ExStart, NeighborCurrentState=Exchange) 
[R2]
Jul 19 2021 22:01:47-08:00 R2 %%01OSPF/4/NBR_CHANGE_E(l)[5]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=1.0.0.12, NeighborEvent=ExchangeDone, NeighborPreviousState=Exchange, NeighborCurrentState=Loading) 
[R2]
Jul 19 2021 22:01:47-08:00 R2 %%01OSPF/4/NBR_CHANGE_E(l)[6]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=1.0.0.12, NeighborEvent=LoadingDone, NeighborPreviousState=Loading, NeighborCurrentState=Full) 
[R2]dis ospf peer brief

         OSPF Process 1 with Router ID 2.2.2.2
                  Peer Statistic Information
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 0.0.0.5          GigabitEthernet0/0/0             5.5.5.5          Full        
 ----------------------------------------------------------------------------
[R2]

  提示:可以看到我們修改了R2的router id 重置了ospf以後,對應就和R1建立起鄰居;

  2、區域id必須相同

  驗證:還是上述實驗拓撲,我們把R2的區域id修改為2,看看對應鄰居關係是否還會一直建立呢?

  提示:可以看到把R2的區域id 修改為2,對應R2並沒有和R1建立起鄰居關係,其原因是R1的hello包只會在area5這個區域泛洪,而R2的hello包只會在area2這個區域泛洪,所以R1只會和area5區域中的路由器建立鄰居,不會和area2區域中的路由器建立鄰居;

  3、Hello/Dead時間間隔一致 

  驗證:我們把上述實驗中R2的hello包傳送時間間隔修改為5秒一次,看看對應R1和R2是否會建立起鄰居呢?

  提示:預設情況hello包是每隔10秒發一次,死亡時間是傳送間隔時間的4倍;修改hello包的傳送間隔時間,需要進入到對應的介面進行修改;其次修改了hello包傳送間隔時間以後,它不會立馬斷開,而是要等,等40s,等到hello包死亡,此時ospf程式會給我們日誌說介面引數不匹配,導致鄰居從full狀態轉變為down狀態;如下圖

  驗證:我們把R1ospf介面時間和R2修改成一樣,看看對應鄰居是否會重新建立起來呢?

  提示:我們修改了R1對應介面上ospf傳送hello包的間隔時間和R2介面傳送hello包間隔時間一樣以後,對應R1就和R2迅速建立起鄰居;

  4、如果配置了認證,對應認證必須一致

  驗證:在上述實驗中我們把R2上執行的ospf配置上認證,看看是否還能和R1建立起鄰居?

  提示:可以看到我們在R2的ospf區域中配置了認證以後,對應鄰居關係就從full狀態轉變為down狀態,說明如果ospf配置了認證,對應都應該配置認知,否則不予建立鄰居關係;

  驗證:在R1的相關介面配置和R2相同模式的相同密碼認證,看看對應鄰居關係是否會恢復呢?

  提示:可以看到當R1的相關介面配置了和R2相同認證模式,相同認證密碼以後,對應鄰居關係又迅速建立起來了;這裡提一下,ospf的認證的配置可以在介面上配置,也可以在ospf程式區域中配置,不管是在介面上配置還是在區域中配置認證,只要模式,對應模式相關引數和密碼相同,都能通過認證;上述截圖中md5 後面的數字是key的值,兩邊配置認證,這個key也必須相同,否則認證會失敗;

  5、子網掩碼和網路地址一致(乙太網環境)

  驗證:把上述實驗中的R2的g0/0/0介面的ip地址掩碼修改為8,看看對應鄰居關係是否還會存在呢?

  提示:我們修改了R2 上的g0/0/0介面地址的掩碼以後,立刻R1和R2的鄰居關係就down了,這裡只是告訴我們介面發生了變化;

  抓包看看,對應R1和R2傳送到hello包有什麼不同?

  提示:可以看到修改R2介面的掩碼以後,對應R2傳送到hello包,對應掩碼就變成了255.0.0.0,而R1的介面掩碼沒有發生變化,還是255.255.255.0;所以當兩個路由器傳送到hello包中掩碼不一致也會導致鄰居關係建立不起來;其實掩碼的主要作用就是用來計算網路地址,網路地址的作用就是確定兩個ip地址是否是同一網路,如果不在同一網路,則無法建立鄰居;

  如何判斷兩個ip地址是否是同一網路呢?

首先我們需要把a地址同自身掩碼計算出網路地址x,然後把a地址的掩碼和b地址做與運算,算出網路地址為y,如果x=y我們就說a和b在同一網路;反之a和b不在同一網路;這裡一定要記住判斷a和b是否在同一網路中,需要把a地址同a的掩碼進行計算得出網路地址,同時b地址也需要同a的掩碼進行計算;同樣的道理,我們如果要判斷b和a是否在同一網路中,就需要把b的地址同b的掩碼進行計算得出網路地址,a地址同b的掩碼進行計算得出網路地址,如果兩者計算出來的網路地址一樣,則表示兩者在同一網路中,反之亦然;這樣一來就存在a和b在同一網路,但b和a就不一定在同一網路;

  示例:a主機的地址是192.168.0.129/24 b主機地址是192.168.0.3/27  

a和b在同一網路,因為a的網路地址是192.168.0.0 b的網路地址是192.168.0.0(b的網路地址此時需要同a的掩碼進行與運算)

b和a不再同一網路,因為b的網路地址是192.168.0.0 a的網路地址是192.168.0.128(此時a網路地址就需要同b的掩碼進行與運算)

  通過上述的解釋我們在乙太網環境中跑ospf,兩個介面的ip地址的掩碼和網路地址必須一致才能建立起鄰居;

  6、末梢區域設定一致

  末梢區域設定表現在ospf的資料包中的欄位就是外部路由選項,如下圖

  提示:預設情況兩個路由器紅框中的欄位是一樣的;

  驗證:設定R2的ospf區域為nssa區域,看看對應鄰居是否會down?

  提示:可以看到我們一旦把R2中ospf的區域設定為nssa區域以後,對應鄰居關係就down了;這裡要提示一下,骨幹區域是不允許設定為nssa區域;

  抓包分析

  R2傳送的hello包

  R1傳送的hello包

  從上面的抓包來看,在R2的外部路由選項中,對應nssa區域欄位被置為1,和R1中的欄位不同,所以兩者資訊不匹配,所以兩者之前建立好的鄰居關係會down掉;

  驗證:把R1的區域也設定成nssa區域,看看對應鄰居是否會恢復呢?

  提示:可以看到把R1ospf區域也修改為nssa區域,對應鄰居又恢復正常;這是因為R1和R2都是nssa區域,所以對應外部選項對應欄位的值都是一樣,所以鄰居建立了;

相關文章