OSPF邻居邻接关系

原理概述

OSPF网络中,路由器在发送任何链路状态信息之前,必须先建立起正确的OSPF邻居邻接关系。

OSPF路由器是使用Hello报文建立邻居关系的。OSPF路由器会检查所收到的Hello报文中各种参数,如Router-ID、Area-ID、认证信息、网络掩码、Hello时间间隔等。如果这些参数和接收接口上配置的对应参数都一一保持一致,则邻居关系就会建立起来,否则就无法建立起邻居关系。

OSPF路由器的邻居建立完成之后,下一步才是建立邻接关系。并不是所有的OSPF邻居之间都可以建立邻接关系,这要取决于OSPF邻居之间的网络类型。例如,在点到点网络上,有效的OSPF邻居关系都可以进一步形成邻接关系。在广播型网络上,会选举DR和BDR;DR和BDR会与所有其它路由器都建立邻接关系,其他路由器都只与DR和BDR建立邻接关系。

实验目的

理解OSPF邻居关系和OSPF邻接关系的含义及差别

观察OSPF邻居邻接关系的建立过程

观察OSPF链路状态数据库的同步过程

实验内容

实验拓扑如图所示。本实验模拟了一个跨国企业网络场景,国内集团总部的路由器R1、R2、R3组成了一个广播型网络,国外分公司1的路由器R4与国内集团总部核心路由器R1组成了一个点到点的网络,国外分公司2的路由器R5与国内集团总部核心路由器R1组成了另一个点到点的网络。通过实验,需要理解OSPF邻居关系和OSPF邻接关系的含义及差别,并且观察OSPF邻居邻接关系的建立过程以及OSPF链路状态数据库(LSDB:Link State Database)的同步过程。

实验拓扑

1.基本配置

根据拓扑图进行相应的基本配置,并使用ping命令检测R1与R2之间的连通性。

其余直连网段的连通性测试过程在此省略·。

2.配置OSPF路由协议

在每台路由器上运行OSPF协议的配置,其中R1、R2、R3之间的链路属于区域0,R1和R4之间的链路属于区域1,R1和R5之间的链路属于区域2。

[R1]ospf router-id 10.0.1.1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 10.0.123.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0]network 10.0.1.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]area 1

[R1-ospf-1-area-0.0.0.1]net 10.0.14.0 0.0.0.255
[R1-ospf-1-area-0.0.0.1]area 2
[R1-ospf-1-area-0.0.0.2]net 10.0.15.0 0.0.0.255

 

[R2]ospf router-id 10.0.2.2
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]net 10.0.123.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]net 10.0.2.2 0.0.0.0

[r3]ospf router-id 10.0.3.3
[r3-ospf-1]area 0
[r3-ospf-1-area-0.0.0.0]net 10.0.123.0 0.0.0.255
[r3-ospf-1-area-0.0.0.0]net 10.0.3.3 0.0.0.0

 

[r4]ospf router-id 10.0.4.4
[r4-ospf-1]area 1
[r4-ospf-1-area-0.0.0.1]net 10.0.14.0 0.0.0.255
[r4-ospf-1-area-0.0.0.1]net 10.0.4.4 0.0.0.0

[r5]ospf router-id 10.0.5.5
[r5-ospf-1]area 2
[r5-ospf-1-area-0.0.0.2]net 10.0.15.0 0.0.0.255
[r5-ospf-1-area-0.0.0.2]net 10.0.5.5 0.0.0.0

配置完成后,在R1上查看OSPF邻居建立情况

 可以看到,R1的OSPF邻居状态都为Full,说明邻居邻接关系已经成功建立。在R1上查看OSPF邻居状态的详细信息。

 可以看到,包含R1、R2、R3的广播网络已经完成了DR/BDR的选举,选举结果是10.0.123.1(R1)为DR,10.0.123.2(R2)为BDR,R1与R4之间,R1与R5之间的两个点到点网络都没有进行DR/BDR的选举。

在R1上查看广播型网络的接口G0/0/0和点到点网络接口Serial 4/0/0的详细情况。

