HCNA Routing&Switching之动态路由协议OSPF基础(二)

  前文我们主要了解了OSPF的区域、区域分类、路由器类型、OSPF的核心工作流程,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/15025533.html;今天我们来聊一聊OSPF的router-id、OSPF的数据包和OSPF状态机制相关话题;

  router-id的作用

  router id的主要作用是用来唯一标识一台ospf路由器;这个标识可以手动配置,当然如果没有手动配置,它也会根据路由器上的接口情况,进行选取;一般情况强烈推荐手动配置;

  router id自动选取得顺序规则

  1、我们在配置ospf时,如果没有手动配置router id,此时ospf首先会探测有没有活动的回环接口,如果有,就把回环接口的ip地址作为路由器的唯一标识;如果回环接口有多个,则在多个回环接口中,把ip地址最大作为路由器的router id;

  2、如果没有探测到有活动的回环接口,接下来ospf会探测,有没有活动的物理接口,如果有,就选择对应物理接口的ip地址作为router id,如果有多个活动的物理接口,则在多个活动的物理接口中选取ip地址最大的作为路由器的router id;

  3、如果既没有回环接口,也没有活动的物理接口,此时路由器的router id就为0.0.0.0;表示ospf路由器的router id为空;此时ospf进程是无法正常启动的;

  验证:在不配置任何接口的情况下,直接运行ospf进程,看看对应选取的router id是什么?

  提示:可以看到当路由器上没有任何活动接口是,此时运行ospf进程,它现在的router id就是0.0.0.0;其实此时路由器ospf是没有运行起来的;

  验证:当路由器配置了一个回环接口时,router id是否会是这个回环接口的ip地址呢?

  提示:可以看到我们在路由器上添加一个回环接口以后,对应ospf的router id就选择了对应回环接口作为router id;

  验证:当路由器只有活动的物理接口时,ospf进程会怎么选取router id呢?

  验证:当路由器有活动的回环口和物理接口,ospf进程会怎么选取router id呢?

  提示:可以看到在有物理课和lo接口时,物理接口生效;这是模拟器的一个小bug;我们重新开一个路由器R2,配置物理接口和lo接口,看看对应router id会这么选择呢?

  提示:可以看到新开的一个路由器,配置lo接口和物理接口以后,启动ospf,此时ospf会优先选取lo接口ip地址作为router id;

  手动配置ospf 进程的router id

  提示:手动配置router id的优先级最高,这里还需要说明一点,router id是非抢占性的;所谓非抢占是指如果一旦router id选择好以后,即便后面我们又手动指定了router id ,此时router id 不会立马变更为我们手动指定的router id,要想新的router id 生效,我们必须重启ospf进程;

  验证:更改R2的router id为3.3.3.3

  提示:可以看到我们修改router id时,系统提示我们新的router id需要重启ospf进程才会生效;

  验证:重启ospf进程,看看对应新的router id是否会生效呢?

  提示:可以看到重新启动了ospf进程以后,对应router id 就变更为新的router id;这里还需要注意一点,router id是用来标识路由器,其格式类似ip地址;手动指定router id我们只需要保证对应router id的格式和唯一性即可,它和接口ip没有任何关系;

  OSPF数据包结构和类型

 

  如上实验拓扑,在R1和R2上配置好相应的接口和路由器名称,然后抓包看看对应ospf包的结构

  配置R1

<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sys R1
[R1]int lo 1
[R1-LoopBack1]ip add 1.1.1.1 32
[R1-LoopBack1]int g0/0/0
[R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24
[R1-GigabitEthernet0/0/0]ospf 1 router-id 1.1.1.1
Jul 18 2021 18:58:06-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-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]net 1.1.1.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]net 12.0.0.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]q
[R1-ospf-1]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-ospf-1]

  配置R2

