OSPF原理概述补充文章
祝愿各位都能赚大钱
前言
OSPF 和ISIS一样都是链路状态协议,OSPF和ISIS是有着共同之处的。他们传递的都是自身特殊格式而形成的链路状态信息,这不能被ACL所抓取到,他们都是有区域划分,都有虚节点。OSPF主要搞清楚他6个LSA,邻居状态过程,基本上就OK了,不难的。
1、邻接建立及握手过程
1.1 概述
待补充
1.2 OSPF报文头部
OSPF封装于IP层,协议号89。OSPF分为五个报文:HELLO、DD、LSR、LSU和LSAck。五种报文具有相同的报文头格式,长度为24字节。
![](https://i-blog.csdnimg.cn/blog_migrate/722a4ce1b258011873a38f44eedbbdf7.png)
图:OSPF报文头部
OSPF头部长度24 Byte,字段讲解如下:
字段 |
含义 |
version |
版本号,目前OSPF版本号为2 |
Message Type |
消息类型,Hello为1,DD为2,LSR为3,LSU为4 LSA为5 |
Packet Leng |
OSPF长度,包括OSPF头部字段 |
Sou OSPF Route |
发送报文的OSPF路由器标识 |
Area |
区域ID |
Check |
校验和 |
Authe Type/Data |
认证类型和认证数据 |
1.3 网络类型及不同类型间建立邻居
OSPF接口根据链路类型可分成四种网络类型:
Point-to-point networks:当链路层协议为PPP、HDLC和帧中继(仅P2P类型子接口)时。缺省OSPF认为是P2P点到点网络
broadcast networks:当链路层协议为Ethernet时。缺省OSPF认为是Broadcast广播网络
NotBroadcast Multi-Access Networks:当链路层协议为帧中继和ATM时。缺省OSPF认为是NMBA
Point-to-Multipoint networks:无缺省认为,只会被强制修改成该类型。常见为将非全连通的NMBA修改成P2MP形式
不同的网络类型,可使OSPF按不同的方式来工作,具体如下:
网络类型 |
报文的发送 |
广播类型 |
组播发送HELLO、LSU和LSAck,单播发送DD和LSR |
P2MP |
组播发送HELLO,单播发送其他 |
NMBA |
全单播 |
P2P |
全组播 |
说明: LSAck报文在做回应时,对于接收到的LSU报文,若LSU报文为单播,则单播回复,LSU为组播,则组播回复。且采用组播回复时,若自身为DRother,那么目的地址为224.0.0.6。为DR和BDR或点到点类型网络,则为224.0.0.5。
不同的接口网络类型的邻居间时可以正常建立邻居关系的,但需要注意的时Hello/Dead时间需要相同。具体不同邻居之间的建立,如下所示:
网络类型 |
邻居关系 |
邻接 |
路由计算 |
NMBA+其他类型 |
不可以 |
- |
- |
P2MP+广播 |
调整时间间隔后可以 |
可以 |
无法计算出对方路由 |
P2MP+P2P |
可以 |
可以 |
可以 |
P2P+广播 |
可以 |
可以 |
无法计算出对方路由 |
说明: P2P和P2MP对广播可以建立邻接关系,可以进行LSDB数据库同步,但是在路由的计算上无法形成,这是由于画逻辑拓扑时,广播类型需要连接到虚节点,但P2P网络需要和邻居节点直连,所以在逻辑拓扑上,二者无法连接到一起,这就导致了计算路由时,互相都无法计算出各自节点后面的路由。
1.4 邻居建立过程
OSPF通过hello报文来发现和维护邻居关系,邻居关系不同于邻接,邻居给关系是指达到2-way状态,在2way状态之后,是邻接关系。
hello报文在不同的网络类型的接口上,发送间隔与目的地址不同。
在广播和点到点网路中,hello是每10秒发送一次,在NMBA和P2MP中,每30秒发送一次。dead时间为4倍的hello时间
在广播、P2P和P2MP中,OSPF通过组播的HELLO自动发现邻居,目的地址是224.0.0.5(所有OSPF路由器)而在NBMA网络中,需要手工指定邻居。
说明:目前网络大多都是以太网,也就是网络类型为Broadcast,而PPP/HDLC/帧中继,P2P子接口则被看成P2P类型网络。非广播的帧中继。X.25和ATM等可以配置成NBMA和P2MP网络类型。
在建立邻居关系是时,双方路由器互相发送HELLO报文,以下参数必须匹配才能够形成邻居,否则丢弃。
hello/dead时间一致
直连路由器Router-ID无冲突
区域ID一致
区域类型相同 (options字段相同)
认证类型和密钥一致
![](https://i-blog.csdnimg.cn/blog_migrate/0efb91d3afb819544ed226ecbdff8f99.png)
图:Hello报文
OSPF共有八种状态,分别是:Down、Attempt、Init、2-Way、Exstat、Exchange、Loading和Full。
邻居关系的建立是为了保证OSPF路由器间的双向邻居成功建立。邻居关系的状态由Down到Attmpt到Init到2-WAY
Down,邻居会话初始阶段,邻居的RID未存在自身的邻居列表里。
Attmpt,NBMA中存在,表明对端在邻居失效时间超时后仍然没有回复hello。此时依旧向对端发送hello
Init,收到邻居发来的hello且该hello中的Active Nei字段未包含自身路由器的R-ID,则将邻居状态置位INIT
2-WAY,再次收到邻居发来的hello且hello中的Active Nei字段中包含自身的R-ID,则将邻居状态置位2-WAY
此时开始就是邻接状态了,需要注意的是,在广播和非广播中,邻接关系在DR/BRR选择完成之后。
Router-ID建立过程:
每台OSPF路由器都需要配置一个Router-ID来标识自身,Router-id有以下方法形成
1、手工配置Router-ID
2、自动选择设备中活跃的最大地址的环回接口,若不存在环回接口,则选择活跃物理接口中地址最大的。
1.5 邻接建立过程
邻接关系的建立是邻居路由器间为完成同步而发生的LSA交互过程,也是邻居路由器间初次通告LSA,快速同步的过程。同步完成后,最终是FULL状态。邻接关系的状态由Exstart到Exchange到Loading到FULL最终状态。
说明: 广播和非广播情况下(即需要选择DR/BDR的情况下)Drother之间会一致保持在2-WAY状态,Drother同DR/BDR是FULL状态。
![](https://i-blog.csdnimg.cn/blog_migrate/4fc4c7b7c42a4badcd505a48ec2b5ffd.png)
**信息交换初始状态ExStart:**在该状态下,本地和邻居路由器互传空DD报文。ExStart作用:
确定主从关系
确定DD的初始序列号
比较接口MTU(可选)
在该状态下,路由器互相发送空DD报文中 I(Initalize),M(More)及MS(Master/Salve)位。
I位,初始化位,仅头两份DD报文中置位,代表同步过程开始。
M位,More更多,如果M=0,则代表后续DD报文中无LSA Summary要传递。任何一方M位不置为0,Master就要继续发送DD报文,Slave收到之后,不论是否还有LSA Summary要传递,都要回应DD报文。
初始双方都认为自身是Master,所有M/S均置位,双方收到对方的DD报文,RID高者成为Master,此后过程中,M/S会一直置位,Master会一直发送DD报文,Slave一直会回应DD报文,Slave回应的DD报文是对Master发送的DD报文的确认。此过程持续到双方的LSA头部交换完成。
**说明:**由于Exstart未开启MTU比较,所以报文中的MTU值默认为0,即不比较。
信息交换状态ExChange:
选举完Master后,Slave路由器主动向Master回送DD报文,其中包含LSDB的LSA头(LSA Summary)列表,Slave发送的DD中,Seq序列号采用Master发过来时的序列号。Master也会把自身的头列表用DD发送,同时Seq+1,Slave设备收到了,会用相同序列号,来做回应。
任何一侧只要还有未传递完的LSA 头,M位就还是置位,Master就一定会产生DD报文来让Slave回应
Slave:选举完Master后,Slave主动向Master会送DD报文,Seq采用Master相同的
Master:每次发DD都会seq+1,根据收到的DD是否和自己发送的DDseq相同来判断是否DD回送正常
此时LSDB同步完成后,将会进入Loading状态,并且收到DD的路由器会和自己的链路状态数据库作对比,确定需要哪些LSA的完整信息,就会发送LSR请求给邻居。
**信息加载状态Loading:**在这一状态下,本地路由器会继续向它的邻居路由器发送链路状态请求数据包LSR,以请求本地LSDB中没有的完整的LSA。收到LSR的报文,路由器会用包含完整的被请求的LSA的LSU做回应。
请求方收到LSU后,如果无误,则采用LSAck确认该LSU。一份LSAck可同时为多份LSU做确认。所有确认的都完成,就进入FULL状态,至此,LSA同步过程完毕,邻居状态成为FULL
总结:
1、Down:邻居会话的初始阶段,
2、Attempt