可以看到,广播网络接口和点到点网络接口默认Hello时间间隔都为10s,失效时间都为40s。

3.观察OSPF邻接关系的建立过程

首先观察在广播网络上OSPF邻居邻接关系的建立过程。为了在R1上清晰地观察到广播网络上OSPF邻居邻接关系的建立过程,请先关闭R1上的Serial 4/0/0和Serial 4/0/1接口。

[R1]int s4/0/0
[R1-Serial4/0/0]shutdown
[R1-Serial4/0/0]int s4/0/1
[R1-Serial4/0/1]shutdown 

然后,在R1上查看OSPF邻居状态。

 可以看到,R1与R2、R3的邻居状态都是Full,说明已经建立好了邻接关系。

现在,在R1上重启OSPF进程,通过Debugging调试观察R1与R2之间的OSPF邻接关系的建立过程。

<R1>debugging ospf packet
<R1>reset ospf process

May  1 2024 13:29:18-08:00 R1 %%01OSPF/3/NBR_CHG_DOWN(l)[12]:Neighbor event:neighbor state changed to Down. (ProcessId=256, NeighborAddress=2.2.0.10, NeighborEvent=KillNbr, NeighborPreviousState=Full, NeighborCurrentState=Down) 
<R1>
May  1 2024 13:29:18-08:00 R1 %%01OSPF/3/NBR_DOWN_REASON(l)[13]:Neighbor state leaves full or changed to Down. (ProcessId=256, NeighborRouterId=2.2.0.10, Neighb
orAreaId=0, NeighborInterface=GigabitEthernet0/0/0,NeighborDownImmediate reason=
Neighbor Down Due to Kill Neighbor, NeighborDownPrimeReason=OSPF Process Reset

NeighborChangeTime=2024-05-01 13:29:18-08:00) 
<R1>
...... 
<R1>
May  1 2024 13:29:22-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[18]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighb
orEvent=HelloReceived, NeighborPreviousState=Down, NeighborCurrentState=Init) 

<R1>
May  1 2024 13:29:22-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[19]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighb
orEvent=2WayReceived, NeighborPreviousState=Init, NeighborCurrentState=2Way

<R1>
May  1 2024 13:29:28-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[20]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighb
orEvent=AdjOk?, NeighborPreviousState=2Way, NeighborCurrentState=ExStart

<R1>
May  1 2024 13:29:28-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[23]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighb
orEvent=NegotiationDone, NeighborPreviousState=ExStart, NeighborCurrentState=Exc
hange

<R1>
May  1 2024 13:29:28-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[24]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighb
orEvent=ExchangeDone, NeighborPreviousState=Exchange, NeighborCurrentState=Loadi
ng)
 
<R1>
May  1 2024 13:29:28-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[26]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighb
orEvent=LoadingDone, NeighborPreviousState=Loading, NeighborCurrentState=Full)
 

       从上面的显示信息可知,重启 OSPF 进程后,R1与R2的邻居关系由 Full 状态转到了 Down 状态。然后,当R1从R2收到 Hello 报文后,邻居关系由 Down 状态转变为了初始状态( Init )。 Hello 报文的参数协商完成后,R1与R2的邻居关系进入到了2-Way 状态,2-Way 状态表明双方已经成功建立了邻居关系。邻居关系建立之后,R1与R2进入到信息交换初始状态( ExStart )、信息交换状态( Exchange )以及信息加载状态( Loading ),最终进入到 Full 状态。 Full 状态表明双方已成功建立了邻接关系。R1与R3的 OSPF 邻接关系的建立过程完全类似,这里不再赘述。
       需要特别说明的是, OSPF 路由器之间的邻居关系并不等于邻接关系。邻居关系建立后,还需完成链路状态信息的交换,然后才能建立起邻接关系。
       下面通过实验来进一步说明 OSPF 路由器之间的邻居关系与邻接关系的区别。在广播网络中, DRothers 之间不需要交换 LSA ( Link State Advertisement ), DRothers 是通过 DR / BDR 来获取整个广播网络的链路状态信息的,所以 DRothers 之间不需要建立邻接关系,只需要建立邻居关系即可。
       在R1、R2、R3、 SW 组成的广播网络中,R1是 DR ,R2是 BDR ,所以不便于观察 DRothers 之间的邻居关系。现在,将R1的 GE 0/0/0和R2的 GE 0/0/0接口优先级的值改为0,放弃 DR 的选举,使它们都成为 DRothers ,以便观察它们之间的 OSPF 邻居关系。 

