OSPF 动态路由协议
一、动态路由协议的评判标准
设备一般只运行一款动态路由协议,动态路由协议一般由单一算法支撑。
判断一款动态路由协议的好坏,看三点:
由此判断 RIP 和 OSPF:
1. 选路
OSPF 是链路状态型协议,它收集拓扑信息后,将图形结构通过 SPF 算法转换成树型结构。好处是不会出现环路,并且 OSPF 以带宽作为开销值的评判标准。此项 OSPF 优于 RIP。
2. 收敛速度
取决于协议的计时器时间。OSPF 的计时器时间短于 RIP,所以收敛速度也优于 RIP。
3. 占用资源
从单个数据包的角度看,RIP 传递的是路由信息,资源占用不大;OSPF 需要传递拓扑信息,单个数据包的资源占用大于 RIP。
但 OSPF 不会像 RIP 那样进行高频的周期更新,并且设计者设计了很多针对资源占用的优化机制。所以从整体角度看,OSPF 略优于 RIP。
RIP 适用于中小型网络。
二、OSPF 基础
OSPF —— Open Shortest Path First,开放式最短路径优先协议
- OSPFv1:在实验阶段夭折
- OSPFv2:用于 IPv4
- OSPFv3:用于 IPv6
2.1 与 RIPv2 的相同点
2.2 与 RIPv2 的不同点
RIP 协议只能应用在中小型网络环境中,而 OSPF 可以应用在中大型网络环境中。
OSPF 为了适用于中大型网络环境,需要进行结构化部署——区域划分。
- 只存在一个区域,称为单区域 OSPF 网络
- 存在多个区域,称为多区域 OSPF 网络
三、区域划分
3.1 区域划分的目的
让区域内部传递拓扑信息,区域之间传递路由信息。
路由信息占用资源小,拓扑信息占用资源大。
3.2 区域边界设备 ABR
一个接口属于一个区域,区域之间可以存在多个 ABR 设备。
3.3 区域划分的要求
3.4 区域 ID
为了方便对区域进行管理,给每一个区域设计了区域 ID,由 32 位二进制构成,采用点分十进制表示。
骨干区域的 ID 被定义为 0。
3.5 链路状态型协议的距离矢量特征
RIP 缺少确认机制和保活机制。
四、OSPF 的工作过程
4.1 五种数据包
1. Hello 包
用来周期性地发现、建立以及保活邻居关系,专门做保活。
- Hello 时间:默认 10s
- Dead time:4 倍的 Hello 时间(不要记成 40s)
RID —— router id,用来区分和标识 OSPF 网络中的不同路由器。
RID 的要求:
RID 的获取:
Hello 包要携带 RID。
2. DBD 包
数据库描述报文。链路状态数据库(存拓扑信息)里有 LSA(链路状态通告)。
DBD 不是完整数据库,而是数据库的描述/摘要信息,就像一本书的目录,不含完整内容。
在 OSPF 中,传递的拓扑信息较占资源,不能一次性发给其他设备。所以先把拓扑做成摘要(目录)发过去,对方据此挑选需要的 LSA/拓扑信息,再针对性发送。类似饭店先看菜单点菜,而非全做上来。
DBD 本质是摘要而非全量数据,DBD 包是一种资源优化机制。本来可直接发全部拓扑信息,但拓扑占用资源多,所以先发摘要,对方按需请求完整数据,减少浪费。——“菜单”
3. LSR 包
链路状态请求报文。基于 DBD 包,请求未知的 LSA 信息。
DBD 是摘要,LSR 是请求。这就像拿到菜单后只点需要的菜。——“点菜”
4. LSU 包
链路状态更新报文,真正携带了 LSA 的数据包。——“上菜”
5. LSACK 包
链路状态确认报文。设备发完整 LSA 信息后,对方回 ACK 才算收到,类似上菜后结账。——“结账”
OSPF 设计这套交互过程,核心目的是解决资源占用过大问题,避免设备一次性把全部拓扑和 LSA 信息发给邻居。
OSPF 里确认机制与保活机制并存,靠 ACK 确保 LSA 可靠送达,靠 Hello 维持邻居存活。
OSPF 虽已有保活机制和确认机制,理论上无需周期更新。但因它用于中大型网络,LSA 信息量大,设计者对自己不够自信,就加了保底机制:OSPF 存在 30min 一次的周期更新。
这 30 分钟周期更新频率极低,实际作用很小。OSPF 的可靠靠保活+确认,周期更新非必需;30 分钟周期更新只是心理保底,不是常规高频同步。
4.2 状态机
状态机指的是记录"之前做过什么、现在该做什么、接下来要做什么"的机制。
每台路由器有唯一身份标识,叫 router id,如 R1 是 1.1.1.1,R2 是 2.2.2.2。
两者未通信前互不认识,处于 Down 状态,即没发包时的初始状态。
R1 首发 Hello 包,作用是保活和发现并建立邻居关系。包里携带两项内容:自己的 router id 和已知邻居的 router id;此时 R1 不知链路上有谁,故后者为空。R2 收到该包后便获知了 R1 的身份,后续再处理。
OSPF 邻居建立里,设备发 Hello 包前是 Down 状态,发完后变 Init 状态。R2 收到 R1 的 Hello 后也发 Hello,含自己 router id 和已知邻居 router id。R1 收到后发现 R2,将其加入邻居表,并把 R2 状态置为 Two-way(双向)。
当收到的 Hello 包里带自己的 router id,说明对方已知道自己,就把对方状态置为 Two-way。像 R1 收到 R2 的包中有自己 router id,知道 R2 已识己,故置 R2 为 Two-way。这区别于 Init——Init 仅是己方发了 Hello 未确认互识,Two-way 才是双向发现。
在 OSPF 邻居建立里,Two-way 状态的切换时机是:当设备收到含自己 router id 的 Hello 包时,就把对方切到 Two-way 状态,这标志着邻居关系建立。
邻居关系建立后,需做条件匹配:只有匹配成功的设备才能进入下一状态,匹配失败则停留在邻居状态,且不再发周期性报文。
匹配成功双方先进入 ExStart 状态。在此状态下,R1 会发送 DBD 数据包(华为称 DD 数据包),用于后续交互。
在 OSPF 邻居建立中,R1 和 R2 都处于 ExStart 状态并发 DBD 包声明自己是 Master(主人),这其实是在选举主从关系——通过发送没有携带数据的 DBD 包进行主从关系选举。
主从关系选举主要是为了错开 LSA 摘要信息的交换过程,减少同一时间的资源占用。虽主是 R2,但从先进入 Exchange 状态,向主发送 DD 包,里面携带的是 LSDB 中 LSA 的摘要信息。主会等从发完摘要后,才进入 Exchange 状态,再把自己的 LSA 摘要发给从。
选举规则是:比较 router id,更大的一方成为主(Master)。比如 R1 的 id 是 1.1.1.1,R2 是 2.2.2.2,那么 R2 当选为主。
初期发的 DBD 包是空内容、未携带数据的,仅用于主从选举,而非传链路状态。主从选完才进入 Exchange 阶段传真实摘要。
序列号的作用是用于确认。
OSPF 用隐性确认,TCP 用显性确认。
隐性确认是 OSPF 的特色:选举主从前,R1、R2 各有自己序列号(如 x、y);主从选完后,从设备改用老大的序列号。比如老大发 y,从回 y,老大见自己发的 y 被回,就知对方收妥。这不像 TCP 专门回个确认号,而是借回显序列号间接确认。
4.3 七个状态小结
- Down:发送 Hello 包后进入下一个状态(Init)
- Init:初始化状态。在收到 Hello 包中包含了自己本地的 RID 时,则进入下一个状态
- Two-way:双向通信状态,标志着邻居关系的建立
- 条件匹配:只有匹配成功的设备之间才可以进入下一个状态,匹配失败则停留在邻居状态,仅用 Hello 包进行周期性保活
- ExStart:预启动状态。通过没有携带数据的 DBD 包进行主从关系的选举,比较 RID,RID 大的为主,为主可以优先获取 LSA 摘要信息
- Exchange:交换状态。通过使用携带数据的 DBD 包交换 LSDB 的摘要信息
- Loading:加载状态。通过使用 LSR、LSU、LSACK 来获取完整的未知的 LSA 信息
- Full:标志着邻接关系的建立
4.4 完整工作流程
顺利情况
启动 OSPF 的配置完成后,OSPF 协议向本地所有运行协议的接口以组播(224.0.0.5)的形式发送 Hello 包,Hello 包中携带了自己的 RID,以及本地已知邻居的 RID。之后,将收集到的邻居关系记录在一张表中——邻居表。
邻居关系建立完成后,进行条件匹配。失败则停留在邻居关系,仅使用 Hello 包进行保活;匹配成功,则开始建立邻接关系。
首先,使用未携带数据的 DBD 包进行主从关系选举;之后,使用携带数据的 DBD 包共享目录摘要信息;之后,基于 DBD 包,通过 LSR、LSU、LSACK 来获取未知的 LSA 信息,将所有的 LSA 信息保存到本地的 LSDB 数据库——数据库表。
最后,基于 LSDB,使用 SPF 算法进行计算,得到未知网段的路由信息,将其加载到路由表中。
收敛完成后,周期性发送 Hello 包进行保活,每 30min 进行一次周期更新。
不顺利情况:结构突变
结构突变测试最简单,只需新增网段、断开网段观察设备反应。
在 R1 后建环回口 Loopback1,配 192.168.1.1/24。刚创建环回时,R2、R3 学不到该网段,因为没宣告接口就不会激活,直连路由无法发布。必须宣告(激活)接口,才相当于突增网段并触发更新。
先配 router id 为 1.1.1.1,设备随即进入区域,无需额外操作就周期性发送 Hello 包,每 10 秒一次用于保活,目标地址是组播 224.0.0.5。
用 network 192.168.1.0 0.0.0.255 宣告接口后,立刻出现两个黑色包:LSU 包(链路状态更新)和 LSACK 包(链路状态确认)。它们是邻居建立或路由同步时的可靠交互包,区别于单纯保活的 Hello。
OSPF 里突然新增网段时,设备不用先建邻居,直接发 LSU 包通告,对方回 ACK;突然断开网段同理,删宣告后 R1 立刻发 LSU 告知邻接,对方回 ACK。这都叫触发更新,和 RIP 一样。
五、OSPF 的基本配置
划分:
### 5.1 启动 OSPF 进程
[R1]ospf 1 router-id 1.1.1.1
[R1-ospf-1]
5.2 创建区域
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]
5.3 宣告
宣告的意义:
[R1-ospf-1-area-0.0.0.0]network 1.1.1.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]network 12.0.0.0 0.0.0.255
反掩码:由连续的 0 和 1 组成,0 对应不可变位,1 对应可变位。0 在前,1 在后,并且 0 和 1 不能穿插使用。
六、三张表的查看
6.1 邻居表
查看:display ospf peer
(思科用 neighborhood,但华为为避免抄袭改用 display ospf peer,其中 peer 指对等体。)

