当前位置: 代码迷 >> 综合 >> OSPF(1)
  详细解决方案

OSPF(1)

热度:19   发布时间:2023-12-12 11:12:04.0

简述OSPF

我们知道路由信息是网路互通的必要信息。如果有小型网络的经验,那么我们可能配置较多的是静态路由。若是一个大型网络或者企业内部,静态路由明显是不足了。这个时候我们就需要动态路由。动态路由是提前设计号的一些算法内嵌在路由器硬件中,他可以通过与邻接的路由器交换信息,以此达到计算全网的路由路径。说简单点就是可以自我学习。
这篇博文我会介绍一下内部网关协议中较为常用的OSPF协议。

我先拿拓扑图操作一下。
先将如下topology配置好各接口ip。注意,我们不要配路由,而且在配置完后检查一下接口ip配置是否正确已经直连方向能不能两两PING通。
在这里插入图片描述
配置完成之后我们在配置OSPF。
R1:

[R1]ospf                               //配置ospf初始命令
[R1-ospf-1]area 0              //设置区域,为什么是‘0’后面介绍
[R1-ospf-1-area-0.0.0.0]network 192.168.11.0 0.0.0.255             //宣告该路由器所在的网段,后面是wildcard-mask
[R1-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255           //宣告该路由器所在的网段 

注意:我们创建的是区域0,宣告了两个网段,因为是两个接口连接的不同网段。若是创建了两个区域,就是在不同区域可以宣告不同网段。后面会解释。请务必注意这一点。
R2:

[R2]ospf
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 192.168.11.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255

R3:(配上提示状态信息摘要)

[R3]ospf
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 192.168.2.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255[0]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.12.168.192, Neigh
borEvent=HelloReceived, NeighborPreviousState=Down, NeighborCurrentState=Init) 
//步骤0:邻路状态改变(地址=, 事件=hello接受,前态=Down,现态=初始化)
[R3-ospf-1-area-0.0.0.0]
[1]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.12.168.192, Neigh
borEvent=2WayReceived, NeighborPreviousState=Init, NeighborCurrentState=2Way) 
//步骤1:(事件=2way接受,前态=初始化,现态=2way)
[R3-ospf-1-area-0.0.0.0]
[2]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.12.168.192, Neigh
borEvent=AdjOk?, NeighborPreviousState=2Way, NeighborCurrentState=ExStart) 
//步骤1:(事件=adjacency OK?,前态=2WAY,现态=准启动)
[R3-ospf-1-area-0.0.0.0]
[3]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.12.168.192, Neigh
borEvent=NegotiationDone, NeighborPreviousState=ExStart, NeighborCurrentState=Exchange) 
//步骤1:(事件=协商结束,前态=准启动, 现态=交换)
[R3-ospf-1-area-0.0.0.0]
[4]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.12.168.192, Neigh
borEvent=ExchangeDone, NeighborPreviousState=Exchange, NeighborCurrentState=Loading) 
[R3-ospf-1-area-0.0.0.0]
[5]:Neighbor changes event: neighbor status changed. (ProcessId=256, NeighborAddress=2.12.168.192, Neigh
borEvent=LoadingDone, NeighborPreviousState=Loading, NeighborCurrentState=Full) 

-OSPF邻居状态:
init -初始化;
two-way -双向通信状态;
exstart -交换初始化状态;
exchange - 交换状态;
loading - 加载状态;
full - 完全邻接
down - 挂了

通过以上简单配置,这个时候PC1和PC2可以互相通信了。我们可以通过查看路由表来看看已经生成的路由信息。

[R1]display ip routing-table protocol ospf                 //仅仅查看OSPF路由Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface192.168.2.0/24  OSPF    10   3           D   192.168.11.2    GigabitEthernet0/0/1192.168.12.0/24  OSPF    10   2           D   192.168.11.2    GigabitEthernet0/0/1

