OSPF详解

November 11, 2024 作者: breezecloud 分类: 浏览: 49 评论: 0

OSPF的定义

Open Shortest Path First 开放最短路径优先
IGP协议,基于链路状态特征,工作在IP层,协议号89
需要了解的点:
引入到OSPF的外部路由优先级默认为150这里指通过5、7类LAS计算出来的
OSPF区域内部优先级默认为10这里指通过1、2、3类LAS计算出来的

OSPF的特点

  • 没有跳数限制
  • 使用组播更新变化的路由和网络信息
  • 路由收敛较快
  • 以开销(cost)值作为度量
  • 采用SPF算法,避免路由环路
  • 在互联网上大量使用,最广泛的IGP路由协议

OSPF的三张表

邻居表拓扑表路由表

邻居表

记录邻居之间的状态和关系
OSPF 协议的路由器以组播方式(目的地址 224.0.0.5)发送 Hello 报文 来发现邻居
华三交换机可以使用如下命令查看邻居表

display ospf peer

拓扑表

链路状态数据库LSDB
记录着所有LSA的详细信息
华三交换机可以使用如下命令查看邻居表

display ospf lsdb

路由表

记录通过SPF计算后的路由
华三交换机可以使用如下命令查看邻居表

display ospf routing

OSPF区域概念

OSPF中有2个区域类型
骨干区域和非骨干区域

1731482729323.png

整OSPF区域中只能有一个骨干区域,一般是Area0
非骨干区域必须连接到骨干区域,非骨干区域之间互通必须经过骨干区域
与骨干区域相连是为了避免出现域间路由环路
划分区域的优势:

1731482866479.png

OSPF路由器类型

一共有4种路由器角色区域内路由器(IR)骨干路由器(BR)区域边界路由器(ABR)自治系统边界路由器(ASBR)

1731311631809.png

区域内路由器

也叫IR
所有接口都在同一区域

骨干路由器

也叫BR
有接口在骨干区域

区域边界路由

也叫ABR
连接骨干区域和非骨干区域

自治系统边界路由器

也叫ASBR
连接外部自治系统,并引入外部路由

OSPF的Router-id

一台路由要运行OSPF就必须要有Router-id(RID)
RID可以通过手动配置,也可以通过自动生成
优选Loopback接口中IP最大的地址作为RID,其次选择所有已经配置了的IP地址中选取最大的作为RID
RID不考虑该IP接口up/down情况

选举图

OSPF的网络类型

OSPF根据链路层协议类型将网络分为不同的类型
不同网络类型之间,DR、BDR选举,LSA细节,协议发送的形式也会有所不同
总的分为一下4种类型:BroadcastNBMAP2MPP2P

Broadcast(广播型)

当链路层协议是Ethernet、FDDI时,OSPF默认认为该网络类型为Broadcast
该网络类型的特点是:
组播发送协议报文224.0.0.5(所有运行了OSPF的接口都会监听,Dr Other)224.0.0.6(所有DR/BDR都会监听)
需要选举DR/BDR
Hello Time:10秒
Dead Time:40秒(4倍Hello Time)

NBMA(非广播多点可达)

现在基本没有用这个了
一般用在帧中继、ATM、X.25网络中时,OSPF会识别该网络类型为NBMA(Non-Broadcast Multi-Access)
该网络类型的特点是:
单播发送协议报文
需要选举DR/BDR
Hello Time:30秒
Dead Time:120秒(4倍Hello Time)

P2MP(点到多点)

点到多点,这个网络类型,只能由手动更改而来
该网络类型的特点是:
通过模拟组播发送协议报文,可以自动发现邻居
不选举DR/BDR
Hello Time:30秒
Dead Time:120秒(4倍Hello Time)

P2P(点到点)

当链路层协议是PPP的时候,OSPF会识别该网络类型为P2P
该网络类型的特点是:
组播发送协议报文(只有224.0.0.5)
不选举DR/BDR
Hello Time:10秒
Dead Time:40秒(4倍Hello Time)

OSPF的报文类型

在OSPF中有如下几种报文:HelloDDLSRLSULSACK

  • Hello报文用于建立邻居
  • DD报文用于数据库描述
  • LSR报文用于链路状态请求
  • LSU报文用于链路状态更新
  • LSACK用于链路状态更新确认

1731482957298.png

如果超过了Dead Time没收到Hello报文,则认为邻居失效

OSPF中DR和BDR的选举

1731483937345.png

在广播和NBMA网络中,如果不选举DR和BDR,则所有的路由器都会与对端建立邻接关系,形成全互联状,这样会导致大量的更新泛滥,占用大量的带宽资源,于是引入了DR和BDR的概念
这里要注意一下在 OSPF 中,邻居(Neighbor)和邻接(Adjacency)是两个不同的概念
DR(Designated Router)简称指定路由器
BDR(Backup Designated Router)为指定路由器的备份
DR失效则BDR成为新的DR,再重新选举新的BDR
采用DR/BDR建立邻接关系,可以降低需要维护的邻接关系数量

选举流程

  • 优先级大的优先(默认优先级都是1)
  • 其次选Router-id大的优先
  • 如果有更优先的路由加入该OSFP网络中,也不会影响当前所选举的DR和BDR,保持一个稳定原则

1731485542493.png

就如上图所示,一个高优先级的路由器加入到原有的OSPF网络中,并不会引起新的DR和BDR选举,而是成为Dr Other

OSPF初始化流程

简单来说有4个流程
建立邻居关系、建立邻接关系、交换LSA路由信息,链路状态数据库收敛同步、根据本机链路状态数据库计算到达最优网段的路由,并写入路由表