MTU 是指数据链路层最大能携带的字节数,默认是 1500 字节。在配置里看到 MTU 后面写着 0,并不是说最大传输单元真的是零,而是因为华为设备默认没有开启 MTU 检测,所以显示为零。
查 OSPF 邻居关系时别直接看完整表,内容太多,用 brief 参数看简表就行。简表里只有关键信息:比如区域 0 中接口 0/0/0 的邻居 router id 是 2.2.2.2,状态为 FULL,说明 R1 和 2.2.2.2 已建立完整邻居关系。

6.2 数据库表
查看:display ospf lsdb
查看一条 LSA:display ospf lsdb router 2.2.2.2
查看完整一条 LSA 的方法是:执行 display ospf lsdb,加上 type 类型(如 router)和 link id(如 2.2.2.2),就能打开对应信息,内容较多。
6.3 路由表
观察 IP routing table 时,第一条经 OSPF 获取的路由显示目标网段 2.2.2.2、掩码为 32,这看起来奇怪,因为 R2 环回实际是 2.2.2.0/24。
OSPF 传递的是拓扑信息,设备能感知 R2 后连的是环回接口而非网段。环回接口仅作测试用、只有一个 IP,所以设备将其当作独立地址,掩码自动设为 32。
6.4 优先级
OSPF 在华为体系中默认的优先级为 10。
优先级取值范围 0–255,且数值越小优先级越高、数值越大反而越低。 10 仅次于直连,甚至高于静态路由,所以同去一个网段若静态和 OSPF 都配了,设备会选 OSPF,说明设备对 OSPF 的信任度比人工配置的静态还高。
6.5 开销值 cost
cost(开销值):OSPF 用带宽作为开销评判标准。开销和带宽是反向关系,带宽大反而开销小。
开销 = 参考带宽 ÷ 真实带宽,参考带宽默认是 100 兆。
真实带宽越大,分母越大,算出来的 cost 值反而越小。比如同样是 100 兆参考带宽,1000 兆链路 cost 是 0.1,100 兆链路 cost 是 1,所以真实带宽大的路径开销更小。
开销值不能按小数算,也不能等于 0。 比如链路开销是 0.1,设备会取 1 而非 0,所以三段 0.1 链路相加就是 1+1+1=3,底下两段相加为 1+1=2。
另外,小于 1 的小数(如 0.1、0.2)统一取 1;大于 1 的值(如 48.8、49.2)直接舍去小数取整数。这就是 OSPF 开销取整的规则,容易导致精度丢失和选路问题。
选路不佳就出现了:OSPF 会比较总开销,下面总开销 2 小于上面 3,仍会选下面,但实际可能并不优。
修改参考带宽:bandwidth-reference
[R1-ospf-1]bandwidth-reference ?

