OSPF(1)

简述OSPF

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

我先拿拓扑图操作一下。
先将如下topology配置好各接口ip。注意,我们不要配路由,而且在配置完后检查一下接口ip配置是否正确已经直连方向能不能两两PING通。
OSPF(1)_第1张图片
配置完成之后我们在配置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         Interface

    192.168.2.0/24  OSPF    10   3           D   192.168.11.2    GigabitEthernet0/0/1
   192.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)_第2张图片
当然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(1)_第3张图片
OSPF具有自我计算路由的功能,我们通过具体命令来看看R1上的链路状态数据库。具体后面在介绍。

[R1]display ospf lsdb
	 OSPF Process 1 with Router ID 192.168.11.1
		 Link State Database 
		         Area: 0.0.0.0
 Type      LinkState ID    AdvRouter          Age  Len   Sequence   Metric
 Router    192.168.11.2    192.168.11.2      1314  48    8000000B       1
 Router    192.168.11.1    192.168.11.1      1303  48    8000000A       1
 Router    192.168.12.1    192.168.12.1      1636  48    80000006       1
 Network   192.168.11.2    192.168.11.2      1314  32    80000003       0
 Network   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.1
		  Peer 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是对比较大的一个内部网络所配置的,一旦发生数据变化,整个路由系统会重新计算占用带宽。所以配置好的不会在改变,除非重新启动设备或进程。我们可以对该进程进行重启。

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.1
		  Peer 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(1)_第4张图片
我们之前提到过的抓包查看OSPF包的信息,每隔十秒会发生一次HELLO包,且都是对组播地址发送的。由此可以知道,HELLO报文是检测邻居是否还存在的一个报文,且是周期性的探测。224.0.0.5是所有路由器配置OSPF后都会加入到这个组播地址当中。具体理论后面会解释。我们查看一下具体报文信息。
图一:IP报文
OSPF(1)_第5张图片
图二:OSPF报文头部信息
OSPF(1)_第6张图片
图三:hello包数据部分
10s间隔发生一次,优先级为1,死亡间隔40s,指定路由,备份路由器。活跃邻居。
OSPF(1)_第7张图片
图四:通过命令看接口数据包内容
OSPF(1)_第8张图片
以上内容的图应该需要熟悉。而且这里注意我们仅仅只是分析了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.1
		  Peer Statistic Information
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 ----------------------------------------------------------------------------

DR和BRD

刚刚我们知道hello包的数据有个信息字段是priority,默认都是1。实际上它是一种选举BR和DBR的重要参数。这样先铭记一下,上一节在影响因素后面添加了广播模式下。
先看看我们实验图的R1和R2互联的11.0网段的两个接口。
OSPF(1)_第9张图片
OSPF(1)_第10张图片
注意到其一个是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/1

	 OSPF Process 1 with Router ID 2.2.2.2
		 Interfaces 
 Interface: 192.168.11.2 (GigabitEthernet0/0/1) --> 192.168.11.1
 Cost: 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,是其他的一个网段有很很多设备相连,你甚至不知道谁和谁是邻居关系。这样一来进行邻居数据库备份的时候会发生一个严重的问题,那就是浪费非常多的链路资源,非常混乱的备份状态。广播模式下就是多台路由设备进行设置的模式类型。
(这里要注意,我们链路图就两台机子,为什么还可以广播模式呢?记住,这个模式是人为设置的,你设定是广播,路由器就认为在这个网段有多台路由设备!)
OSPF(1)_第11张图片
多设备情况下,为了让该网段的路由设备间的数据库备份更加合理和提高效率。就需要指定一个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,越大越好;

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

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

你可能感兴趣的:(网络运维)