以上信息可以清楚的看到到其他网段的路由都是由协议OSPF生成。优先级默认都是10(越小越好),代价cost是指到其他网段的距离(越小越好)(默认一个网段代价为1)。

以上我们可以知道只要配置了OSPF,在配置OSPF的路由器上宣告连接的所有网段。他们自动会生成全网的路由状态信息。所以OSPF的作用和工作进程到底是什么呢?下面解释一下。

OSPF的作用:
在网络中的各个路由器运行之后,会让每个路由器独立的计算去往每个网络中的网段信息。最短并且无环的数据转发路径。

OSPF基本工作进程:
->1.建立邻居表(查看R2的邻居表图)
->2.同步数据库
->3.计算路由表

邻居表图
当然OSPF完成以上进程肯定是通过转发协议数据包来完成的。先介绍一下具体的报文类型

1.Hello包
2.DD包 ----DATABASE DESCRIPTION
3.LSR包 ----LINK STATE REQUEST
4.LSU包 ----LINK STATE UPDATE
5.LSA包 ----LINK STATE ACKNOWLEDGE

我们可以通过抓包(11.0)看看。如下图,11.2和11.1每隔十秒会发送Hello Packet,目标地址都是224.0.0.5。这些后面会介绍到
在这里插入图片描述
OSPF具有自我计算路由的功能,我们通过具体命令来看看R1上的链路状态数据库。具体后面在介绍。

[R1]display ospf lsdbOSPF Process 1 with Router ID 192.168.11.1Link State Database Area: 0.0.0.0Type      LinkState ID    AdvRouter          Age  Len   Sequence   MetricRouter    192.168.11.2    192.168.11.2      1314  48    8000000B       1Router    192.168.11.1    192.168.11.1      1303  48    8000000A       1Router    192.168.12.1    192.168.12.1      1636  48    80000006       1Network   192.168.11.2    192.168.11.2      1314  32    80000003       0Network   192.168.12.2    192.168.11.2      1671  32    80000003       0

OSPF的稳定性和进程号/ID介绍

细心点会发现我们创建ospf默认的进程号是1,就是OSPF-1。默认的router-id 是其某个接口的ip。为了利于方便,这些其实在真实工作中必须是需要改掉的。而且要记住,进程和ID是该路由器上的独立信息,可以随意设置。但是路由区域是整体的,后面会介绍。下面实验演示一下。

我们在一开始创建ospf的时候就可以直接创建进程号和路由名。这也是真实情况的实际操作。

[RX]ospf 3 router-id 1.1.1.1     //直接在系统模式下一条命令就可以创建ospf,进程代号3,ID是1.1.1.1

另一种情况就是我们在配置好的ospf之后,在进行改名操作。其实这是不建议的。当然为了说明OSPF的一个小特征这里我们还需要对以上的实验进行重新改名。

[R1]ospf 1 router-id 1.1.1.1        //直接改名,发现如下提示信息是,必须restart才可以生效
Info: The configuration succeeded. You need to restart the OSPF process to valid
ate the new router ID.
[R1]display ospf peer brief        //查看一下,发现id没有变化,说明真的没有生效OSPF Process 1 with Router ID 192.168.11.1Peer Statistic Information----------------------------------------------------------------------------Area Id          Interface                        Neighbor id      State    0.0.0.0          GigabitEthernet0/0/1             192.168.11.2     Full        ----------------------------------------------------------------------------
[R1]display current-configuration         //查看现状,发现已经设置进去了
#
ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 192.168.1.0 0.0.0.255 network 192.168.11.0 0.0.0.255 
#

这其实就是一个OSPF的稳定性的特征。因为OSPF是对比较大的一个内部网络所配置的,一旦发生数据变化,整个路由系统会重新计算占用带宽。所以配置好的不会在改变,除非重新启动设备或进程。我们可以对该进程进行重启。