建立邻居

启动OSPF进程的时候,就会通过224.0.0.5组播地址发送Hello报文去发现,和建立邻居
建立邻居的前提是:

  • 接口UP
  • 双方接口都在同一网段
  • 双方接口都在同一区域

建立邻接

建立邻居之后,会进行DR/BDR的关系选举
选举DR和BDR是让广播网络中路由交换信息更加高速有序
选举的范围是每条广播链路选举一个DR和BDR
关系状态分析

  • DR和BDR建立邻接关系
  • DR Other与DR建立邻接关系
  • DR Other与BDR建立邻接关系
  • DR Other与DR Other之间建立邻居关系

链路状态数据库同步

邻接关系建立完成之后,就对自己的链路状态数据库(LSDB)进行同步
具体流程如下:

  1. 先是向邻接路由器发送DD报文,通告本地LSDB中所有LSA的摘要信息
  2. 收到DD报文后,对比自身LSDB中是否有缺失部分LSA,如果有缺失则向对方发送LSR请求缺失部分的LSA摘要
  3. 收到请求方发来的LSR之后,将所需的详细LSA摘要信息,打包以LSU报文发送给请求方
  4. 收到LSU之后更新LSDB后,向被请求方发送一条LSACK进行确认
  • LSA 用来描述路由器的接口、路由器目的地址的相关信息
  • LSDB中存储着本地所有的LSA

路由表更新

最后根据本地的LSDB数据库,将计算过后到达各目的网段最优的路由加入到全局路由表中

OSPF邻接关系建立流程详解

邻居连接的过程

1731936339185.png

如上图所示,在刚启用OSPF的时候,两台路由器都处于Down状态
当他们开始交互Hello报文时,进入下一个阶段,整体步骤如下:

【1】 首先RTA先发送Hello报文(里面携带了自己的Router-id,自己的IP,邻居的IP等等),由于自己的邻居表内当前还没有发现邻居,会将报文里面的Neighbors seen置位为0并且当前还没有进行DR和BDR的选举于是设置DR为0.0.0.0
【2】 接着RTB收到RTA发送的Hello报文后,首先对比收到的Hello报文中的Router-id,发现RTB自己的要大些,于是将Hello报文中的DR字段设置成自己,并且Neighbor seen字段设置成RTA,发现了RTA这个邻居,并且将邻居状态置位为Init状态随后再发送给RTA
【3】 紧接着RTA收到新的Hello报文后,发现邻居表内有自己,于是邻居状态进入2-way状态并且将RTB加入到自身的邻居表内,并将DR字段设置成RTB,随后再发送给RTB
【4】 RTB收到之后,发现A发过来的邻居表内有自己,于是将邻居状态置位为2-way,将RTA并入自己邻居表内
注意,如果RTA和RTB都是DRother路由器的话,那么他们的状态就会一直停留在2-way状态,如果处于DR/BDR状态,则进入下一阶段邻接建立(Full)

邻接建立的流程

1732174541750.png

如上图所示,建立好邻居关系后,处于2-way状态接下来进行下一步,邻接建立
【5】 接下来就开始交互DD报文首先邻居状态会转入Exstart状态紧接着会发送一个不携带摘要信息的DD报文给对端,来协商主从关系,其中在DD报文中Seq=x,I=1,M=1,MS=1具体的含义表示如下:

  1. Seq是发送报文的序列号
  2. I位标识是由谁发起的初始化DD报文,第一个发起的置位为1
  3. M位标识这个DD报文是否是最后一个报文,置位1表示后续还有,置位0则是最后一个DD报文
  4. MS位标识Master是谁,置为1表示Master是当前发送DD报文的这个路由器,置为0表示Slave路由器

随后将该DD报文发送给RTB
【6】 RTB收到之后,也将邻居状态转为Exstart状态对比信息发现,自己的Router-id比RTA要大,于是将MS置为为1,seq置位为本端发起的编号,I位和M位同样置位为1
【7】 RTA收到后,确认了RTB的Master身份,于是将自己的MS位、I位、置为为0,表明自己是Slave路由器,将Seq序列号更新为RTB发起的序列号,并且将邻居状态更新到Exchange状态,这时从RTA发送的DD报文里面就包含了LSA摘要信息
【8】 RTB收到后,也将自己的邻居状态修改为Exchange状态,并且更新squ序列号+1,发给RTA交换DD摘要信息,收到从RTA发送的摘要信息发现自己的LSDB数据库都有相应的LSA摘要,于是直接进入Full状态。

1732177145492.png

【9】 RTA收到的DD报文比较自己的LSDB数据库发现自己LSA有缺失部分,并不是完整的,于是进入下一个交互阶段,请求缺失的LSA,先将RTB的邻居状态置为为Loading状态向RTB发送LSR(LS Request)报文请求自己缺失的LSA部分
【10】 RTB收到来自RTA的LSR请求后,将请求的 LSA 全部内容以一条或者多条 LSU (LS Update)报文发送给 RTA
【11】 RTA收到后,对自己的LSDB数据库进行更新,随后发送一个LSAck报文给RTB,确认收到该更新,最终将RTB的邻居状态置为为Full状态完成邻接建立,LSDB数据库同步

状态机

1732177799774.png

要注意的是,在OSPF中,Down2-WayFull是处于一个稳定状态,正常情况下,DR/BDR和Drother之间是处于Full稳定状态, Drother之间是处于2-way的稳定状态
其余阶段都属于瞬时肯能会变化的一个状态
关于这几个状态的解释如下图所示:

1732177927621.png

LSDB的更新流程


评论