[R1]int g0/0/0
[R1-GigabitEthernet0/0/0]ospf dr-priority 0

[R2]int g0/0/0
[R2-GigabitEthernet0/0/0]ospf dr-priority 0

重启R1和R2上的OSPF进程后,先在DR路由器R3上查看OSPF的邻居建立情况。 

可以看到R3为DR,网络中没有BDR,R3分别与R1和R2建立了邻接关系。

在路由器R1上查看OSPF邻居关系建立情况。

可以看到,R1与DR路由器R3建立的是邻接关系,状态为Full,而与DRothers路由器R2只建立了邻居关系,状态为2-way。

在路由器R1上重启OSPF进程,通过Debugging调试观察OSPF邻居邻接关系的建立过程。

<R1>debugging ospf packet
<R1>reset ospf process

May  1 2024 13:55:54-08:00 R1 %%01OSPF/3/NBR_CHG_DOWN(l)[0]:Neighbor event:neighbor state changed to Down. (ProcessId=256, NeighborAddress=2.2.0.10, NeighborEvent=KillNbr, NeighborPreviousState=2Way, NeighborCurrentState=Down) 
<R1>
May  1 2024 13:55:54-08:00 R1 %%01OSPF/3/NBR_DOWN_REASON(l)[1]:Neighbor state leaves full or changed to Down. (ProcessId=256, NeighborRouterId=2.2.0.10, Neighbo
rAreaId=0, NeighborInterface=GigabitEthernet0/0/0,NeighborDownImmediate reason=N
eighbor Down Due to Kill Neighbor, NeighborDownPrimeReason=OSPF Process Reset
, N
eighborChangeTime=2024-05-01 13:55:54-08:00) 
<R1>
May  1 2024 13:55:54-08:00 R1 %%01OSPF/3/NBR_CHG_DOWN(l)[2]:Neighbor event:neighbor state changed to Down. (ProcessId=256, NeighborAddress=3.3.0.10, NeighborEve
nt=KillNbr, NeighborPreviousState=Full, NeighborCurrentState=Down

<R1>
May  1 2024 13:55:54-08:00 R1 %%01OSPF/3/NBR_DOWN_REASON(l)[3]:Neighbor state leaves full or changed to Down. (ProcessId=256, NeighborRouterId=3.3.0.10, Neighbo
rAreaId=0, NeighborInterface=GigabitEthernet0/0/0,NeighborDownImmediate reason=N
eighbor Down Due to Kill Neighbor, NeighborDownPrimeReason=OSPF Process Reset
, N
eighborChangeTime=2024-05-01 13:55:54-08:00) 
<R1>
May  1 2024 13:55:57-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[4]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighbo
rEvent=HelloReceived, NeighborPreviousState=Down, NeighborCurrentState=Init

<R1>
May  1 2024 13:55:57-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[5]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighbo
rEvent=2WayReceived, NeighborPreviousState=Init, NeighborCurrentState=2Way)
 
<R1>
May  1 2024 13:55:57-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[6]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighbo
rEvent=AdjOk?, NeighborPreviousState=2Way, NeighborCurrentState=2Way

<R1>
May  1 2024 13:56:01-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[7]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighbo
rEvent=HelloReceived, NeighborPreviousState=Down, NeighborCurrentState=Init

<R1>
May  1 2024 13:56:01-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[8]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighbo
rEvent=2WayReceived, NeighborPreviousState=Init, NeighborCurrentState=2Way

<R1>
May  1 2024 13:56:01-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[9]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.123.0.10, Neighbo
rEvent=AdjOk?, NeighborPreviousState=2Way, NeighborCurrentState=2Way