<R1>reset ospf process             //在用户模式下reset
Warning: The OSPF process will be reset. Continue? [Y/N]:y
[R1]display ospf peer brief                 //查看邻居发现自身ID已经改变OSPF Process 1 with Router ID 1.1.1.1Peer Statistic Information----------------------------------------------------------------------------Area Id          Interface                        Neighbor id      State    0.0.0.0          GigabitEthernet0/0/1             192.168.11.2     Full        ----------------------------------------------------------------------------

注意:本实验对其他设备R2,R3同样进行改名为2.2.2.2和3.3.3.3 为了不弄混淆读者可以自行修改。此外,有些参数就是其字面意思,不做解释。

OSPF协议的报文参数信息

在这里插入图片描述
我们之前提到过的抓包查看OSPF包的信息,每隔十秒会发生一次HELLO包,且都是对组播地址发送的。由此可以知道,HELLO报文是检测邻居是否还存在的一个报文,且是周期性的探测。224.0.0.5是所有路由器配置OSPF后都会加入到这个组播地址当中。具体理论后面会解释。我们查看一下具体报文信息。
图一:IP报文
在这里插入图片描述
图二:OSPF报文头部信息
在这里插入图片描述
图三:hello包数据部分
10s间隔发生一次,优先级为1,死亡间隔40s,指定路由,备份路由器。活跃邻居。
在这里插入图片描述
图四:通过命令看接口数据包内容
在这里插入图片描述
以上内容的图应该需要熟悉。而且这里注意我们仅仅只是分析了hello包。通过这些信息并且手动实验可以得出一些创建邻居的影响因素(就是hello报文的兼容因素)。下面的结论部分不给出论证,读者应该记住以下结论。建议自己手动验证,或者熟悉之后再回头验证。
1.一个网络中Router ID 不能一致。
2.区域必须一样(前面提高过,区域是面对接口的网段的)
3.认证必须一致
4.子网掩码必须一致。【多设备情况下】
5.hello发送间隔计时器和dead计时器必须一致。(给出验证R1)
6.Priority 不能全为零。[多设备情况下】(下节具体解释)

[R1-GigabitEthernet0/0/1]ospf timer hello 9        //更改
[R1-GigabitEthernet0/0/1]display ospf brief            //查看发现timers和Dead都发生变化Timers: Hello 9 , Dead 36 , Poll  120 , Retransmit 5 , Transmit Delay 1 
[R1-GigabitEthernet0/0/1]display ospf peer brief       //以没有邻居表OSPF Process 1 with Router ID 1.1.1.1Peer Statistic Information----------------------------------------------------------------------------Area Id          Interface                        Neighbor id      State    ----------------------------------------------------------------------------

DR和BRD

刚刚我们知道hello包的数据有个信息字段是priority,默认都是1。实际上它是一种选举BR和DBR的重要参数。这样先铭记一下,上一节在影响因素后面添加了广播模式下。
先看看我们实验图的R1和R2互联的11.0网段的两个接口。
在这里插入图片描述
在这里插入图片描述
注意到其一个是DR,一个是BDR。模式都是广播。注意我们的实验图一个网段连着两个接口哦。
刚刚有提到,只要多设备情况下,一个网段内,必有DR

看上两个图,注意到下面又两个数据信息,上面是DR,下面BDR。翻译过来是指定路由器和备份指定路由器。但是有没有发现我们的ID是1.1.1.1或者其他已经改掉了。但是显示确是接口ip,说明DR和BDR指的是某个接口,并不是路由器。

另外我们发现边上的类型是broadcast,译为广播。那么我们将类型改变看看。下面给出R2,对R1的11.0网段接口也要配置一样。

[R2-GigabitEthernet0/0/1]ospf network-type p2p
[R2]dis ospf interface GigabitEthernet 0/0/1OSPF Process 1 with Router ID 2.2.2.2Interfaces Interface: 192.168.11.2 (GigabitEthernet0/0/1) --> 192.168.11.1Cost: 1       State: P-2-P     Type: P2P       MTU: 1500  Timers: Hello 10 , Dead 40 , Poll  120 , Retransmit 5 , Transmit Delay 1 

发现并没有了DR和BDR。那么这两个东西又有什么用呢?
我们解释一下P2P,就是点到点,这个模式告诉路由器的该接口,我只和一台路由设备接口相连,那我进行数据库备份的时候给他好了。那么若模式不是P2P,是其他的一个网段有很很多设备相连,你甚至不知道谁和谁是邻居关系。这样一来进行邻居数据库备份的时候会发生一个严重的问题,那就是浪费非常多的链路资源,非常混乱的备份状态。广播模式下就是多台路由设备进行设置的模式类型。
(这里要注意,我们链路图就两台机子,为什么还可以广播模式呢?记住,这个模式是人为设置的,你设定是广播,路由器就认为在这个网段有多台路由设备!)
在这里插入图片描述
多设备情况下,为了让该网段的路由设备间的数据库备份更加合理和提高效率。就需要指定一个DR和BDR(强调!是接口),DR和BDR是和该网段的所有设备连接。举个例子,一个网段中有20台设备,那么18个设备是其他设备(DRother)。这18个设备必须和DR和BDR互联,这样邻居备份数据库所有设备只需要和DR互相备份就好,同时抄副本发送给BDR。DR接受到其中一个非DR的更新信息,就会广播出去到所有的非DR上,很大程度上提高了效率。BDR和DR一样看的到链路上所有的情况,但是不会做出任何回应。仅仅在DR设备出故障无法正常工作,BDR会升级成DR,代替他的工作。这里先说明一下,原DR坏了。BDR会进化为DR,其他设备会再次选一个BDR出来。哪怕原DR回来了,也只能是DRother了。(再次说明OSPF稳定性)

以上也说明了,一个网段内若存在多设备情况下,必有DR。当然我们的priority参数还没有解释。这个其实就是DR和BDR的选举优先级了。优先级最高会被所有设备选举为DR,其次BDR。默认priority是1,那么就是比较ID或者ip大小了。一般情况下还是会手动设置DR和BDR的。所以说在多设备下是不能全为0的。不然就会进入一直2-way的状态,一直在协商。也是说优先级为0是不能参加选举的。

还有一点。我们抓包有发现一个地址。224.0.0.5 。这个地址是所有DRother的加入组,所以领导层发送是向这个地址发送的广播数据。那么还有一个地址是224.0.0.6。 这个地址是领导层所加入的地址,非领导层设备发送是向这个地址发送的。

在OSPF中其实对多设备情况下专业的说法是,“特殊情况下”。

何为特殊情况?
-当一个网段中,存在多个路由器的时候,
这种情况,就是所谓的“特殊情况”。

-如何来判断一个网段/链路是不是处于特情况下?
答:
OSPF 是基于一个链路的网络类型来进行判断的。
当网络类型为:
广播 -broadcast(MA:multi-access:多链路访问网络)
非广播 -NBMA (non-broadcast multi-access)的时候,就会认为该链路正在处于“特殊情况”;

注意:
@ DR/BDR具有“稳定性/不可抢占”的特点,即一旦确定,就无法改变,除非再次进行选举。
@ DR 是一个接口的概念,不是路由器的概念。

DR的作用是什么?
为了提高同一个网段中的多个路由器之间的
数据库同步效率的。

DR 是什么阶段选举出来的?
在two-way 状态进行 DR 的选举;

DR是如何选举出来的?
#选举对象是谁?
-优先级不为0的设备,才有资格参与竞选;
#选举规则是什么?
1.首先比较优先级,越大越好;默认是1;
2.其次比较router-id,越大越好;

以上内容有点不好解释,但是其实也不复杂。有机会可以动手试试。暂时我就不动手了。到时候看看有机会在加实验图。

更详细内容可以看下一篇博文