HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  前文我们了解了OSPF的router id、数据包结构、类型、不同类型的数据包作用以及OSPF状态机制,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15027272.html;今天我们来了解下OSPF建立邻居的条件;

  我们知道OSPF动态路由协议能够正常学习到别的路由器的路由,最重要的是相邻的路由器必须建立起邻居关系,然后才能学习到对方的路由;那么两个相邻的路由器,怎么样才能建立起邻居呢?

  1、router id必须唯一;

  实验:如下实验拓扑,把两个路由器的router id都设置成5.5.5.5,两者是否建立起邻居?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  配置R1

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  配置R2

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:此时把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,看看对应邻居关系是否还会一直建立呢?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:可以看到把R2的区域id 修改为2,对应R2并没有和R1建立起邻居关系,其原因是R1的hello包只会在area5这个区域泛洪,而R2的hello包只会在area2这个区域泛洪,所以R1只会和area5区域中的路由器建立邻居,不会和area2区域中的路由器建立邻居;

  3、Hello/Dead时间间隔一致 

  验证:我们把上述实验中R2的hello包发送时间间隔修改为5秒一次,看看对应R1和R2是否会建立起邻居呢?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:默认情况hello包是每隔10秒发一次,死亡时间是发送间隔时间的4倍;修改hello包的发送间隔时间,需要进入到对应的接口进行修改;其次修改了hello包发送间隔时间以后,它不会立马断开,而是要等,等40s,等到hello包死亡,此时ospf进程会给我们日志说接口参数不匹配,导致邻居从full状态转变为down状态;如下图

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  验证:我们把R1ospf接口时间和R2修改成一样,看看对应邻居是否会重新建立起来呢?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:我们修改了R1对应接口上ospf发送hello包的间隔时间和R2接口发送hello包间隔时间一样以后,对应R1就和R2迅速建立起邻居;

  4、如果配置了认证,对应认证必须一致

  验证:在上述实验中我们把R2上运行的ospf配置上认证,看看是否还能和R1建立起邻居?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:可以看到我们在R2的ospf区域中配置了认证以后,对应邻居关系就从full状态转变为down状态,说明如果ospf配置了认证,对应都应该配置认知,否则不予建立邻居关系;

  验证:在R1的相关接口配置和R2相同模式的相同密码认证,看看对应邻居关系是否会恢复呢?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:可以看到当R1的相关接口配置了和R2相同认证模式,相同认证密码以后,对应邻居关系又迅速建立起来了;这里提一下,ospf的认证的配置可以在接口上配置,也可以在ospf进程区域中配置,不管是在接口上配置还是在区域中配置认证,只要模式,对应模式相关参数和密码相同,都能通过认证;上述截图中md5 后面的数字是key的值,两边配置认证,这个key也必须相同,否则认证会失败;

  5、子网掩码和网络地址一致(以太网环境)

  验证:把上述实验中的R2的g0/0/0接口的ip地址掩码修改为8,看看对应邻居关系是否还会存在呢?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:我们修改了R2 上的g0/0/0接口地址的掩码以后,立刻R1和R2的邻居关系就down了,这里只是告诉我们接口发生了变化;

  抓包看看,对应R1和R2发送到hello包有什么不同?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:可以看到修改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的数据包中的字段就是外部路由选项,如下图

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:默认情况两个路由器红框中的字段是一样的;

  验证:设置R2的ospf区域为nssa区域,看看对应邻居是否会down?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:可以看到我们一旦把R2中ospf的区域设置为nssa区域以后,对应邻居关系就down了;这里要提示一下,骨干区域是不允许设置为nssa区域;

  抓包分析

  R2发送的hello包

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  R1发送的hello包

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  从上面的抓包来看,在R2的外部路由选项中,对应nssa区域字段被置为1,和R1中的字段不同,所以两者信息不匹配,所以两者之前建立好的邻居关系会down掉;

  验证:把R1的区域也设置成nssa区域,看看对应邻居是否会恢复呢?

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

  提示:可以看到把R1ospf区域也修改为nssa区域,对应邻居又恢复正常;这是因为R1和R2都是nssa区域,所以对应外部选项对应字段的值都是一样,所以邻居建立了;

HCNA Routing&Switching之动态路由协议OSPF建立邻居的条件

上一篇:将八进制字符转换为字符串


下一篇:"ros::NodeHandle"的用法:全局vs.私有