<R1>
May  1 2024 13:56:01-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[10]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighb
orEvent=AdjOk?, NeighborPreviousState=2Way, NeighborCurrentState=ExStart

<R1>
May  1 2024 13:56:02-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[11]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighb
orEvent=NegotiationDone, NeighborPreviousState=ExStart, NeighborCurrentState=Exc
hange

<R1>
May  1 2024 13:56:02-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[12]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighb
orEvent=ExchangeDone, NeighborPreviousState=Exchange, NeighborCurrentState=Loadi
ng

<R1>
May  1 2024 13:56:02-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[13]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=3.123.0.10, Neighb
orEvent=LoadingDone, NeighborPreviousState=Loading, NeighborCurrentState=Full

从上面的显示信息可以看到,R1与R2只建立了 OSPF 邻居关系,处于2- Way 状态,而R1与R3之间建立了邻接关系,处于 Full 状态。
接下来实验观察点到点网络中 OSPF 的邻居关系建立情况。开启R1上的两个串口 Serial 4/0/0和 Serial 4/0/1,然后关闭广播接口 GE 0/0/0。关闭广播接口的目的是突出所要关注的实验现象,排除干扰因素。 

[R1]int s4/0/0
[R1-Serial4/0/0]undo shutdown
[R1-Serial4/0/0]int s4/0/1
[R1-Serial4/0/1]undo shutdown
 [R1-Serial4/0/1]int g0/0/0
[R1-GigabitEthernet0/0/0]shutdown

 然后,在R1上查看OSPF邻居建立情况。

可以看到,路由器R1与R4和R5已经分别建立了邻接关系,邻居状态为FULL。

在路由器R1上重启OSPF进程,通过Debugging调试观察R1与R4之间的OSPF邻居邻接关系的建立过程。

<R1>debugging ospf packet
<R1>reset ospf process

May  6 2024 14:03:12-08:00 R1 %%01OSPF/3/NBR_CHG_DOWN(l)[0]:Neighbor event:neighbor state changed to Down. (ProcessId=256, NeighborAddress=4.4.0.10, NeighborEvent=KillNbr, NeighborPreviousState=Full, NeighborCurrentState=Down
<R1>
May  6 2024 14:03:12-08:00 R1 %%01OSPF/3/NBR_DOWN_REASON(l)[1]:Neighbor state leaves full or changed to Down. (ProcessId=256, NeighborRouterId=4.4.0.10, Neighbo
rAreaId=16777216, NeighborInterface=Serial4/0/0,NeighborDownImmediate reason=Nei
ghbor Down Due to Kill Neighbor, NeighborDownPrimeReason=OSPF Process Reset, Nei
ghborChangeTime=2024-05-06 14:03:12-08:00) 
<R1>
May  6 2024 14:03:16-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[4]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=4.14.0.10, Neighbor
Event=HelloReceived, NeighborPreviousState=Down, NeighborCurrentState=Init)
 
<R1>
May  6 2024 14:03:16-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[5]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=4.14.0.10, Neighbor
Event=2WayReceived, NeighborPreviousState=Init, NeighborCurrentState=ExStart)
 
<R1>
May  6 2024 14:03:16-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[6]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=4.14.0.10, Neighbor
Event=NegotiationDone, NeighborPreviousState=ExStart, NeighborCurrentState=Excha
nge) 

<R1>
May  6 2024 14:03:16-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[7]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=4.14.0.10, Neighbor
Event=ExchangeDone, NeighborPreviousState=Exchange, NeighborCurrentState=Loading

