OSPF(Open Shortest Path First,开放最短路径优先)是IETF(Internet Engineering Task Force,互联网工程任务组)组织开发的一个基于链路状态的自治系统内部网关协议。目前针对IPv4协议使用的是OSPF Version 2。ospf直接工作在ip层之上,ip协议号89,ospf以组播方式发送协议包
链路状态路由协议使用SPF最短路经优先算法(shortest path first spf)计算和选择路由,这类路由协议只关心网络中链路或接口的状态(up down ip地址,掩码带宽,利用率和时延等),每个路由器将已知的链路状态信息向该区域的其他路由器通告,通过这种方式,网络上的每台路由器对网络结构都会有相同的认识,随后路由器以其为依据,使用spf算法计算和选择路由(其中:区域内部传递拓扑信息,区域间传递路由信息 --链路状态型协议的距离矢量特征)
区域划分规则
非骨干区域必须与区域0直接相连
骨干区域不能被分割
ABR --区域边界路由器
1、至少连接两个区域
2、连接的区域中至少有一个接口连接区域0
3、在区域0中至少有一个活跃的邻居
注意:只有真正的ABR才可以转发路由信息
OSPF相关数据包及其概括
hello包
1、用来发现、建立并周期保活OSPF邻居关系,通过组播224.0.0.5发送。
2、10S发送一次用以确认邻居存在。
3、死亡时间:4倍hello时间
DBD --链路状态数据库描述包
该报文中携带的是路径信息的摘要。---避免重复更新,减少更新量的一种做法
LSR --链路状态请求包
请求未知的LSA信息
LSU --链路状态更新包
携带真实的LSA信息
LSAck --链路状态确认包
邻居关系
OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
邻接关系
形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。
邻居状态机
OSPF共有8种状态机
分别是:Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full。
•Down:邻居会话的初始阶段,表明没有在邻居失效时间间隔内收到来自邻居路由器的Hello数据包。
•Attempt:该状态仅发生在NBMA网络中,表明对端在邻居失效时间间隔(dead interval)超时前仍然没有回复Hello报文。此时路由器依然每发送轮询Hello报文的时间间隔(poll interval)向对端发送Hello报文。
•Init:收到Hello报文后状态为Init。
•2-way:收到的Hello报文中包含有自己的Router ID,则状态为2-way;如果不需要形成邻接关系则邻居状态机就停留在此状态,否则进入Exstart状态。
•Exstart:开始协商主从关系,并确定DD的序列号,此时状态为Exstart。
•Exchange:主从关系协商完毕后开始交换DD报文,此时状态为Exchange。
•Loading:DD报文交换完成即Exchange done,此时状态为Loading。
•Full:LSR重传列表为空,此时状态为Full。
在广播网络中建立OSPF邻接关系
1.建立邻居关系
a.RouterA的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个Hello报文(使用组播地址224.0.0.5)。此时,RouterA认为自己是DR路由器(DR=1.1.1.1),但不确定邻居是哪台路由器(Neighbors Seen=0)。
b.RouterB收到RouterA发送的Hello报文后,发送一个Hello报文回应给RouterA,并且在报文中的Neighbors Seen字段中填入RouterA的Router ID(Neighbors Seen=1.1.1.1),表示已收到RouterA的Hello报文,并且宣告DR路由器是RouterB(DR=2.2.2.2),然后RouterB的邻居状态机置为Init。
c.RouterA收到RouterB回应的Hello报文后,将邻居状态机置为2-way状态,下一步双方开始发送各自的链路状态数据库。
注意:在广播网络中,两个接口状态是DR Other的路由器之间将停留在此步骤。
2.主/从关系协商、DD报文交换
a.RouterA首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号Seq=X。I=1表示这是第一个DD报文,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文。
为了提高发送的效率,RouterA和RouterB首先了解对端数据库中哪些LSA是需要更新的,如果某一条LSA在LSDB中已经存在,就不再需要请求更新了。为了达到这个目的,RouterA和RouterB先发送DD报文,DD报文中包含了对LSDB中LSA的摘要描述(每一条摘要可以惟一标识一条LSA)。为了保证在传输的过程中报文传输的可靠性,在DD报文的发送过程中需要确定双方的主从关系,作为Master的一方定义一个序列号Seq,每发送一个新的DD报文将Seq加一,作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的Seq。
b.RouterB在收到RouterA的DD报文后,将RouterA的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RouterB的Router ID较大,所以在报文中RouterB认为自己是Master,并且重新规定了序列号Seq=Y。
c.RouterA收到报文后,同意了RouterB为Master,并将RouterB的邻居状态机改为Exchange。RouterA使用RouterB的序列号Seq=Y来发送新的DD报文,该报文开始正式地传送LSA的摘要。在报文中RouterA将MS=0,说明自己是Slave。
d.RouterB收到报文后,将RouterA的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,此时RouterB将报文的序列号改为Seq=Y+1。
上述过程持续进行,RouterA通过重复RouterB的序列号来确认已收到RouterB的报文。RouterB通过将序列号Seq加1来确认已收到RouterA的报文。当RouterB发送最后一个DD报文时,在报文中写上M=0。
3.LSDB同步(LSA请求、LSA传输、LSA应答)
a.RouterA收到最后一个DD报文后,发现RouterB的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RouterB也收到了RouterA的最后一个DD报文,但RouterA的LSA,RouterB都已经有了,不需要再请求,所以直接将RouterA的邻居状态机改为Full状态。
b.RouterA发送LSR报文向RouterB请求更新LSA。RouterB用LSU报文来回应RouterA的请求。RouterA收到后,发送LSAck报文确认。
上述过程持续到RouterA中的LSA与RouterB的LSA完全同步为止,此时RouterA将RouterB的邻居状态机改为Full状态。当路由器交换完DD报文并更新所有的LSA后,此时邻接关系建立完成。
条件匹配
选举DR和BDR
为什么选举DR和BDR
在一个共享的广播网络多台路由器建立OSPF,有可能会产生大量的OSPF邻居
在这些大量的OSPF邻居发送大量的OSPF报文,造成其他路器接收到大量的OSPF重复报文浪费带宽资源和设备CPU计算资源
注意:DR和BDR都是接口角色
条件匹配选举规则
优先级,0-255;选择优先级大的为DR设备,默认为1。若优先级为0则代表放弃选举
若优先级相同,则比较RID值,越大越优先。
注意:
选取范围---一个广播域
非抢占模式----重选则需要重启OSPF进程。
在一个MA网络中,可以没有BDR,但是必须存在DR
条件匹配的选举过程
DR、BDR的选举是通过Hello报文实现的,时间发生在2-way状态之后。
路由器将自己的接口的DR优先级填写在hello报文的“DR优先级字段”。
华为数通产品的接口DR优先级默认1,该参数值可以通过
当接口激活OSPF后,设备首先会检查网络上是否已经存在DR,如果存在则接收已经存在的DR设备。否则优先级最大的设备成为DR,若优先级相同,则拥有最大RID的路由器成为DR设备。
BDR选举过程与DR相同,但是是在DR选举之后进行
[Huawei-GigabitEthernet0/0/0]ospf dr-priority ? --修改优先级
INTEGER<0-255> Router priority value
DR优先级为0则代表该接口放弃选举DR和BDR。
OSPF工作过程
启动OSPF配置后,OSPF向本地所有运行了OSPF协议的接口以组播224.0.0.5发出hello报文;hello报文中携带了本地的RID参数以及本地已知的邻居RID值。
邻居的RID获取方式:通过接收其他邻居的hello报文来获取本地邻居
建立邻居关系,并生成邻居表。
邻居关系建立后,进行条件匹配;匹配失败则停留在邻居关系,即2-way状态,仅使用hello报文保活。该状态为稳定态。
匹配成功的邻居开始建立邻接关系。
首先使用未携带数据的DBD报文进行主从关系选举,之后使用携带信息的DBD报文来共享数据库目录;
然后本地通过对方共享的目录信息与本地数据库进行对比,通过使用LSR报文请求未知的LSA信息。
对端使用LSU报文回复完整LSA信息
本端使用LSAck报文确认回复。
当本地接收到所有的未知LSA信息后,将信息存放在LSDB中。
之后基于本地数据库生成有向图和最短路径树。
根据最短路径树计算本地到达拓扑中所有未知网段的最短路径,并将其加入到OSPF路由表中。
从OSPF路由表中选择最优路由加载入本地全局路由表。
收敛完成后,hello报文周期保活。每30min进行一次周期链路刷新。
结构突变
新增网段-----直接使用LSU报文告知邻居,邻居使用ACK进行确认。
断开网段-----直接使用LSU报文告知邻居,邻居使用ACK进行确认。
无法沟通-----dead time----4*hello time,状态为down,删除信息。
基础配置
[r1]ospf 1 router-id 1.1.1.1 --启动ospf,定制进程号和RID
[r1-ospf-1]area 0
[r1-ospf-1-area-0.0.0.0]network 192.168.1.1 0.0.0.0 --精准宣告,宣告接口,为了激活接口
[r1-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255 --范围宣告,
[r1]dispaly ospf peer (brief) --查看邻居表
[r1]dispaly ospf int g 0/0/0 --查看接口信息
[r1-ospf-1]bandwidth-reference 1000 --修改默认带宽为1000M,修改时需要整个网络的默认带宽一致。
cost=默认带宽(1000)/实际带宽;
OSPF报文格式
OSPF报文头部
固定24字节
字段解释如下
Version 是ospf 的版本 ospfv2 其值为 2
Type :ospf 类型有五种报文 分别为 1: hello 2:dd 3:lsr 4 :lsu 5 lsack
Packet length ospf 报文的总长度 包括报头在内 单位是字节
Router-id 始发该LSA的路由器ID
Area-id 始发该LSA 的区域ID
Checksum :对整个报文校验
Autype :验证类型 可分为不验证、明文验证、MD5验证 值分别为 0 1 2
Authenication :其值根据验证类型来定义, 验证为0时未作定义 为1是为密码验证 为2时为KEY-ID 和密码的MD5 验证
MD5数据添加在OSPF 报文后面不在authentication 字段里
hello 报文 (hello packet)
它是周期性的发送 来维持邻居关系 和dr /bdr 选举内容主要包括:定时器数值、DR BDR 以及自己已知的邻居 起报文格式如下图
Network mask 发送hello 包 时 接口下的子网掩码不同不能建立邻居关系
Hellointerval 发送hello 报的时间间隔不同不能建立邻居关系
RTr pri :路由器的本地优先级
Routerdeadtimeinterval:失效时间 如果在规定的时间内没有收到来自邻居的hello包则视为失效,失效时间间隔不同不能建立邻居
Designated router 指路由器本地接口的IP
Neighbor 指邻居路由器的Ip
DD 报文(database description packet )
两台路由器进行数据库同步时,用DD报文来描述自己的LSDB 内容包括LSDB中每一条LSA 的header LSA header 只占一个条LSA的整个数据流的一小部分 这样可以减少路由器之间的协议报文流量,对端的路由器可以根据LSA 的头部 能够判断是否有这条LSA
主要字段解释如下:
Interface MTU :在不分片情况下 在接口处容许最大发出的IP报文长度
I(initial)当发送连续的DD 时 如果是第一个报文则为1
M(more) 表示多个DD 连续发送报文,如果是最后一个dd 则表示为0 反则为1
MS :在双方交换DD 时还要确认他们的主从关系 ms=1 表示发送方为主位
Dd sequence number :双方用序列号来确认DD 收发的持续性和完整性
LSR报文(link state request)
两台路由器互相交换数据到最后一个LSA 时 如果一方发现自己还有很多不知道的DD 时就会请求对方 lsr 来继续更新自己的DATABASE
LS Type :LSA 的类型 例如Type 1表示router lsa
Link state ID 链路状态标识
Advertising router: 产生此lsa 的路由器
5.LSU 报文
LSU 是对LSR 寻求的回答
Number of LSAs 该报文包含LSA 的数量
LASs :包含所有的LSA
6.LSAck
LSACK 报文是用来对接收到的LSU 报文的进行确认的 内容是需要确认LSA 的header
OSPF的接口网络类型
OSPF的接口网络类型,实际上是说OSPF的接口在某种网络类型下的一种工作方式或特征。广播型多路访问类型
OSPF在BMA类型的接口上通常以组播的方式发送hello报文、LSU及LSACK报文;以单播的形式发送DD报文和LSR报文。点到点类型
OSPF在网络类型为P2P的接口上以组播的方式发送所有数据报文。----不以单播形式发送的原因在于点到点网络可以不需要IP地址。
OSPF在点到点网络中不会选举DR和BDR。
开销值----在华为设备中,P2P网络的参考实际带宽默认为2.048(E1标准)
环回接口
开销值恒定为0,这样的结果就是修改参考带宽不会影响到环回接口的开销值。
type----华为使用P2P来填充,而cisco使用loopback填充。
所有通过OSPF学习到的环回接口的路由掩码都是32位,因为该接口是一个模拟的接口,实际没有连接用户,所以并没有其他IP地址存在与该接口之下,只有一个可用IP。----如果使用其他掩码,可能会导致环路或者路由黑洞。
witing----该字段代表正在进行条件匹配,当该计时器超时后,接口会认为自己为DR设备,且将接口的状态切换为exstart状态。
点到多点类型
只能手工修改。
[r7-Tunnel0/0/0]ospf network-type p2mp
在P2MP环境下,设备会学习所有邻居的接口IP地址,形成主机路由。
在P2MP环境下,只有hello报文是以组播形式发送,其他所有报文以单播形式发送数据。