七、DR 与 BDR
7.1 三个角色
DR —— 指定路由器:在一个广播域内,DR 设备和其余所有设备建立邻接关系。
BDR —— 备份指定路由器:在一个广播域内,BDR 设备和其余设备建立的也是邻接关系。
BDR 是 DR 的备份,一旦 DR 故障需立刻顶上。若 BDR 只与其他设备建邻居而不建邻接,就无法掌握完整链路状态,备份失去意义。所以在同一广播域内,BDR 必须和其余设备保持邻接,才能确保 DR 失效时无缝接替。
在 OSPF 广播域里,DR 和 BDR 会与所有设备建立邻接关系。两台设备间必然是邻接;三台时一台为 DR、一台为 BDR,它们与各设备也都是邻接。
要看到非邻接的邻居关系,最少需四台设备:除 DR、BDR 外,剩下两台既非 DR 也非 BDR 的设备,它们之间只建邻居关系而非邻接。这些无角色设备称作 DRother。
DRother —— 其余没有角色的设备,它们之间建立邻居关系。
7.2 为什么需要选举
条件匹配:在一个广播域中,若所有设备均建立邻接关系,将会出现大量的重复更新,所以需要选举 DR 和 BDR,只让 DR 和 BDR 设备与其他设备建立邻接关系,其余所有 DRother 之间全部维持邻居关系即可。
7.3 选举规则
1. 先比较优先级,选择优先级大的设备作为 DR 设备,优先级次大的为 BDR,优先级默认都为 1。
[R2-GigabitEthernet0/0/0]ospf dr-priority ?
INTEGER<0-255> Router priority value
注意:如果将一个接口的优先级改为 0,则这个接口将不参与 DR 和 BDR 的选举。
2. 如果优先级相同,则比较 RID,RID 大的设备所对应的接口为 DR,次大的为 BDR。
DR 和 BDR 的选举是非抢占模式,即一旦选举成功,则不会因为后来加入的设备重新选举。
非抢占模式的选举时间为死亡时间。
选举异常的原因,往往不是选举规则本身有错,问题出在配置顺序上:先配 R2 再配 R3。先配的 R2 已完成 DR 和 BDR 选举并选定 DR;后配的 R3 即使 router id 更大、优先级更高,也无法抢占已选好的 DR。
DR/BDR 选举采用非抢占模式,即选完不重挑;与之相对的是抢占模式,若启用,R3 启动后优先级大就可从 R2 抢过 DR。因此,配置时序直接影响角色归属,而非仅看优先级或 ID。
OSPF 里 DR 和 BDR 选举是非抢占模式,一旦选举成功,不会因为后来加入设备而重新选举。
若新设备 router id 较大,进来后去抢 DR 角色,而选举发生在邻居关系完成、进入邻接关系前,这会干扰 LSA 交换,导致原本稳定网络出现波动。所以非抢占能避免扩容时的网络抖动。
在 OSPF 的非抢占模式下,DR 和 BDR 选举与死亡时间有关:在死亡时间内还能抢角色,一旦超过该时间角色确定就不能抢了。
可以验证该效果:让 R2 和 R3 重新启动 OSPF,只要在 40 秒(死亡时间)之内把两台设备都配置好,R3 对应接口就会成为 DR 设备。
OSPF 的 DR 选举是非抢占的,但这仅针对 router id 比较结果而言;修改接口优先级后,新优先级不会立刻抢占现有 DR,需等邻居关系重置才生效。
OSPF 路由器状态机卡在 ExStart 状态是正常的,原因在于邻居关系建立完成后,需进行 DR 和 BDR 的选举,此时短暂卡顿合理。
八、OSPF 的拓展配置
8.1 手工认证
[R1-GigabitEthernet0/0/0]ospf authentication-mode md5 1 plain 123456

