首页 > 代码库 > 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的七种状态机