OSPF 基础
部分缩写
Abbreviations | Full spelling | 中文解释 |
---|---|---|
OSPF | Open Shortest Path First | 开放式最短路径优先 |
IETF | Internet Engineering Task Force | 互联网工程任务组 |
IGP | Interior Gateway Protocol | 内部网关协议 |
LSA | Link State Advertisement | 链路状态通告 |
LSDB | Link State DataBase | 链路状态数据库 |
NBMA | Non-Broadcast Multi-Access | 非广播多路访问 |
P2MP | Point-to-MultiPoint | 点到多点 |
DR | Designated Router | 指定路由器 |
BDR | Backup Designated Router | 备份指定路由器 |
ABR | Area Border Router | 区域边界路由器 |
AS | Autonomous System | 自治系统 |
ASBR | Autonomous System Boundary Router | 自治系统边界路由器 |
NSSA | Not-So-Stubby Area | 非纯末节区域 |
DD | Database Description | 数据库描述 |
LSR | Link State Request | 链路状态请求 |
LSU | Link State Update | 链路状态更新 |
LSAck | Link State Acknowledgment | 链路状态确认 |
动态选路协议
在网络很小时,且与其他网络只有单个连接点没有多余路由时,可以通过静态路由配置,但是随着网络规模增大需要使用动态选路。
RIP 是一种基于距离矢量的路由协议,存在着收敛慢、易产生路由环路、可扩展性差等问题,逐渐被 OSPF 取代。
OSPF概述
OSPF:开放最短路径优先,IETF开发的动态路由协议,是链路状态算法最有名的实现协议,也是 IETF 推荐应用最广泛的 IGP 协议。RFC2328描述 OSPFv2。
OSPF 在协议栈中的属于应用层协议,以 IP 报文封装,协议号为 89,无传输层协议的头部,OSPF 的头部紧接着 IP头。
协议自身的报文是不转发的:协议报文用IP报文封装后,TTL = 1,只有一跳,不会被转发。
若想通过 OSPF 协议发现路由,必须在相应的路由器及相应的接口上配置该协议。
OSPF特点
-
适应范围广:支持各种规模的网络,最多可支持几百台路由器。
-
快速收敛:在网络的拓扑结构发生变化后立即发送更新报文,使这一变化在自治系统中同步。
-
无自环:由于 OSPF 根据收集到的链路状态用最短路径树算法计算路由,从算法本身保证了不会生成自环路由。
-
区域划分:允许自治系统的网络被划分成区域来管理。路由器链路状态数据库的减小降低了内存的消耗和 CPU 的负担;区域间传送路由信息的减少降低了网络带宽的占用。
-
等价路由:支持到同一目的地址的多条等价路由。
-
路由分级:使用4类不同的路由,按优先顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。
-
支持验证:支持基于区域和接口的报文验证,以保证报文交互和路由计算的安全性。
-
组播发送:在某些类型的链路上以组播地址发送协议报文,减少对其他设备的干扰。OSPF 使用的组播地址为 224.0.0.5,所有运行 OSPF 的路由器必须准备接收发送到该地址的,Hello 包始终发往该目标。DR 和 BDR 侦听224.0.0.6,必须准备接收发送到该地址的包。
OSPF原理简介
OSPF 要求每台运行 OSPF 的路由器都了解整个网络的链路状态信息,这样才能计算出到达目的地的最优路径。OSPF 的收敛过程由链路状态公告 LSA 泛洪开始,LSA 包含了路由器已知的接口 IP 地址、掩码、开销和网络类型等信息。收到 LSA 的路由器都可以根据 LSA 提供的信息建立自己的链路状态数据库 LSDB,并在 LSDB 的基础上使用 SPF 算法进行运算,建立起到达每个网络的最短路径树。最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到 IP 路由表中。
OSPF 中的 5 种协议报文类型
-
Hello 报文:周期性发送,用来发现和维持 OSPF 邻居关系,并在 Broadcast 和 NBMA 类型网络中进行 DR/BDR 的选举。
-
DD 报文:两台路由器进行 LSDB 同步时,DD 报文来描述自己的 LSDB,内容包括 LSDB 中每一条 LSA 头部(可以唯一标识一条 LSA)。LSA 头部只占 LSA 的整个数据量的一小部分,所以可以减少路由器之间的协议报文流量。用于两台路由器进行数据库同步以及选主/从路由器。
-
LSR 报文:两台路由器互相交换 DD 报文之后,得知对端的路由器有哪些 LSA 是本地的 LSDB 所缺少的,这时需要发送 LSR 报文向对方请求所需的 LSA,LSR 中只包含了所需要的 LSA 摘要信息。
-
LSU 报文:向对方发送其所需要的 LSA。
-
LSAck 报文:用来对接收到的 LSU 进行确认。
Router ID
一个 32 bit 的无符号整数,是一台路由器的唯一标识,在整个自治系统内唯一,作为验证可达的手段。一台路由器如果要运行 OSPF 协议,则必须存在 Router ID,需要使用 Router ID 比较得出DR/BDR。
Router ID 的获取方式有以下三种:
-
手工指定 Router ID
用户可以在创建 OSPF 进程的时候指定 Router ID,配置时,必须保证自治系统中任意两台路由器的 RID 都不相同。通常的做法是将路由器的 ID 配置为与该路由器某个接口的IP地址一致。
-
自动获取 Router ID
如果在创建 OSPF 进程的时候选择自动分配 Router ID,则 OSPF 进程将根据如下规则自动获取 Router ID:
-
如果存在配置 IP 地址的 Loopback 接口,则选择 Loopback 接口地址中最大的作为 Router ID。
-
否则,从其他接口的IP地址中选择最大的作为 Router ID(不考虑接口的 up/down 状态)。
-
-
使用全局 Router ID
如果在创建 OSPF 进程的时候没有指定 Router ID,则缺省使用全局 Router ID。
状态机
邻居(Neighbor):OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文用于发现邻居。收到Hello报文的OSPF路由器检查报文中所定义的一些参数,如果双方参数一致,就会彼此形成邻居关系,状态到达2-Way即可称为建立邻居关系。
邻接(Adjacency):形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有双方成功交换DD报文,并同步LSDB后,才能形成真正意义上的邻接关系。
如上图,RTA通过以太网连接了三个路由器,所以有三个邻居,但不能说有三个邻接关系。
关系建立过程简述
-
Down:这是邻居的初始状态,表示没有在邻居失效时间间隔内收到来自邻居路由器的 Hello 数据包。
-
Attempt:此状态只在 NBMA 网络上存在,表示没有收到邻居的任何信息,但是已经周期性向邻居发送报文,发送间隔为 Hello Interval。如果 Router Dead Interval 间隔内没有收到邻居的 Hello 报文,则转为 Down 状态。
-
Init:此状态下,路由器已经从邻居收到了 Hello 报文,但是自己不在所收到 Hello 报文的邻居列表中,尚未与邻居建立双向通信关系。
-
2-Way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。
-
ExStart:这是形成邻接关系的第一个步骤,邻居关系变成此状态以后,路由器开始向邻居发送 DD 报文。主从关系在此状态下形成,初始 DD 序列号也是在此状态下决定。在此状态下发送的 DD 报文不包含链路状态描述。
-
Exchange:此状态下路由器相互发送链路状态信息摘要的 DD 报文,描述本地 LSDB 的内容。
-
Loading:相互发送 LSR 报文请求 LSA,发送 LSU 报文通告 LSA。
-
Full:路由器的 LSDB 已经同步。
6.2 关系建立详解
更正:第四五个 DD 报文的 M 位为 1。