邻居双方协商一个口令,口令对上才认数据包,不对上就丢弃,防黑客伪造。RIP 讲过这机制,OSPF 作为动态路由协议也要发包,所以同样支持手工认证。
authentication-mode 后面跟的参数里:simple 是明文认证,none 是空认证、不做认证。到了 OSPF 里会用 MD5 认证,它属于哈希算法的一种。
MD5:比如口令 123456,经 MD5 哈希算成固定长度的值,无法逆推回原口令,这就是哈希的特性。后面配置要输 KID,其中 K 即 KEY(钥匙),用来标识密钥。
simple、none、MD5 三种认证的区别:前两者分别明文和空认证,MD5 才做不可逆的哈希校验。
OSPF 接口认证机制:配置时看后面跟的是 plain 还是 cipher——plain 表示本地存储不加密,cipher 表示本地存储加密。
在接口上做认证、对端没做时,本端不认对方发来的数据包。观察路由表路由条目还在,但日志显示邻居从 full 状态变成 down 状态,即邻居关系断掉。用 display ospf peer 可见已无邻居;此时即便路由表暂有条目,因邻居没了,数据库里的东西也会随之失效。
在 R2 的 0/0/0 接口配置 OSPF 手工认证时,需用命令 interface 0/0/0、ospf authentication-mode 选 MD5、KID 两端都配 1,后面的 plain/cipher 仅本地有意义,可随意填。配完发 Hello 包重建邻居,R1 上 display ospf peer 看邻居、display ip routing-table 确认路由恢复。
另外,OSPF 手工汇总和静态、RIP 汇总不同:汇总只在传递路由信息且带子网掩码时才能做。
8.2 手工汇总
[R2-ospf-1-area-0.0.0.0]abr-summary 192.168.0.0 255.255.254.0
这是区域汇总。
OSPF 区域汇总只在区域之间发路由信息时才可做,区域内部传的是拓扑信息,不能汇总。比如区域零里的 R1、R2、R3,虽同属区域零,但内部没法汇总;只有像 R1 往其他区域发 192.168.0.0/24 和 1.0/24 这类路由时,才能合并成一条。
在 OSPF 里,区域间路由汇总要在 ABR(区域边界设备)上做,因为是 ABR 把区域零的路由发给区域一。
具体操作时,先进 OSPF 进程,再进区域零,敲命令 abr-summary 192.168.0.0 255.255.254.0,把区域零里两个网段汇总后发给区域一。
如果没在源头路由器(如 R1)宣告对应网段,路由发不出去,对方(如 R3)就学不到汇总路由。所以配完汇总还得确保网段已宣告。
命令里的掩码 255.255.254.0 对应 23 位,正好把连续两个 C 段网段聚成一条,这就是汇总的本质——减少区域间路由条目。
在路由宣告时可做范围宣告,把后续如 0.0、1.0、2.0 等网段都涵盖进去,实现灵活变更。
在 R3 的 OSPF 中,能看到学到的 0.0 和 1.0 实为汇总后的 0.0-23 网段,这是范围宣告后的聚合效果。而 R2 因还连着区域零,它本地学的是两条明细路由;只有向区域一发时才做汇总。
汇总仅在跨区域通告时发生,区域内仍传明细。
8.3 沉默接口
[R2-ospf-1]silent-interface GigabitEthernet 0/0/0
配置沉默接口要在 OSPF 进程下用 silent-interface 指定接口,用法和 RIP 完全一致。
8.4 加速收敛
加速收敛的本质是修改计时器时间。OSPF 的计时器主要指 Hello 时间和死亡时间。
修改 Hello 时间:
[R2-GigabitEthernet0/0/0]ospf timer hello ?
INTEGER<1-65535> Second(s)
修改死亡时间:
[R2-GigabitEthernet0/0/0]ospf timer dead ?
INTEGER<1-235926000> Second(s)
注意:
- 邻居双方的 Hello 时间和死亡时间必须相同,如果不同,则无法建立邻居关系
- Hello 时间修改,死亡时间自动按照倍数关系修改;而修改死亡时间,Hello 时间不会自动修改
Hello 时间不对,邻居关系会从 full 变成 down,之后 R1 和 R2 无法交换 LSA 信息,也就拿不到对方路由。
最后记得把 Hello 时间改回 10 秒恢复默认。
改时间可能导致邻居关系 DOWN 掉。
8.5 缺省路由
[R3-ospf-1]default-route-advertise
把一个设备配置成缺省源。
注意:需要保证边界设备有缺省路由,才可以自动下发,如果没有,则不下发。
[R3-ospf-1]default-route-advertise always
在边界设备没有缺省的时候,强制给内网下发缺省。
和 RIP 类似,可把某设备配成缺省源(如 R3),内网设备会自动下发指向它的缺省路由。不过 OSPF 与 RIP 的确认机制稍有不同。配置时进 OSPF 后敲 default-route-advertise 即可。
把某台设备(如 R3)配成缺省源后,其他设备(R1、R2)不会无条件收到缺省路由;前提是缺省源自身必须先有缺省路由。
网硕互联帮助中心





评论前必须登录!
注册