首页 > 编程知识 正文

ospf状态迁移,ospf状态迁移有哪些

时间:2023-05-06 03:18:37 阅读:239681 作者:4277

上图是OSPF的hello报文,对于每个OSPF的协议包都有相同格式的包头,对于hello包中的内容字段,记录了许多信息,比如DR和BDR的IP地址,以及该路由器的邻居的路由ID,还有该路由器是否是参与选举的。一开始的时候,hello包中的指定路由器和备份指定路由器字段是空的,同样的邻居字段也是空的,当发送hello包的路由器接收到某个其他路由器的hello包的时候,会进行状态的改变,从down到init状态,同理,只要有路由器在没有任何邻居的情况下收到其他路由器的hello包的时候,就会从down状态转换为init状态,在状态转换为init后,它会将邻居的route ID记录在hello包中的邻居字段并回送出去,请注意在刚开始的hello包的交互中,他们的指定路由器和备份路由器的字段内容全部都是空,当路由器接收到某个hello包中发现自己的router id在这个hello包,就会进入two-way状态,意味着邻居之间是相互发现的。但是这个时候hello包中的指定路由器和备份指定路由器字段依然是空。但是邻居字段以及有了补充。

当路由器两端都进入two-way状态后,会进入exstart状态,进入DD数据包的交互,虽然

DD包的主要认为是为了携带LSA的信息,但是在一开始它的作用是选举DR和DBR,我们知道在OSPF的头部中是记录自己的路由器ID的,所以将DD报文发送给邻居就能知道谁的优先级更高,谁是DR,在这个阶段有三个位是会发生变化,它们分别是“I,M,MS”,分别代表着初始,还有更多,主人位,一开始这三个位都是1,当使用DD报文选举出DR和BDR以及other的后,init就固定位0,同时MS主人位也随着各个路由器的身份而固定,当DD描述自身的LSDB结束后,其M位就会设置为0,而当DD描述完LSDB后,就会进入下一阶段,loading状态。

 LSR的报文如上图所示,上面的链路状态类型指明了这个是一个路由LSA,网络LSA还是其他什么LSA,然后后面的链路状态ID和通告路由器就是LSA里面的内容。通常一个LSA可能会有多种类型,类型也许会重复,但是加上链路状态类型和链路状态ID之后,其就能唯一的标识一个LSA,由此就可以识别其申请的LSA是哪一个是路由LSA还是网络LSA,是哪个路由器的路由LSA和哪个网络的网络LSA。

下面是LSA的头部:

上图是LSU的报文格式,它格式不算复杂,OSPF的报文头部加上LSA的个数和LSA内容。当LSR请求的需求到达目的路由器后,他就会从LSDB中将对于的LSA封装到这个LSU中的LSA字段上,然后发送回去。当DD报文中缺少的LSA的内容都申请到后,就进入了FULL状态。

注意每次路由器接收到一个LSU就要回送一个LSAck报文。

上面是LsAck报文的格式,它里面包含着确认的LSA的头部信息。可以对已经接收到的LSA进行一个确认。 

OSPF的LSDB

这里我仅描述单区域情况下的LSA组成的LSDB。

如果是单区域的OSPF的LSDB,那么它的LSBD只会存在两种类型的LSA:

1、路由LSA

2、网络LSA

路由器LSA有多个,该单区域上有几个路由器到最后收敛的LSDB就有几个路由器LSA。

网络LSA也有多个,该区域上有几个网段,就有几个网络LSA。

那么如何根据这两种LSA组成的信息去还原一个网络拓扑呢?
我们首先来看路由器LSA的内容:

在单区域这种我们关注的LSA内容放在上面几块内容,首先是链路状态类型,这个标志着该LSA的大类型,是路由LSA还是网络LSA,还是其他的LSA。然后就是链路数量,里面标识着该发送该路由LSA的路由器直连的链路的个数,然后就是链路ID和链路数据,这个内容根据具体情况而定如下图所示: 

 

路由器LSA根据这种规则去填补上面的链路类型,链路ID和链路数据,这三个字段。假如一个路由器上接入多条链路,那么将会出现多个下面的字段,填充在路由器LSA种:

在单区域种一般LSA种的链路类型会出现两种,一种是transmit另一种是stub,当路由器连接的链路是没有与其他路由器建立任何的邻居关系,则它是一个stub的链路类型,如果路由器的链路与其他路由器的接口建立了邻居关系,那么他就是一个transmit的链路类型。于是我们就可以根据这个链路类型去填入路由器LSA种的链路ID和链路数据。