<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sys R2
[R2]int lo 2
[R2-LoopBack2]ip add 2.2.2.2 32
[R2-LoopBack2]int g0/0/0 
[R2-GigabitEthernet0/0/0]ip add 12.0.0.2 24
[R2-GigabitEthernet0/0/0]ospf 1 router-id 2.2.2.2
Jul 18 2021 18:59:03-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]ospf 1 router-id 2.2.2.2
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]net 2.2.2.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]net 12.0.0.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]q
[R2-ospf-1]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-ospf-1]
Jul 18 2021 18:59:13-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-ospf-1]
Jul 18 2021 18:59:13-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-ospf-1]
Jul 18 2021 18:59:13-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-ospf-1]
Jul 18 2021 18:59:13-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-ospf-1]
Jul 18 2021 18:59:13-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-ospf-1]
Jul 18 2021 18:59:13-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-ospf-1]

  验证:R1的邻居是否是R2?

  提示:可以看到R1的邻居是R2,并且两者的邻居状态为full状态,说明R1和R2已经建立起邻居关系;

  抓包分析

  提示:从上面抓到hello包可以看到其结构,ospf的hello包是在ip头部的后面,说明ospf协议是网络层协议;其次ospf包里主要包含ospf包头和包类型数据;

  ospf数据包结构

  提示:ospf运行在ip协议之上,是网络层协议,协议号为89;

  ospf hello包结构

  提示:对于ospf的包来讲,其ospf包头结构不会发生变化,头部主要信息有版本信息,默认ipv4是使用ospf v2版本;类型是用来表示ospf包类型,ospf包的类型有五中类型;分别是hello包,dd包(database description),LSR(Link-State Request ),LSU(Link-State Update),LSACK(Link-State Acknowledgment)这五种数据包类型;对于不同类型的ospf数据包,其作用和数据格式各不相同;类型后面是包的长度,路由器的router id,区域id,校验和、身份认证类型和身份认证的相关信息;

  ospf数据包类型和作用

  提示:LSA它不是一个包类型,它是LSU包中的数据,发送LSU就把对应LSA发送给对方;对LSU来说,每个LSU数据包都要由LSACK确认;

  OSPF状态机制

  提示:ospf路由器和路由器之间的最终关系有个,一个是邻居关系,另一个是邻接关系,状态为full表示是邻接关系;状态为2way表示两者为邻居关系;只有2way和full状态是最稳定的状态;

  各状态说明

  down:失效状态,表示没有收到hello包;

  init:初始状态,收到hello包,当没有在hello包中看到自己是对方的邻居的信息;

  Two-way:双向通讯状态,收到hello包,并且在对应的hello包中看到自己是对方的邻居的信息;

  EXstart:交换初始状态,决定信息交换时路由器的主从关系(这里主从是指以那个路由器的序列号为准,默认是router id大者为主);

  ExChange:交换状态,向邻居发送dd数据包;

  Loading:加载状态,LSR和LSU的交换;

  Full:完全邻接状态,LSDB同步,形成邻接关系;

  OSPF工作流程(数据包和状态切换过程)

  第一阶段是使用Hello包建立双向通信的过程,成为邻居关系。

  提示:首先在R1和R2互相不认识之前,两者都是Down的状态(不知道对方的存在),当R1首次向R2发送hello包时,R1会把自己的router id和邻居的router id带上,如果没有邻居,对应邻居字段就为0.0.0.0(空);此时如果R2收到R1发送到hello包以后,它会查看对应的包里面的内容,如果在hello包中邻居的字段中没有看到是自己的router id,此时R2的状态会变为init状态,同时R2也会发送一条hello包给R1,里面的内容就是R2的router id已经邻居为R1的router id;当R1收到R2发送过来的hello包,并在hello包中看到对方的邻居是自己的router id ,此时R1的状态会变为Two-way状态;表示R1认识了R2,并成为邻居关系;此时R1再次发送hello包时就会把对应邻居的字段修改为R2的router id,此时R2收到的R1发送的hello包后,在对应的hello包中看到对应的邻居字段是自己的router id时,此时R2就会从init状态变为Two-way状态;此时R1和R2就互为邻居,默认是每10秒发送一次hello包,以表示自己还存活;

  第二阶段是通过交换LSA达到LSDB同步,建立邻接关系

  提示:在MA(多路访问)网络中,建立好邻居以后,双方各自会认为自己是master,都会发送自己的router id,当router id较小的路由器收到router id较大的路由器发送的hello以后,它会将自己数据包中的MS选项置为0,表示非master;选举好主从以后,后面就是发送数据库摘要信息,发送LSR和LSU最后当所有的LSU确认完毕以后,两者都会成为full状态,表示两者建立好完全邻接关系;

作者:Linux-1874
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
posted @ 2021-07-18 20:48  Linux-1874  阅读(189)  评论(1编辑  收藏  举报