首页 > 代码库 > OSPF的七种状态机

OSPF的七种状态机

Router ID:在一个OSPF域内,用于标识每台路由器的ID。

选举规则:

1.手工指定(建议)

2.如果没有手工指定,使用Loopback接口中最大的IP地址作为Router ID

3.如果没有配置Loopback接口,那么使用物理接口中最大的IP地址作为Router ID


链路状态信息

链路信息包括有:

1.链路的类型

2.接口IP地址和掩码

3,链路上所连接的邻居路由器

4.链路的带宽(开销)


Hello报文:

作用:发现建立并维护邻居关系

OSPF内的路由器在交换链路状态信息时,首先需要建立一个邻居关系,这个关系是通过Hello报文实现的。邻居关系建立之后,Hello报文周期性的发送以实现邻居保持的功能,如果在一定的时间内没有收到Hello报文,则会中断邻居关系。

OSPF邻居建立的过程

状态含义:

Down:没有启用OSPF的状态;邻居失效后变为该状态

Init:初始化状态,第一次收到对端发来的hello包(包含对端route-id)时,将对端的状态设置为init

2-way:邻居状态,相互间周期发送hello的状态(双方建立会话)

Exstart:交换信息的初始化状态

发送DBD(包含本地的LSA的摘要信息)报文,选举主从路由器(利用HELLO报文中的ID和优先权来进行选举,不允许抢占,DR没了,DBDR才能上)

Exchange:交换信息的状态

该状态下,相互间发送DBD,告知对端本地所有的LSA的目录;同时,可以发送 LSR,LSU,LSACK来学习对端的LSA

Loading:加载状态(没有学习完的状态)

发送LSR,LSU,LSACK,专门学习对端的LSA的详细信息

Full:邻接状态(学习完的状态)

彼此的LSDB同步,即所有的LSA相同


成为邻居的6个条件:

1.RID不同

2.特殊区域的flag字段相同

3..子网掩码相同

4.验证相同

5.区域号相同

6.hello/dead相同

邻居建立如下:

1.RTA和RTB的Router ID分别为1.1.1.1和2.2.2.2。RTA启动OSPF后,RTA会发送第一个Hello报文(以组播的方式发送,目的地址为224.0.0.5),此时状态为Down,RTB收到RTA的Hello报文后,状态置为init

技术分享

上图是RTA首次发送一个Heloo报文。需要主要的是,首次发送hello包的时候不包括邻居字段,包的长度为44。

2.RTB发送Hello报文,RTA收到RTB发送的报文之后,状态为Init

技术分享

3.RTB向RTA发送邻居列表为1.1.1.1的Hello报文,Hello报文发送三个周期(也有超过3个周期),RTA在收到RTB发来的报文邻居列表中发现自己的Router ID,而且匹配6个条件(建立邻居的6个条件)成功之后,状态为2-way,也称为邻居状态

技术分享

4.RTA向RTB发送邻居列表为2.2.2.2的hello报文,Hello报文发送三个周期(也有超过3个周期),RTB在收到hello报文邻居列表中发现自己的Router ID,而且匹配6个条件(建立邻居的6个条件)成功之后, 状态置为2-way,也称为邻居状态

技术分享

OSPF有多种类型的网络(p2p,broadcast,NBMA,P2MP)

首先说一下什么是MA网络:

MA网络就是 Multiaccess 多路访问网络,它分为两种: 一是Broadcast 广播,二是Nonbroadcast Multiacccess(NBMA)非广播的多路访问网络,MA网络在OSPF中需要选出DR和BDR,来减小LSA的泛滥。

broadcast(广播)

两台或者两台以上的路由器通过共享介质互联

支持广播,组播

Hello Interval时间为10s ,Dead Interval时间为40s,选举DR/BDR

NBMA(非广播多路访问):

Hello Interval时间为30s ,Dead Interval时间为120s

在NBMA网络内,因为NBMA默认不支持广播和组播,所以无法发送Hello包,邻居也就无法接受到信息,所以,在这个网络内,需要手工指定邻居,指定邻居之后才能支持DR/BDR。

P2P(点到点):

仅有2台路由器相连

支持广播和组播

Hello Interval时间为10s ,Dead Interval时间为40s,不选举DR/BDR就可以直接达到full状态

P2MP(点到多点):

Hello Interval时间为30s ,Dead Interval时间为120s

支持广播和组播

在P2P网络中,不选举DR/BDR,可以直接达到full状态

一个路由器的接口类型改为broadcast,另一个接口改为P2P,是否能通信呢

技术分享

技术分享

可以看出,他们已经建立起了邻居,建立邻居的条件还是那6个条件,他们都能满足,但是他们并不能传递路由,因为broadcast支持DR/BDR,P2P不支持DR/BDR。所以,在建立邻居关系的基础上,同有或者同无DR/BDR,可以传递路由。


发送第一个DBD报文,来协商主从关系

R1

技术分享

R2

技术分享

技术分享

上图的意思是:我是主,这不是我发的第一个报文,以后也没有更多的报文

技术分享

上图的意思是:我是从,这不是我发的第一个报文,以后也没有更多的报文

这样,DBD交互完成

PS:DBD报文间用序列号进行确认,主发送的序列号递增,从序列号跟主序列号是一样的,来进行确认。这是隐式确认。

收到对方发来的第一个DBD报文,就把对方的状态设成EXSTART。

在EXCHANGE状态下,就开始发送LSR,来请求LSA(请求本地没有的)

技术分享

接收到LSR的路由器,会返回一个LSU

技术分享

接收到LSU的路由器之后,不仅会发送LSU,还会发送一个LSACK确认

技术分享

当收到对方发来的LSU,并且更新了LSU后,如果学完了,直接进入full状态,如果没有学习完,则进入loading状态。

PS:判断OSPF有没有路由,就看他有没有LSA


1.Link-state Request 链路状态请求包 LSR 可靠

2.Link-state Update 链路状态更新包 LSU 可靠

3.Link-state Acknowledment 链路状态确认包 LSACK

如何去处理一个接收到的LSA?

如果没有,就把它放入LSDB当中,同时用LSACK确认,并且需要LSA的泛洪;通过SPF算法,去计算最优路由。

如果有,而且优于自己的LSA,就把他放入自己的LSDB,同时用LSACK确认,并且需要LSA的泛洪;通过SPF算法,去计算最优路由。

如果次于自己的LSA,OSPF就会把自己的LSA发送给对方,让对方去学习

如果他们接收到的LSA是一样的话,就会忽略掉。

本文出自 “costin” 博客,请务必保留此出处http://brighttime.blog.51cto.com/12837169/1955740

OSPF的七种状态机