OSPF详解
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个区域类型
骨干区
域和非骨干区域
整OSPF区域中只能有一个骨干区域,一般是Area0
非骨干区域必须连接到骨干区域,非骨干区域之间互通必须经过骨干区域
与骨干区域相连是为了避免出现域间路由环路
划分区域的优势:
OSPF路由器类型
一共有4种路由器角色区域内路由器(IR)
、骨干路由器(BR)
、区域边界路由器(ABR)
、自治系统边界路由器(ASBR)
区域内路由器
也叫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种类型:Broadcast
、NBMA
、P2MP
、P2P
。
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中有如下几种报文:Hello
、DD
、LSR
、LSU
、LSACK
- Hello报文用于建立邻居
- DD报文用于数据库描述
- LSR报文用于链路状态请求
- LSU报文用于链路状态更新
- LSACK用于链路状态更新确认
如果超过了Dead Time没收到Hello报文,则认为邻居失效
OSPF中DR和BDR的选举
在广播和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,保持一个稳定原则
就如上图所示,一个高优先级的路由器加入到原有的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)进行同步
具体流程如下:
- 先是向
邻接
路由器发送DD
报文,通告本地LSDB中所有LSA的摘要信息 - 收到DD报文后,对比自身LSDB中是否有缺失部分LSA,如果有缺失则向对方发送
LSR
请求缺失部分的LSA摘要 - 收到请求方发来的LSR之后,将所需的详细LSA摘要信息,打包以
LSU
报文发送给请求方 - 收到LSU之后更新LSDB后,向被请求方发送一条
LSACK
进行确认
- LSA 用来描述路由器的接口、路由器目的地址的相关信息
- LSDB中存储着本地所有的LSA
路由表更新
最后根据本地的LSDB数据库,将计算过后到达各目的网段最优的路由加入到全局路由表中
OSPF邻接关系建立流程详解
邻居连接的过程
如上图所示,在刚启用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)
邻接建立的流程
如上图所示,建立好邻居关系后,处于2-way状态
接下来进行下一步,邻接建立
【5】 接下来就开始交互DD报文
首先邻居状态会转入Exstart状态
紧接着会发送一个不携带摘要信息的DD报文给对端,来协商主从关系
,其中在DD报文中Seq=x,I=1,M=1,MS=1
具体的含义表示如下:
- Seq是发送报文的序列号
- I位标识是由谁发起的初始化DD报文,第一个发起的置位为1
- M位标识这个DD报文是否是最后一个报文,置位1表示后续还有,置位0则是最后一个DD报文
- 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
状态。
【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数据库同步
FULL的前提条件:两端MTU一致
否则会卡在Exstart
或则Exchange
状态
能计算路由的前提条件:两端网络类型要一致
否则状态是FULL但是没法学习到路由
状态机
要注意的是,在OSPF中,Down
、2-Way
、Full
是处于一个稳定状态,正常情况下,DR/BDR和Drother之间是处于Full
稳定状态, Drother之间是处于2-way
的稳定状态
其余阶段都属于瞬时肯能会变化的一个状态
关于这几个状态的解释如下图所示:
LSDB的更新流程
OSPF中LSDB的更新流程大致分为三种
- 收到更新,查LSDB,没有则加入LSDB
- 收到更新,查LSDB,有,对比序列号大,将已有的LSA更新
- 收到更新,查LSDB,有,对比序列号小,丢弃或忽略
注意,在LSDB中的每条LSA,默认是有老化时间的,默认为一小时
如果一小时没有更新LSA则LSA 将会老化同时被移除
默认情况下,LSDB每隔30分钟
刷新一次LSA,每次刷新存活的LSA序列号+1
同时重置老化计时器
其中广播类型(Broadcast)的网络中,更新只由DR发起,其余角色,先将更新的DD报文上送至DR,再有DR发送更新给其他路由器
OSPF高级特性
OSPF虚连接
虚连接Virtual-Link
一般在正常的规划网络中是不会出现虚连接的这种情况,因为OSPF规定了,所有非骨干区域必须要与骨干区域连接
而虚连接这个技术是为了解决没有和骨干区域连接的情况,如下图所示:
这里还要提OSPF的两个机制
【1】ABR从骨干区域学到的路由,不会再向骨干区域传播
【2】所有非骨干区域通信,必须要经过骨干区域转发
- 图一因为骨干区域被分割,RTB和RTC都认为自己是ABR,那么,由RTA发给RTB的路由,是不会从RTC发回RTD,RTD就学不到对端的路由,导致OSPF路由学习有问题
- 图二因为非骨干区域没有和骨干区域连接,那么RTC就不会在两个非骨干区域交换路由,因此RTD学不到RTA、RTB、RTC的路由,RTA、RTB、RTC学不到RTD的路由
虚连接(Virtual-Link)
通过配置虚连接将两个分割的Area0区域,通过建立一个逻辑连接通道打通,虚连接为他们提供了一个特殊的区域,传输区域(Transit Area)
虚连接配置的条件,它的两端必须是ABR
虚连接建立成功后,两个ABR之间通过单播形式交换路由信息进行正常的转发
虚连接的配置参考:
配置命令详细参考入下:
通过如下命名可以查看虚连接的状态情况:
字段详解:
OSPF的LSA类型【重点】
在OSPF中将LSA分为11大类,其中1、2、3、4、5、7类LSA比较常用
其余作为扩展
LSA报文格式
字段详解:
- LS age LSA的老化时间,以秒为单位,在路由器LSDB中随时间老化
- LS type LSA的类型
- Link State ID 这里具体的数值根据LSA的类型来定义
- Advertising Router 这条LSA的始发路由器的ID
- LS Sequence Number LSA的序列号,用于判断哪条LSA最新的
- LS Checksum LSA的校验和
- Length LSA的总长度
标识一条LSA的三个重要字段LS Type
、Link State ID
、Advertising Router
Type1-LSA
也叫Router LSA
该LSA描述了区域内与本路由器直连链路的信息
所有区域内的路由器都会产生该条LSA
该LSA仅在区域内传递
通过该条命令可以查询:
display ospf lsdb router
- LS ID 标识发出该条LSA的Router-id
- Adv Rtr 始发路由器,产生该条LSA的路由的Router-id
- Link-Type 链路类型,描述该链路二层类型,每个网络类型对应Link Count的解释不同,稍后详细说一下
TransNet
当链路类型为Broadcast
或NBMA
时,Link-Type字段会填充为TransNet
- Link ID 标识本网段DR的IP地址
- Data 标识本路由器在该网段的IP地址
P2P
当链路类型为PPP
时,Link-Type字段会填充为P2P
- Link ID 标识该网段对端路由器的Router-id
- Data 标识本网段与对端路由器相连的接口IP
Stubnet
当链路类型为P2P
、换回口
、末梢网络
时,Link-Type字段会填充为Stubnet
该字段用于补充P2P类型中缺失部分
- Link ID 标识该网段的网络地址
- Data 标识该网段的子网掩码
Type2-LSA
也叫Network LSA
由DR产生,用于描述该区域内MA网络中的路由器以及掩码信息
同样仅在区域内传递
该LSA只能由DR产生
通过该条命令可以查询:
display ospf lsdb network
- LS ID 标识该网段DR的IP地址
- Adv Rtr 标识该网段DR的Router-id
- Net Mask 标识该链路的掩码信息
- Attached Router 该网段所有路由器的Router-id
Type3-LSA
也叫Summary LSA
评论