<R1>
May  6 2024 14:03:16-08:00 R1 %%01OSPF/4/NBR_CHANGE_E(l)[8]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=4.14.0.10, Neighbor
Event=LoadingDone, NeighborPreviousState=Loading, NeighborCurrentState=Full)
 

      从上面的显示信息可以看到,重启 OSPF 进程后,R1与R4的邻居关系由 Full 状态转变为 Down 状态。当R1收到R4发送的 Hello 报文后,邻居关系由 Down 状态转变为初始状态( Init )。接着,R1与R4便直接进入了信息交换初始状态( ExStart )、信息交换状态( Exchange ),以及信息加载状态( Loading ),最终成功建立了邻接关系,进入了 Full 状态。R1与R5的 OSPF 邻接关系的建立过程完全类似,这里不再赘述。
        需要注意的是,R1与R4路由器没有经过2-Way 状态,并且也不存在2- Way 状态, 说明点到点网络与广播网络中 OSPF 的邻接关系建立过程不是完全一样的。在点到点网络中,能够建立 OSPF 邻居关系的路由器一定会继续建立邻接关系。

4.观察OSPF链路状态数据库的同步过程

下面将通过查看报文的的方式来简单观察一下OSPF邻接关系建立过程中链路状态数据库LSDB是如何同步的,这里仅以点到点网络为例进行实验。

在R1的Serial4/0/0接口上查看报文,重启R1上的OSPF进程。

<R1>debugging ospf packet
<R1>reset ospf process

                                        图-在R1的 Serial 4/0/0接口上查看报文
从上图中可以观察到 OSPF 协议的各种数据报文,它们反映了 LSDB 的同步过程,同时也反映了 OSPF 邻居邻接关系建立的过程:首先,R1(10.0.14.1)和R4(10.0.14.4)通过 Hello 报文进行协商,然后通过数据库描述( DD : Database Description )报文、链路状态请求( LSR : Link State Request )报文、链路状态更新( LSU : Link State Update )报文等,最终实现了 LSDB 的同步,并建立起 OSPF 邻接关系。
下面来分析一下R1和R4相互发送的 Hello 报文:

No.91(Hello报文):

                                                      图-R1发送的Hello报文 

No.79(Hello报文): 

                                                     图-R4发送的Hello报文

可以看到, Hello 报文中包含了很多基本信息,例如,网络掩码为24位, Hello 间隔时间为10s,路由器死亡时间间隔为40s,网络上没有 DR 和 BDR 。另外,R4发出的 Hellh 报文中指出了活跃邻居为 RI ,这说明R1与R4成功建立了 OSPF 邻居关系。 

No.80( Hello报文)

                                                     图-R1发送的DD报文

No.81(Hello报文)

                                                   图-R4发送的DD报文

    可以发现,第80和第81两个报文为R1和R4首次交互的DD报文,其中I位、M位、MS位都设置为1。R1和R4都宣称自己是主路由器。这两个DD报文是不包含数据库摘要信息的。 首次DD报文交互后,便可选出Router-ID较大的R4为主路由器。

  • 25
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OSPF(Open Shortest Path First)是一种用于路由选择的动态路由协议。在OSPF邻居邻接关系是非常重要的概念。 邻居是指在同一个OSPF区域内,通过OSPF协议相互通信的路由器邻居之间通过交换Hello消息来建立和维护邻居关系。Hello消息包含了路由器的ID、优先级、Hello间隔等信息,用于发现和识别邻居邻接关系是指在OSPF邻居之间建立的连接关系。通过建立邻接关系路由器可以交换链路状态信息(LSA)来了解网络拓扑,并计算最短路径。邻接关系建立需要满足一定的条件,如Hello消息的匹配、区域ID的匹配等。 在OSPF邻居邻接关系建立是基于以下几个步骤: 1. Hello消息交换:路由器发送Hello消息广播,其他路由器收到后进行匹配和回复。 2. 邻居状态机:根据Hello消息的匹配结果,路由器进入相应的邻居状态,如Down、Init、Two-Way、Exstart、Exchange和Full等。 3. DD(Database Description)交换:在Exstart和Exchange状态下,路由器交换数据库描述信息,用于同步链路状态数据库(LSDB)。 4. LSR(Link State Request)和LSU(Link State Update)交换:在Exchange状态下,路由器通过LSR和LSU消息交换链路状态信息。 5. LSACK(Link State Acknowledgment)交换:在Full状态下,路由器通过LSACK消息确认收到的LSU消息。 通过建立邻接关系OSPF路由器可以共享网络拓扑信息,并计算出最短路径,从而实现路由选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值