OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。
目前针对IPv4协议使用OSPF Version 2,针对IPv6协议使用OSPF Version 3。
在OSPF出现前,网络上广泛使用RIP(Routing Information Protocol)作为内部网关协议。由于RIP是基于距离矢量算法的路由协议,存在着收敛慢、路由环路、可扩展性差等问题,所以逐渐被OSPF取代。
OSPF数据包
OSPF中对路由信息的描述都是封装在链路状态通告LSA(Link State Advertisement)中发布出去的.
OSPF用IP报文直接封装协议报文,协议号为89。
- Hello包:周期性发送(10s),用来发现、建立、保活邻居关系。
- DBD包(Database Description packet):描述本地的LSDB摘要信息(本地数据库目录),用于两个设备的数据库同步。
- LSR包(Link State Request packet):用于向对方请求所需(未知的)的LSA,设备只有在邻居双方成功交换DBD包后都会发送LSR包。
- LSU包(Link State Update packet):用于共享具体的LSA信息。
- LSAck包(Link State Acknowledgment packet):用于确认收到的LSA。
OSPF路由计算
OSPF协议路由的计算过程可简单描述如下:
1.建立邻接关系。两端设备通过以下步骤建立邻接关系:
本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
两端设备进行主/从关系协商和DD报文交换。
两端设备通过更新LSA完成链路数据库LSDB的同步。2.路由计算。OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。
状态机
在OSPF网络中,为了交换路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念:
- 邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
- 邻接关系:形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。
邻居和邻接状态是通过OSPF状态机表现的:
状态机 | 含义 |
---|---|
Down | 初始阶段,一旦接收到其它设备发出的Hello包则立即进入下一阶段。 |
Attempt | 尝试阶段,这个状态只在NBMA网络中出现。(一般不存在)在此状态下,路由器主动尝试与其它路由器建立邻居关系。 |
Init | 初始化,一旦接收到RID,我方RID则进入到下一阶段。 |
2-way | 双向通讯,邻居关系建立的标志 |
ExStart | 预启动,使用不携带数据库目录的DBD包,进行评价关系的选举。如果DR优先级相等,则Router ID大者胜出。 目的在于对DBD包进行排序,避免更新量在同一时间内激增。 |
Exchange | 准交换,使用DBD包进行数据库目录信息的交换 |
Loading | 加载,基于接收的数据库目录和本地对比,然后基于本地未知的LSA信息,使用LSR来进行查询,对端使用LSU来应答,需要本地最后LSAck确认。 目的在于获取本地未知的LSA信息。 |
Full | 转发,邻接关系建立的标志 |
OSPF工作流程
建立邻居关系
- R1的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个Hello报文。
此时,R1不确定DR是哪台路由器(DR=0.0.0.0),也不确定邻居是哪台设备(Neighbors Seen=0)。 - R2收到R1发送的Hello报文后,发送一个Hello报文回应给R1,并且在报文中的Neighbors Seen字段中填入R1的Router ID(Neighbors Seen=1.1.1.1),表示已收到DeviceA的Hello报文,并且宣告DR路由器是R2(DR=2.2.2.2),然后R2的邻居状态机置为Init。
- R1收到R2回应的Hello报文后,将邻居状态机置为2-way状态。
主/从关系协商、DD报文交换
- 邻居状态机从2-way转为Exstart状态后开始主从关系选举:
- R1向R2发送的第一个DD报文内容为空,其Seq序列号假设为X。
- R2也向R1发出第一个DD报文,其Seq序列号假设为Y。
- 选举主从关系的规则是比较Router ID,越大越优。R2的Router ID比R1大,因此R2成为真正的主设备。主从关系比较结束后,R1的状态从Exstart转变为Exchange。
- R1邻居状态变为Exchange后,R1发送一个新的DD报文,包含自己LSDB的描述信息,其序列号采用主设备R2的序列号。R2收到后邻居状态从Exstart转变为Exchange。
- R2向R1发送一个新的DD报文,包含自己LSDB的描述信息,序列号为Y+1。
- R1作为从路由器需要对主路由R2发送的每个DD报文进行确认,回复报文的序列号与主路由R2一致。
- 发送完最后一个DD报文后,R1将邻居状态切换为Loading
LSDB同步
- R1收到最后一个DD报文后,发现R2的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。
此时R2也收到了R1的最后一个DD报文,但R1的LSA,R2都已经有了,不需要再请求,所以直接将R1的邻居状态机改为Full状态。 - R1发送LSR报文向R2请求更新LSA。DeviceB用LSU报文来回应R1的请求。R1收到后,发送LSAck报文确认。
当设备交换完DD报文并更新所有的LSA后,此时邻接关系建立完成(Full)。