
OSPF 协议
本文最后更新于 2025-03-13,文章内容可能已经过时。
🤔什么是 OSPF?
开放式最短路径优先 OSPF(Open Shortest Path First)是 IETF 组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。它工作在 IP 层之上,使用 IP 协议号 89,目前针对 IPv4 协议使用的是 OSPF Version 2(RFC2328);针对 IPv6 协议使用 OSPF Version 3(RFC2740)。
🧬概念
🎈LSA(链路状态信息)
OSPF 是一种链路状态协议。可以将链路视为路由器的接口。链路状态是对接口及接口与相邻路由器的关系的描述。例如接口的信息包括接口的 IP 地址、掩码、所连接的网络的类型、连接的邻居等。所有这些链路状态的集合形成链路状态数据库。
🎈LSDB(链路状态数据库)
LSDB 用于存放 LSA,同一个区域中的 LSDB 是保持一致的。
🎈RID(Router id)
如果要运行 OSPF 协议,必须存在 Router ID。Router ID 是一个 32 比特(IPv4 地址格式)无符号整数,是一台路由器在自治系统中的唯一标识。
Router ID 的设定有两种方式:
-
通过命令行手动配置,在实际网络部署中,建议手工配置 OSPF 的 Router ID,因为这关系到协议的稳定。
-
通过协议自动选取。
如果没有手动配置 Router ID,设备会从当前接口的 IP 地址中自动选取一个作为 Router ID。其选取顺序是:
-
优先从 Loopback 地址中选择最大的 IP 地址作为 Router ID。
-
如果没有配置 Loopback 接口,则在接口地址中选取最大的 IP 地址作为 Router ID。
思科:
R(config)# router ospf 1 //进入ospf进程
R(config-router)# router-id 2.2.2.2 //指定RID
R# clear ip ospf process //重置ospf
华为 /H3C:
[R] ospf 1 router-id 6.6.6.6 //指定RID,ospf进程号为1
<R> reset ospf process //重置ospf
🎈度量值(cost)
-
OSPF 使用 cost「开销」作为路由度量值。
-
每一个激活 OSPF 的接口都有一个 cost 值。OSPF 接口 cost=100M/ 接口带宽,其中 100M 为 OSPF 的参考带宽(reference-bandwidth)。
-
一条 OSPF 路由的 cost 由该路由从路由的起源一路到达本地的所有入接口 cost 值的总和。
接口开销为 10^8/ 接口带宽(bit/s),路径开销是从源到达目标途径中所有设备出接口的开销之和
思科:
R(config-if)# bandwidth ? //修改接口带宽,?为1-10000000(kbps)的数
R(config-if)# ip ospf cost ? //修改接口开销,?为1-65535的数
华为 /H3C:
[R]int g1/0, //进入接口
[R-GigabitEthernet1/0] bandwidth ?, //修改接口带宽,?为1-400000000(kbps)的数
[R-GigabitEthernet1/0] ospf cost ?, //修改接口开销,?为1-65535的数
🎈更新机制
有两种更新机制,分别为组播更新与触发更新,其中周期泛洪为 30 分钟周期发一次。
组播机制下有两个组播地址:
-
224.0.0.5,所有开启了 OSPF 的设备都会加入该组播组
-
224.0.0.6,只有 DR/BDR 来侦听此组播组
🎈OSPF 核心算法(SPF)
OSPF 可以使用 SPF 算法算出一条基本无环的最优路径,从 LSDB 中计算出最优的加入路由表
🏁三张表
表名 | 作用 |
---|---|
邻居表 | 开启了 OSPF 路由协议的设备加入 224.0.0.5 这个组播组,在这个组播组中的 OSPF 路由器会发送 hello 包来建立邻居关系,记录的就是邻居的 RID,IP 地址等信息 |
LSDB 表(链路状态数据库) | 存放着自身的 LSA 信息以及从其他设备收到的 LSA 信息,同一个区域中的 LSDB 是保持一致的 |
路由表 | 通过 SPF 算法将 LSDB 中的 LSA 信息进行计算,选择最优的路由加入路由表 |
思科:
R# show ip ospf neighbor //查看ospf邻居表
R# show ip ospf database //查看LSDB
R# show ip route ospf //查看路由表
华为 /H3C:
[R] display ospf peer //查看ospf邻居表
[R] display ospf lsdb //查看LSDB
[R] display ip routing-table protocol ospf //查看路由表
📰五个报文
报文 | 作用 |
---|---|
Hello 报文 | 周期性发送,用来发现和维持 OSPF 邻居关系。hello time 10s,dead time 40s |
DBD 包 /DD 报文(Database Description packet) | 携带 LSA 信息的摘要,描述本地 LSDB(Link State Database)的摘要信息,用于两台设备进行数据库同步。 |
LSR 报文(Link State Request packet) | 请求自身没有的 LSA 信息,用于向对方请求所需的 LSA。设备只有在 OSPF 邻居双方成功交换 DD 报文后才会向对方发出 LSR 报文。 |
LSU 报文(Link State Update packet) | 回复 LSR 报文(回复别人请求的 LSA 信息),用于向对方发送其所需要的 LSA。 |
LSAck 报文(Link State Acknowledgment packet) | 对 LSU 信息进行确认,用来对收到的 LSA 进行确认。 |
😎七种状态(邻居状态机)
邻居关系:OSPF 设备启动后,会通过 OSPF 接口向外发送 Hello 报文,收到 Hello 报文的 OSPF 设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
邻接关系:形成邻居关系后,如果两端设备成功交换 DD 报文和 LSA,才建立邻接关系。
状态 | 作用 |
---|---|
Down | 邻居会话的初始阶段,表明没有在邻居失效时间间隔内收到来自邻居路由器的 Hello 数据包。 |
Init | 收到 Hello 报文后状态为 Init。 |
2-way(邻居标志) | 收到的 Hello 报文中包含有自己的 Router ID,则状态为 2-way;如果不需要形成邻接关系则邻居状态机就停留在此状态,否则进入 Exstart 状态。 |
Exstart | 开始协商主从关系,并确定 DD 的序列号,此时状态为 Exstart。 |
Exchange | 主从关系协商完毕后开始交换 DD 报文,此时状态为 Exchange。 |
Loading(进行 LSDB 同步) | DD 报文交换完成即 Exchange done,此时状态为 Loading。 |
Full | LSR 重传列表为空,此时状态为 Full。 |
🎏DR 和 BDR
在广播网和 NBMA 网络中,任意两台路由器之间都要传递路由信息。如图所示,网络中有 n 台路由器,则需要建立 n*(n-1)/2 个邻接关系。这使得任何一台路由器的路由变化都会导致多次传递,浪费了带宽资源。为解决这一问题,OSPF 定义了指定路由器 DR 和备份指定路由器 BDR。通过选举产生 DR(Designated Router)后,所有路由器都只将信息发送给 DR,由 DR 将网络链路状态 LSA 广播出去。除 DR 和 BDR 之外的路由器(称为 DR Other)之间将不再建立邻接关系,也不再交换任何路由信息,这样就减少了广播网和 NBMA 网络上各路由器之间邻接关系的数量。
如果 DR 由于某种故障而失效,则网络中的路由器必须重新选举 DR,并与新的 DR 同步。这需要较长的时间,在这段时间内,路由的计算有可能是不正确的。为了能够缩短这个过程,OSPF 提出了 BDR(Backup Designated Router)的概念。BDR 是对 DR 的一个备份,在选举 DR 的同时也选举出 BDR,BDR 也和本网段内的所有路由器建立邻接关系并交换路由信息。当 DR 失效后,BDR 会立即成为 DR。由于不需要重新选举,并且邻接关系已建立,所以这个过程非常短暂,这时还需要再重新选举出一个新的 BDR,虽然一样需要较长的时间,但并不会影响路由的计算。
作用
减少邻接关系,减少不必要的 LSA 发送
角色
-
DR ---> 指定路由
-
BDR ---> 备份指定路由器
-
DRTHOER ---> 普通路由
选举
DR 和 BDR 不是人为指定的,而是由本网段中所有的路由器共同选举出来的。路由器接口的 DR 优先级决定了该接口在选举 DR、BDR 时所具有的资格。本网段内 DR 优先级大于 0 的路由器都可作为「候选人」。选举中使用的「选票」就是 Hello 报文。每台路由器将自己选出的 DR 写入 Hello 报文中,发给网段上的其他路由器。当处于同一网段的两台路由器同时宣布自己是 DR 时,DR 优先级高者胜出。如果优先级相等,则 Router ID 大者胜出。如果一台路由器的优先级为 0,则它不会被选举为 DR 或 BDR。
思科:
R(config-if)# ip ospf priority ? //修改优先级,?取值为0-255
R# clear ip ospf process //重置ospf
华为 /H3C:
[R]int g1/0 //进入接口后进行设置
[R-GigabitEthernet1/0]ospf dr-priority ? //修改优先级,?取值为0-255
<R> reset ospf process //重置ospf
🌏区域
区域 | 作用 |
---|---|
骨干区域 | 区域 0,非骨干区域必须和骨干区域相连 |
非骨干区域 | 除了区域 0 以外的其他区域 |
🎭角色(路由器类型)
路由类型 | 作用 |
---|---|
ABR(区域边界路由器) | 路由器连接着不同的区域,必须有一个区域是骨干区域,在骨干区域中必须有一个活跃的邻居 |
ASBR(自治系统边界路由器) | 路由器连接着不同的路由协议,ASBR 并不一定位于 AS 的边界,它可能是区域内设备,也可能是 ABR。只要一台 OSPF 设备引入了外部路由的信息,它就成为 ASBR。 |
IR(区域内路由器) | 该类设备的所有接口都属于同一个 OSPF 区域。 |
BR(骨干路由器) | 该类设备至少有一个接口属于骨干区域。所有的 ABR 和位于 Area0 的内部设备都是骨干路由器。 |
💻开启 OSPF
思科:
//进程下通告
route ospf 1
network 12.12.12.0 0.0.0.255 area 0
router-id 1.1.1.1
//接口下通告
int e0/0
ip ospf 1 area 0
华为 /H3C:
//进程下通告
ospf 1
area 0.0.0.0,
network 67.67.67.0 0.0.0.255
//接口下通告
interface GigabitEthernet1/0
ospf 1 area 0.0.0.0