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为主路由器。

相关推荐
无线认证x英利检测2 天前
进网许可认证、交换路由设备检测项目更新25年1月起
网络·智能路由器
网络安全Jack2 天前
防火墙技术与网络安全
web安全·智能路由器·php
节点小宝2 天前
如何远程登录路由器
运维·服务器·网络·docker·智能路由器·远程工作
腾科张老师2 天前
BGP的六种状态分别是什么?
网络·智能路由器
Koi慢热2 天前
黑客术语3
网络·安全·网络安全·智能路由器·空间安全·网络空间测绘安全
坚持就是胜利19863 天前
内网穿透玩法之京东云亚瑟路由器刷神卓互联教程
网络·智能路由器·京东云
Hacker_LaoYi3 天前
网络地址转换NAT
网络·智能路由器
日日行不惧千万里3 天前
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备
网络·tcp/ip·智能路由器
hgdlip4 天前
手机静态ip地址怎么获取?方法全解析‌
tcp/ip·智能手机·智能路由器
噠噠噠@4 天前
HCIE-day7
网络·网络协议·计算机网络·智能路由器