一开始我看到这里时懵逼的,因为为什么要这样去填充路由器LSA包的内容,但是当我看到收敛的LSDB后就似乎有点明白了,看下图的拓扑:

上面是一个使用所有路由器接口都使用了OSPF的拓扑和它收敛后的LSDB ,我们可以看见两种类型的LSA刚好抽象的描述了整个网络的大概情况,该区域总共有三个路由器,一个多点接入的网段。

我个人认为对于多点接入的网络来说我们不仅仅需要知道每个路由器的个数以及对于的标识,还需要知道它们在接入多点接入的网络的接口IP是多少。所以为了获取到整个多点接入网络的路由器的个数,由于DR是能够与其他所有other路由器建立邻居关系的路由器,所以它是能够知道某个多点接入网络的路由器数目以及对应的router id的,所以它将泛洪type-2 的LSA,去描述整个多点接入网络的路由器以及它们对应的标识和该多点接入网络的子网掩码。

同时仅仅知道个数还是不足够的,还需要type-1LSA的帮助,每个路由器都会将自身直连的链路的信息放入type-LSA中的LSA字段,一个路由器LSA中可能会存在多个链路信息,可能有stub网络和Transmi的链路。下面是上图收敛后的LSDB中的路由器LSA的信息和网络LSA的信息

 这样有了整体的数量和标识,以及各个单点路由器上的链路信息,我们就可以还原出一份宏观的网络拓扑图。

比如我们根据上面的路由器LSA和网络LSA去还原这个网络。

我们从任意一个路由器开始,比如从route id为1.1.1.1的路由器开始,

我们先观察route id为1.1.1.1的路由器LSA,如下图:

 我们发现

该路由器直连的链路有两条,一条是末梢网络,它的网络地址是192.168.1.0,掩码是255.255.255.0.还有一条是接入多点网络中的,它接入到多点网络的接口IP是10.0.1.1,该多点网络中的DR的接口IP是10.0.1.2,可以发现任意一个路由器LSA都是包含其DR的接口IP的,而type-2的LSA的链路ID为产生该网络LSA的接口IP,也就是DR的接口IP,所以我们就可以根据DR的接口ip去LSDB中搜索DR的接口IP为10.0.1.2的网络LSA,对应的网络LSA信息如下:

 

于是我们可以作出一个大概的网络拓扑如下图:

我们发现与route id为1.1.1.1互为邻居关系的路由器有两个一个2.2.2.2和3.3.3.3,那么我们值需要进一步查看它们的路由器LSA之后我们就知道能够是DR,经过查询我们发现DR为2.2.2.2的路由器,如下图所示:

 当我们知道DR的接口IP为10.0.1.2的多点网络的DR是2.2.2.2的路由器,而这个路由器和1.1.1.1的路由器建立了对应的邻居关系,那么我们就知道2.2.2.2路由器和1.1.1.1的路由器必定是在同一个网段的,但是我们还需要注意的是,根据网络LSA提供信息,该多点网络中是有三个路由器的,所以不仅仅是简单的两个路由器互相连接,而是有一个交换机在中间做了多点网络的拓展。所以根据多样的3.3.3.3的路由器LSA我们就能够知道对应的网络拓扑应该是下面这样的。

 因为每条链路都是G口,所以COST都是1,所以每个路由器LSA中记录的COST都是1。那么现在问题来了,我们是如何形成去往192.168.0.0或者192.168.1.0网段的路由条目呢?

我们可以从对应的路由器LSA中获取,比如1.1.1.1路由器记录的去往192.168.1.0网段的COST是1,然后去往多点网络的COST也是1,那么在其他路由器上就会知道去往192.168.1.0为2.

经过上面的草图拓扑和真实拓扑的比对,我们发现中间如果夹着了两个交换机对多点网络进行拓展,但是最终结果只被视为仅有一台交换机进行拓展。

最后的总结:

在单区域中,路由器LSA就像一个拥有多条链路的圆形组件,如果要将它做一个比喻的话,我的抽象是下面这样的:

 它就像一个充满管道的组件,而网络LSA就像是一个说明,它说明了有多少个组件,以及这些组件对应的连接点在哪里,于是在它们的合作下,就组成了对应的网络拓扑。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。