一、OSPF 存在的理由:与 RIP 的三维对比
讲义的切入点是三个维度------选路、收敛、占用资源。这三个维度就是"为什么要有 OSPF"的全部答案。
| 维度 | RIP 的表现 | OSPF 的表现 | 谁更优 |
|---|---|---|---|
| 选路 | 距离矢量,以跳数为度量,只看"经过几台设备",不看链路快慢 | 链路状态,先收集拓扑、再用 SPF 算最短路 ;以带宽为度量 | OSPF 完胜 |
| 收敛 | 计时器长(30/180/120s),收敛慢,靠"传闻"逐跳传 | 计时器短(Hello 10s / Dead 40s),拓扑一变立刻触发更新 | OSPF 更好 |
| 占用资源 | 传的是路由信息 ,单个报文小;但30s 一次高频周期更新,长期开销大 | 传的是拓扑信息 ,单个报文大;但不做高频周期更新(仅 30min 一次),且设计了大量优化机制 | 整体上 OSPF 略优 |
1. 选路:为什么 OSPF 不会出环
链路状态型协议的解题步骤:
① 每台路由器收集全网 LSA(拓扑信息)
② 拼出完整的拓扑图(LSDB)
③ 以自己为根,用 SPF(Dijkstra)算出一棵最短路径树
④ 依树生成路由表
树形结构天生无环 ------因为树上任意两点之间只有唯一路径。这是链路状态协议与距离矢量协议最本质的差别:RIP 是"听邻居说",OSPF 是"自己画地图再算路"。
同时,OSPF 用带宽算 Cost,能反映链路优劣。RIP 用跳数,一条 10G 链路和一条 1M 链路在它眼里一样"便宜",这是它选路不佳的根本原因。
2. 收敛:为什么 OSPF 更快
| 环节 | RIP | OSPF |
|---|---|---|
| 邻居探测 | 靠 30s 周期报文"间接"感知 | 靠 Hello 10s 主动探测,Dead 40s(4 倍)判定失效 |
| 拓扑变化 | 触发更新 + 逐跳"传闻",可能计数到无穷 | 变化点直接泛洪 LSA,全网同时重算 SPF |
| 失效判定 | 180s 才判失效 | 40s 即判失效 |
一句话:RIP 收敛慢在"要等很久才知道出事了 "和"要靠邻居一个个传话"。
3. 占用资源:为什么"单个报文大"却"整体更省"
-
单包角度 :RIP 一个报文最多 25 条路由(504 字节),很小;OSPF 的 LSU 要装 LSA,报文明显更大。所以单包 OSPF 吃亏。
-
长期角度 :RIP 每 30 秒 把整张路由表重发一遍,一天 2880 次;OSPF 收敛完成后只发 Hello(很小)保活,LSA 每 30 分钟才刷新一次(1800 秒),且只在变化时泛洪。
-
加上 OSPF 的区域划分、DR/BDR、组播、LSA 老化等优化机制,整体资源占用 OSPF 略优。
二、OSPF 基础认知
1. 名称与版本
OSPF = Open Shortest Path First,开放式最短路径优先协议。
| 版本 | 适用 | 说明 |
|---|---|---|
| OSPFv1 | --- | 实验室阶段夭折,从未实际部署 |
| OSPFv2 | IPv4 | 本课主体 |
| OSPFv3 | IPv6 | 报文结构变化较大,靠 Link-Local 地址建邻居 |
"开放式"指它是由 IETF 制定的公开标准,任何厂商都能实现,不像 EIGRP 早期是思科私有。
2. 关键参数(必背)【补充】
| 项目 | 取值 |
|---|---|
| 协议号 | IP 协议号 89 (直接封装在 IP 之上,不用 TCP/UDP) |
| 组播地址 | 224.0.0.5 (AllSPFRouters,所有 OSPF 路由器都监听) 224.0.0.6 (AllDRouters,只有 DR/BDR 监听) |
| 华为默认优先级(Preference) | 10(优于 RIP 的 100,同样路由 OSPF 必赢) |
| 度量 | Cost = 参考带宽 / 接口带宽 |
| 参考带宽 | 默认 100 Mbps |
| Hello 时间 | 10s(广播 / P2P 网络) |
| Dead 时间 | 4 × Hello = 40s |
| LSA 刷新周期 | 1800s(30 分钟) |
3. 进程与 Router ID
-
ospf 1中的1是本地进程号 ,只在本机有效,两端进程号不同也能建邻居。 -
Router ID(RID) :用于在 OSPF 域内唯一标识一台路由器,格式与 IP 地址一致(点分十进制)。
RID 的两个要求 :① 全网唯一 ;② 格式统一(点分十进制)。
RID 的选举顺序(重要):
| 优先级 | 来源 | 说明 |
|---|---|---|
| ① 最高 | 手工配置 router-id 1.1.1.1 |
只要满足"唯一 + 格式合法"即可,不要求是本机真实 IP |
| ② 次之 | 环回接口中最大的 IP | 设备配了 Loopback 就选它 |
| ③ 最后 | 物理接口中最大的 IP | 没有环回口时使用 |
【补充】RID 一旦选定,修改后必须重启 OSPF 进程才生效 (
reset ospf process)。生产环境强烈建议手工指定,否则接口 IP 变动会导致 RID 跳变、邻居重建。
三、OSPFv2 与 RIPv2 的异同
1. 相同点(三条)
| # | 相同点 | 说明 |
|---|---|---|
| ① | 都是无类别路由协议 | 都支持 VLSM (变长子网掩码)和 CIDR(无类域间路由) |
| ② | 都用组播发送 | RIP 用 224.0.0.9;OSPF 用 224.0.0.5 / 224.0.0.6 |
| ③ | 都支持等开销负载均衡 | 默认最多 4 条(可调) |
【补充】"无类别"是相对 RIPv1 而言的:RIPv1 属于有类协议,通告路由不携带掩码,只能按 A/B/C 主类识别网络,因此不支持 VLSM、不支持不连续子网。RIPv2 与 OSPFv2 都携带掩码,没有这些限制。
2. 不同点(一条,但决定一切)
| 协议 | 适用规模 |
|---|---|
| RIP | 中小型网络 |
| OSPF | 中大型网络 |
为什么规模不同? 因为 RIP 有 15 跳的硬上限、收敛慢、且按跳数选路;而 OSPF 若要支撑大型网络,就必须解决"拓扑信息太多、SPF 计算太慢"的问题------于是有了结构化部署:区域划分。
四、区域划分(OSPF 的结构化部署)
1. 单区域与多区域
| 类型 | 说明 |
|---|---|
| 单区域 OSPF | 全网只有一个区域,所有路由器 LSDB 完全一致 |
| 多区域 OSPF | 划分为多个区域,区域内维护完整拓扑,区域间只传路由 |
2. 区域划分的目的(核心一句话)
区域内部传递拓扑信息,区域之间传递路由信息。
这句话的深层含义:
-
区域内 :所有路由器 LSDB 一致,跑 SPF,知道每一条链路------这是链路状态特征。
-
区域间 :ABR 把"我这边有哪些网段"汇总成 Type 3 LSA 发出去,对方只知道"能到",不知道内部拓扑 ------这实际上是距离矢量的特征。
所以说 OSPF 是"链路状态型协议带了一点距离矢量的特征 "。这也解释了为什么区域划分能减小 LSDB 规模、降低 SPF 计算压力:把大图切成小图,图与图之间只交换结论,不交换细节。
3. ABR ------ 区域边界路由器
定义 :一个接口属于一个区域 ;同时连接两个及以上区域的路由器称为 ABR(Area Border Router)。
-
区域之间可以存在多个 ABR(提供冗余)。
-
ABR 是区域间路由的"翻译官":把区域 A 的拓扑翻译成路由,注入区域 B。
【补充】路由器角色完整版:
角色 判定 内部路由器 IR 所有接口在同一区域 骨干路由器 BR 至少一个接口在 Area 0 ABR 同时连接骨干区域和至少一个非骨干区域 ASBR 引入外部路由(如静态、直连、其他协议)的路由器
4. 区域划分的两条硬性要求
| # | 要求 | 解释 |
|---|---|---|
| ① | 区域之间必须存在 ABR 设备 | 没有 ABR,两个区域就是两座孤岛,路由传不过去 |
| ② | 必须按星型拓扑划分 | 中间的区域叫骨干区域 ,其余所有非骨干区域都必须围绕骨干区域 ,且必须直连骨干 |
┌──────────┐
│ Area 0 │ ← 骨干区域(星型中心)
└──┬────┬──┘
┌─────┘ └─────┐
┌────▼───┐ ┌────▼───┐
│ Area 1 │ │ Area 2 │ ← 非骨干区域必须直连 Area 0
└────────┘ └────────┘
【补充】如果某个非骨干区域无法物理直连骨干区域,可用 Virtual Link(虚连接) 逻辑上"拉一条线"到骨干区域,属于过渡方案。
5. 区域 ID
| 项目 | 内容 |
|---|---|
| 长度 | 32 位二进制 |
| 表示 | 十进制(0、1)或点分十进制 (0.0.0.0、0.0.0.1) |
| 骨干区域 | 固定为 0 (0.0.0.0) |
注意:区域 ID 长得像 IP 地址,但它不是 IP 地址,只是 32 位编号。
五、OSPF 的五种数据包
OSPF 不用 TCP/UDP,五种报文直接封装在 IP 报文中(协议号 89)。
| # | 报文 | 全称 | 作用 | 讲义里的比喻 |
|---|---|---|---|---|
| 1 | Hello | Hello Packet | 周期性发现、建立、保活邻居关系 | 打招呼 |
| 2 | DBD / DD | Database Description | 数据库描述报文 ,描述本地 LSDB 中 LSA 的摘要(不是完整 LSA) | "菜单" |
| 3 | LSR | Link State Request | 链路状态请求报文 ,基于 DBD 摘要,请求自己未知的 LSA | "点菜" |
| 4 | LSU | Link State Update | 链路状态更新报文 ,真正携带 LSA 数据的报文 | "上菜" |
| 5 | LSACK | Link State Acknowledgment | 链路状态确认报文,确认收到 LSU | 签收 |
记忆链条:Hello 打招呼 → DBD 递菜单 → LSR 点菜 → LSU 上菜 → LSACK 签收。这五步正好对应后面的状态机。
1. Hello 报文详解【补充】
Hello 报文虽然是"最小"的报文,但它携带的参数决定了能不能建邻居:
| 字段 | 含义 | 不一致的后果 |
|---|---|---|
| Router ID | 发送者身份 | 不导致失败,但影响选举 |
| Area ID | 所属区域 | 必须一致,否则建不了邻居 |
| Hello Interval | Hello 周期 | 必须一致 |
| Router Dead Interval | 死亡时间(4×Hello) | 必须一致 |
| Router Priority | DR 选举优先级 | 影响 DR/BDR 归属 |
| Network Mask | 接口掩码 | 广播网络下必须一致 |
| DR / BDR | 本网段 DR/BDR 的接口地址 | 用于选举 |
| Neighbor | 已知邻居的 RID 列表 | Init → 2-Way 的关键 |
| Authentication | 认证类型与口令 | 必须一致 |
| Stub 标志 | 区域是否为 Stub | 必须一致 |
邻居建不起来的 90% 原因,都在这张表里:Area ID 不一致、Hello/Dead 不一致、认证不一致、掩码不一致、Stub 标志不一致、网络类型不一致、MTU 不一致(MTU 在 ExStart 才检查)。
2. Hello 与 Dead 的关系
Hello Interval = 10s(默认)
Router Dead Interval = 4 × Hello = 40s
含义:40 秒内一个 Hello 都没收到,就判定邻居失效,立即断开邻居关系并重新计算。
【补充】华为设备不同网络类型的默认计时器:
网络类型 Hello Dead Broadcast(广播,以太网默认) 10s 40s Point-to-Point(P2P) 10s 40s NBMA 30s 120s P2MP 30s 120s
3. OSPF 的周期更新
OSPF 存在每 30 分钟一次的周期更新。
【补充】30 分钟不是"重发路由",而是 LSA 老化到 1800s(LS Refresh Time)时由产生者重新泛洪一次 ,用来防止 LSA 老死。LSA 的 MaxAge 是 3600s ,超过就失效删除。所以 OSPF 的"周期更新"是按 LSA 刷新,不是 RIP 那种"整表重发"。
六、OSPF 的七个状态机(本天最难,也是最爱考)
1. 状态总表
| # | 状态 | 名称 | 触发条件 / 发生了什么 | 是否稳定态 |
|---|---|---|---|---|
| 1 | Down | 关闭 | 刚启动,发送 Hello 后进入下一状态 | --- |
| 2 | Init | 初始化 | 收到 Hello 报文中包含自己的 RID 时,进入下一状态 | --- |
| 3 | Two-Way | 双向通信 | 标志"邻居关系"建立 ;此阶段做条件匹配 | ✔ 稳定态① |
| 4 | ExStart | 预启动 | 用不带数据的 DBD 进行主从选举,比较 RID | --- |
| 5 | Exchange | 交换 | 用携带数据的 DBD 交换 LSDB 的摘要信息 | --- |
| 6 | Loading | 加载 | 用 LSR / LSU / LSACK 获取完整的未知 LSA | --- |
| 7 | Full | 完全邻接 | 标志"邻接关系"建立,LSDB 已同步 | ✔ 稳定态② |
2. 邻居关系 vs 邻接关系(最容易混)
| 邻居关系(Neighbor) | 邻接关系(Adjacency) | |
|---|---|---|
| 对应状态 | 停在 Two-Way | 走到 Full |
| 含义 | 只是"互相看得见、能通 Hello" | "LSDB 完全同步" |
| 交换内容 | 只有 Hello | Hello + DBD + LSR + LSU + LSACK |
| 是否交换 LSA | 不交换 | 交换 |
一句话:邻居是"认识",邻接是"交底"。 认识的人很多(邻居),真正交底的没几个(邻接)。
3. 条件匹配(Two-Way 之后的"关卡")
只有匹配成功的设备之间才可以进入下一个状态;匹配失败则停留在邻居状态,仅用 Hello 包进行周期性保活。
这是讲义反复强调的一句,含义是:
-
两台设备 Hello 参数一致 → 通过条件匹配 → 继续 ExStart → ... → Full(建立邻接)
-
两台设备"不够格"互相同步 LSDB(例如同一广播域里的两台 DROther )→ 停在 Two-Way,只发 Hello 保活
所以看到
display ospf peer里两台 DROther 之间是2-Way,是正常现象,不是故障。
4. ExStart:主从关系选举
怎么选 :双方发送没有携带数据的 DBD 包 ,比较 Router ID ,RID 大的成为 Master(主)。
为什么非要选主从?
主从关系选举主要是为了错开 LSA 摘要信息的交换过程,减少同一时间的资源占用。
具体做法:由 Master 统一控制 DBD 的序列号(Slave 只能回应 Master 的序号),把"双方同时猛发报文"变成"一问一答的串行过程",避免报文风暴、避免重复发送。
讲义原图(ExStart / Exchange)
R1 (RID 1.1.1.1) R2 (RID 2.2.2.2)
│ │
│ DD(内容为空,序列号 X) │
│ 我是 Master,我的 Router-ID 是 1.1.1.1 │
├─────────────────────────────────────────►│ Ex-start
│ │
│ DD(内容为空,序列号 Y) │
│ 我是 Master,我的 Router-ID 是 2.2.2.2
│◄─────────────────────────────────────────┤
│ │
│ ← 比较 RID,2.2.2.2 更大 → R2 为 Master │
│ │
│ DD(序列号 Y)这是我的 LSDB 中的 LSA 摘要信息
│◄─────────────────────────────────────────┤ Exchange
│ DD(序列号 Y+1)这是我的 LSDB 中的 LSA 摘要信息
├─────────────────────────────────────────►│
注意:双方一开始都自称 Master ,选举结果靠比较 RID 得出。在 Exchange 阶段双方交换 DD 报文,用于描述自己所拥有的 LSA 的摘要信息。
5. Exchange 与 Loading
-
Exchange :交换的是摘要 (相当于给菜单),此时双方都还不知道对方具体有哪些 LSA 的内容。
-
Loading :根据摘要比对出"我缺哪些",用 LSR 请求 → LSU 送完整 LSA → LSACK 确认,逐条补齐。
讲义原图(Loading)
R1 (RID 1.1.1.1) R2 (RID 2.2.2.2)
│ LSR 我要请求 xx LSA 的完整信息 │
├─────────────────────────────────────────►│ Loading
│ LSU 这是你请求的 xx LSA 的完整信息 │
│◄─────────────────────────────────────────┤
│ LS ACK 确认收到 LSU │
├─────────────────────────────────────────►│
│ LSR 我要请求 yy LSA 的完整信息 │
├─────────────────────────────────────────►│
│ ……(重复,直到补齐) │
▼ ▼
Full:我和 R2 的 LSDB 同步了 Full:我和 R1 的 LSDB 同步了
最后一句"我和 R2 的 LSDB 同步了 "就是 Full 的定义:双方数据库完全一致。
6. 状态机速记口诀
Down(哑)→ Init(听到你提我)→ 2-Way(互相认识)→ ExStart(选老大)
→ Exchange(对菜单)→ Loading(点菜上菜)→ Full(交底完成)
两个稳定态 :2-Way(邻居)、Full(邻接)。两个"容易卡住"的状态 :2-Way(条件匹配失败)、ExStart(MTU 不一致 / 主从选举失败)。
七、OSPF 的工作过程(全景串联)
1. 从启动到收敛(讲义原文逻辑 + 注释)
① 启动 OSPF 进程,配置完成
↓
② 向本地所有运行 OSPF 的接口,以组播 224.0.0.5 发送 Hello 包
(Hello 中携带自己的 RID,以及本地已知邻居的 RID)
↓
③ 把收集到的邻居关系记录在「邻居表」
↓
④ 邻居关系建立后 → 条件匹配
├─ 匹配失败 → 停留在邻居状态,只用 Hello 保活
└─ 匹配成功 → 开始建立邻接关系
↓
⑤ 用「不带数据的 DBD」进行主从选举(比 RID,大者为 Master)
↓
⑥ 用「携带数据的 DBD」共享目录摘要信息
↓
⑦ 基于 DBD,用 LSR / LSU / LSACK 获取未知的 LSA
↓
⑧ 所有 LSA 存入本地「LSDB 数据库表」
↓
⑨ 基于 LSDB,用 SPF 算法计算 → 得到未知网段的路由 → 加载到「路由表」
↓
⑩ 收敛完成:周期发送 Hello 保活,每 30 分钟刷新一次 LSA
2. 三张表(OSPF 的核心数据结构)
| 表 | 内容 | 查看命令 |
|---|---|---|
| 邻居表 | 谁是我的邻居、处于什么状态 | display ospf peer |
| LSDB(数据库表) | 全网所有 LSA(拓扑) | display ospf lsdb |
| 路由表 | SPF 算出来的最优路由 | display ip routing-table / display ospf routing |
三张表的关系:邻居表 →(交换 LSA)→ LSDB →(SPF 计算)→ 路由表。
3. 结构突变的四种情况
| # | 情况 | OSPF 的反应 |
|---|---|---|
| 1 | 突然新增一个网段 | 产生新的 LSA,立即泛洪 → 全网重算 SPF |
| 2 | 突然断开一个网段 | 产生更新的 LSA(或 MaxAge 撤销),立即泛洪 |
| 3 | 无法通信(Dead Time 到期) | 40s 未收到 Hello → 判定邻居失效 → 删除邻居、重算 |
| 4 | (隐含)接口状态变化 | 接口 UP/DOWN 引起 LSA 变化,同样触发泛洪 |
【补充】这四种都属于触发更新 :OSPF 不需要像 RIP 那样等周期,拓扑一变立即用 LSU 泛洪,这是它收敛快的关键。
八、DR 与 BDR(指定路由器与备份指定路由器)
1. 三种角色
| 角色 | 全称 | 行为 |
|---|---|---|
| DR | Designated Router,指定路由器 | 在一个广播域内,与其余所有设备建立邻接关系 |
| BDR | Backup Designated Router,备份指定路由器 | 在一个广播域内,也与其余设备建立邻接关系(随时接管 DR) |
| DROther | 其余没有角色的设备 | 它们之间只建立邻居关系(互相停在 2-Way) |
2. 为什么需要 DR/BDR(条件匹配的由来)
在一个广播域中,若所有设备均建立邻接关系,将出现大量的重复更新。
算一笔账:一个广播域里有 n 台路由器,全互联需要 n(n-1)/2 条邻接关系。
| 设备数 n | 全互联邻接数 | 有 DR/BDR 后 |
|---|---|---|
| 3 | 3 | 3 |
| 5 | 10 | 7 |
| 10 | 45 | 17 |
| 20 | 190 | 37 |
解决办法 :只让 DR 和 BDR 与其他设备建立邻接 ,其余 DROther 之间全部维持邻居关系即可。
无 DR:全互联(n(n-1)/2 条) 有 DR/BDR:星型(2(n-2)+1 条)
R1 ──── R2 R1 ─┐
│ ╲ ╱ │ ├── DR
│ ╳ │ R2 ─┤
│ ╱ ╲ │ R3 ─┘ (BDR 同时与所有设备邻接)
R3 ──── R4
好处有三:① 邻接数量从 O(n²) 降到 O(n);② LSA 泛洪只往 DR/BDR 发,减少重复;③ SPF 计算压力下降。
3. 选举规则(两步)
| 顺序 | 比较项 | 规则 |
|---|---|---|
| ① | 接口 DR 优先级(priority) | 越大越优 ;默认 1 ;范围 0~255 |
| ② | 优先级相同 时比 Router ID | RID 大的 当选 DR,次大的当选 BDR |
关键细节
-
优先级改为 0 的接口不参与 DR/BDR 选举(常用于让某台设备永远不当 DR)。
-
选举只在广播网络和 NBMA 网络 进行;P2P、P2MP 网络不选举。
-
选举发生在 Two-Way 之后、ExStart 之前 ;广播网络会等一个 Wait Timer(= Dead Time 40s) 再定论,给后到的设备留出参与机会。
4. 非抢占模式(重要考点)
DR 和 BDR 的选举是非抢占模式 ------一旦选举成功,不会因为后来加入的设备(哪怕优先级更高)而重新选举。
-
后加入的设备只能当 DROther。
-
想抢回 DR,只能让原 DR 失效(重启、接口 down),或手动
reset ospf process。 -
非抢占模式的选举时间为死亡时间(40s)。
记忆:DR 是"终身制",除非它自己倒下,否则新人再强也得排队。
5. 组播地址的使用【补充】
| 发送者 | 目的地址 | 说明 |
|---|---|---|
| DROther → DR/BDR | 224.0.0.6(AllDRouters) | 只有 DR/BDR 监听这个地址 |
| DR → 所有设备 | 224.0.0.5(AllSPFRouters) | 所有人监听 |
| 首次发现(Hello) | 224.0.0.5 | 此时还不知道谁是 DR |
讲义写"224.0.0.5 和 224.0.0.6(DR 和 BDR 监听)",准确说是:所有 OSPF 路由器都监听 224.0.0.5,只有 DR/BDR 额外监听 224.0.0.6。
九、开销(Cost)与选路
1. Cost 的计算公式
Cost = 参考带宽 / 接口带宽
-
参考带宽默认 100 Mbps (即
100M)。 -
计算结果是整数 ,不足 1 按 1 计。
举例(参考带宽 100M)
| 接口带宽 | 计算 | 实际 Cost |
|---|---|---|
| 10 Mbps | 100/10 | 10 |
| 100 Mbps | 100/100 | 1 |
| 1000 Mbps(GE) | 100/1000 = 0.1 | 1(不足 1 按 1) |
| 10000 Mbps(10GE) | 100/10000 = 0.01 | 1 |
2. 参考带宽必须改大(实战要点)【补充】
上面的表暴露了一个问题:GE 和 10GE 的 Cost 都是 1 ,OSPF 就分不出千兆和万兆谁更快了------高速链路"带宽优势"被抹平。
解决办法:把参考带宽改大,让高速链路的差异体现出来。
[R1-ospf-1] bandwidth-reference 10000 // 参考带宽改为 10000 Mbps(10G)
改完后:GE = 10000/1000 = 10 ,10GE = 10000/10000 = 1,差异就出来了。
注意 :参考带宽建议全网统一 (同一 OSPF 域内保持一致),否则各设备算出的 Cost 不可比,会算出奇怪的路径。 【补充】环回口(Loopback)在 OSPF 中 Cost 默认为 0 ,且以 /32 主机路由发布------这也是它常被用作 RID 来源和测试地址的原因。
3. OSPF 的路由类型【补充】
| 路由标记 | 类型 | 产生者 | 含义 |
|---|---|---|---|
| O | 区域内路由 | 区域内 | 通过 Type 1/2 LSA 算出,最可信 |
| O IA | 区域间路由(Inter-Area) | ABR | 通过 Type 3 LSA 学到 |
| O ASE1 / ASE2 | 外部路由 | ASBR | 通过 Type 5(或 7)LSA 学到 |
ASE1 与 ASE2 的区别(常考)
| 类型 | Cost 计算 | 默认 |
|---|---|---|
| ASE1 | 外部 Cost + 内部到达 ASBR 的 Cost | 否 |
| ASE2 | 只算外部 Cost,不算内部开销 | ✔ 默认 Type 2 |
选路优先级(同目的网段) :区域内 > 区域间 > 外部(ASE1 > ASE2)。
【补充】再叠加"优先级(Preference)":OSPF 内部路由 Pre = 10,OSPF 外部(ASE)路由 Pre = 150。所以 OSPF 外部路由打不过静态路由(60),但能打过 RIP(100)------这类"Pre 对比"是经典考点。
十、LSA 与 LSDB【补充】(讲义只提到名词,这里补齐)
OSPF 用 LSA(Link State Advertisement,链路状态通告) 描述拓扑,所有 LSA 汇总成 LSDB。常见的六类:
| 类型 | 名称 | 产生者 | 传播范围 | 描述内容 |
|---|---|---|---|---|
| Type 1 | Router LSA(路由器 LSA) | 每台路由器 | 本区域 | 自己的接口、邻居、链路开销 |
| Type 2 | Network LSA(网络 LSA) | DR | 本区域 | 广播网段的子网信息 + 该网段上的路由器列表 |
| Type 3 | Summary LSA(网络汇总) | ABR | 其他区域 | 把区域内网段"翻译"成路由通告出去 |
| Type 4 | ASBR Summary LSA | ABR | 除 ASBR 所在区域外 | 告诉其他区域"ASBR 在哪里" |
| Type 5 | AS External LSA(外部 LSA) | ASBR | 全网(除特殊区域) | 引入的外部路由(静态/直连/其他协议) |
| Type 7 | NSSA External LSA | ASBR(在 NSSA 内) | 仅本 NSSA | NSSA 区域内的外部路由,到 ABR 转成 Type 5 |
LSDB 中一条 LSA 的唯一标识(三元组)
LS Type(类型) + Link State ID(链路状态 ID) + Advertising Router(通告者 RID)
这三个字段共同唯一确定一条 LSA。所以
display ospf lsdb router 2.2.2.2就是在查"Type 1 + 通告者是 2.2.2.2"那条 LSA。
区域类型(了解即可,进阶内容)
| 区域类型 | 允许的 LSA | 特点 |
|---|---|---|
| 普通区域 | 1/2/3/4/5 | 默认 |
| Stub | 1/2/3 | 不接收 Type 4/5,ABR 下发一条默认路由代替外部路由 |
| Totally Stub | 1/2 + 一条默认 | 连 Type 3 都不接收 |
| NSSA | 1/2/3/7 | 不允许 Type 5,但允许 Type 7(自己引入外部路由) |
| Totally NSSA | 1/2/7 + 默认 | NSSA + 过滤 Type 3 |
十一、OSPF 基础配置
1. 三个步骤
[R1] ospf 1 router-id 1.1.1.1 // ① 启动 OSPF 进程并指定 RID
[R1-ospf-1] area 0 // ② 创建(进入)区域 0
[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
视图层级要记清:
[R1]→[R1-ospf-1](进程视图)→[R1-ospf-1-area-0.0.0.0](区域视图)。network 是在区域视图下敲的,这正是"接口属于区域"的体现。
2. 宣告的两大意义(与 RIP 完全一致)
| 意义 | 说明 |
|---|---|
| ① 激活接口 | 只有被激活的接口才可以收发 OSPF 数据包 |
| ② 发布路由 | 只有被激活接口所对应的直连路由信息才可以被发布 |
所以"为什么邻居起不来"的第一排查项就是:接口有没有被 network 覆盖到。
3. 反掩码(Wildcard Mask)------ 必须搞懂的坑
network 12.0.0.0 0.0.0.255 里最后那段 不是子网掩码,是反掩码。
| 规则 | 说明 |
|---|---|
| 构成 | 由连续的 0 和连续的 1 组成 |
| 0 | 对应不可变位(必须精确匹配) |
| 1 | 对应可变位(任意值都行) |
| 顺序 | 0 在前,1 在后 ,且 0 和 1 不能穿插使用 |
对照表
| 子网掩码 | 反掩码 | 作用范围 |
|---|---|---|
| 255.255.255.255(/32) | 0.0.0.0 | 精确匹配一个地址 |
| 255.255.255.0(/24) | 0.0.0.255 | 匹配一个 /24 网段 |
| 255.255.254.0(/23) | 0.0.1.255 | 匹配一个 /23 网段 |
| 255.255.0.0(/16) | 0.0.255.255 | 匹配一个 /16 网段 |
| 0.0.0.0(/0) | 255.255.255.255 | 匹配全部 |
换算技巧:反掩码 = 255.255.255.255 − 子网掩码 (逐字节相减)。 常见错误:
network 12.0.0.0 255.255.255.0(写成子网掩码)→ 反掩码不连续合法?实际上 255.255.255.0 也是连续的 1 后跟 0,语法能通过但语义完全相反 ,会把 12.0.0.x 里的可变位当成前 24 位 ,等于宣告了0.0.0.0/0之外的一大片错误范围,务必避免。
4. 完整配置示例【补充】
拓扑 :AR1(1.1.1.0/24、12.0.0.0/24)--- AR2(12.0.0.0/24、2.2.2.0/24),Area 0
# AR1
[R1] interface GigabitEthernet0/0/0
[R1-GigabitEthernet0/0/0] ip address 12.0.0.1 24
[R1-GigabitEthernet0/0/0] quit
[R1] interface GigabitEthernet0/0/1
[R1-GigabitEthernet0/0/1] ip address 1.1.1.1 24
[R1-GigabitEthernet0/0/1] quit
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 0
[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
# AR2
[R2] interface GigabitEthernet0/0/0
[R2-GigabitEthernet0/0/0] ip address 12.0.0.2 24
[R2-GigabitEthernet0/0/0] quit
[R2] interface GigabitEthernet0/0/1
[R2-GigabitEthernet0/0/1] ip address 2.2.2.1 24
[R2-GigabitEthernet0/0/1] quit
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 2.2.2.1 0.0.0.0
[R2-ospf-1-area-0.0.0.0] network 12.0.0.0 0.0.0.255
5. 验证命令
| 命令 | 作用 |
|---|---|
display ospf peer |
查看邻居表(状态、DR/BDR 归属、Dead 倒计时) |
display ospf peer brief |
查看邻居关系简表(一眼看全所有邻居状态) |
display ospf lsdb |
查看数据库表(所有 LSA) |
display ospf lsdb router 2.2.2.2 |
查看一条具体 LSA(这里是 2.2.2.2 产生的 Type 1) |
display ospf interface |
查看 OSPF 接口参数(Cost、网络类型、DR、Hello/Dead)【补充】 |
display ospf routing |
查看 OSPF 算出的路由表【补充】 |
display ospf brief |
查看进程概览(RID、区域、SPF 次数)【补充】 |
display ospf error |
查看 OSPF 错误统计,排错神器【补充】 |
正常输出示例
[R1] display ospf peer brief
OSPF Process 1 with Router ID 1.1.1.1
Peer Statistic Information
----------------------------------------------------------------------------
Area Id Interface Neighbor id State
0.0.0.0 GigabitEthernet0/0/0 2.2.2.2 Full
----------------------------------------------------------------------------
看到 Full 才叫"邻接成功"。如果卡在 2-Way 且对端是 DROther,属正常;如果卡在 ExStart ,优先查 MTU。
十二、OSPF 的扩展配置(五项)
1. 手工认证
[R1-GigabitEthernet0/0/0] ospf authentication-mode md5 1 plain 123456
参数拆解
| 参数 | 含义 |
|---|---|
md5 |
认证算法(也可 simple 明文、hmac-sha256 等) |
1 |
Key ID(密钥号),双方必须一致 |
plain |
本地存储时口令不加密(配置里能看到明文) |
cipher |
本地存储时口令加密(配置里显示乱码) |
123456 |
认证口令 |
要点
-
认证信息携带在 Hello 报文中 ,所以认证不一致 → 邻居根本建不起来(连 Init 都到不了)。
-
两端必须:算法一致 + Key ID 一致 + 口令一致。
-
plain/cipher只影响本地存储方式,不影响互通。
2. 手工汇总(区域汇总)
[R2-ospf-1-area-0.0.0.0] abr-summary 192.168.0.0 255.255.254.0
-
命令在 区域视图 下配置,只能在 ABR 上做(因为是"区域间"汇总)。
-
作用:把多条明细的 Type 3 LSA 合并成一条,减小其他区域的 LSDB 和路由表。
【补充】与 RIP 汇总的关键差别:OSPF 汇总不需要配 NULL0 空接口路由 。因为 OSPF 汇总后,ABR 上仍保留明细路由(明细在 LSDB 里),不会出现"汇总了却找不到出口"的情况;而 RIP 汇总会丢掉明细,才需要 NULL0 兜底。 【补充】还有
asbr-summary(ASBR 上汇总外部路由,影响 Type 5 LSA)。
3. 沉默接口(Silent-Interface)
[R2-ospf-1] silent-interface GigabitEthernet0/0/0
-
只接收、不发送 OSPF 报文(不建立邻居、不发 Hello)。
-
适用:连接用户终端的网段 (下联 PC/服务器),不需要跑 OSPF,但该网段仍需被发布。
-
命令在进程视图下配。
与 RIP 的沉默接口完全同构:不发报文,但照常发布该网段的直连路由。
4. 加速收敛(改计时器)
[R2-GigabitEthernet0/0/0] ospf timer hello 10 // 修改 hello 时间
[R2-GigabitEthernet0/0/0] ospf timer dead 40 // 修改死亡时间
两条铁律(考点)
| # | 规则 |
|---|---|
| ① | 邻居双方的 Hello 时间和 Dead 时间必须相同 ,不同则无法建立邻居关系 |
| ② | 改 Hello 时间,Dead 时间会自动按倍数关系(4 倍)修改;改 Dead 时间,Hello 时间不会自动改 |
所以最稳的做法:只改 hello ,让 dead 自动跟随;或者两边同时把两个值都改对。 【补充】计时器在接口视图下配置(因为 Hello 是按接口发的),不是进程视图。
5. 缺省路由下发
[R3-ospf-1] default-route-advertise // 把设备配成"缺省源"
[R3-ospf-1] default-route-advertise always // 强制下发
| 命令 | 行为 |
|---|---|
default-route-advertise |
需要保证边界设备自己已有缺省路由 ,才会自动向下发;没有则不下发 |
default-route-advertise always |
即使边界设备自己没有缺省路由,也强制给内网下发 |
典型场景:企业出口 R3 上联 ISP,先配
ip route-static 0.0.0.0 0 200.1.1.1,再在 OSPF 里default-route-advertise,内网所有路由器自动学到默认出口。 【补充】对比 RIP 的同名功能:RIP 的default-route originate没有always这种强制模式,而 OSPF 有------这是两者一个细微但常考的差异。
十三、排错:邻居起不来怎么查
排查顺序:先看状态停在哪,再对症下药。
| 卡在哪个状态 | 最可能原因 | 排查手段 |
|---|---|---|
| 一直 Down | ① 接口未宣告/未激活 ② 物理或二层不通 ③ 组播被拦截(如 ACL) | display ospf interface、ping 直连、查 ACL |
| 卡在 Init | 单向收到 Hello(对方没收到我的)→ 通常是我发出的 Hello 被丢,或 RID 重复 | 双向抓包、检查 RID 是否冲突 |
| 卡在 2-Way | ① 条件匹配失败(区域 ID / 认证 / 掩码 / Stub 标志不一致)② 两台 DROther(正常现象) | display ospf peer、display ospf error |
| 卡在 ExStart | MTU 不一致(最常见)、RID 冲突、主从选举失败 | 两端 display interface 看 MTU;display ospf error |
| 卡在 Exchange | DBD 报文被丢、序列号错乱、链路质量差 | 抓包看 DBD、查 display ospf error |
| 卡在 Loading | LSR 请求的 LSA 一直没送到(路由/ACL 问题) | display ospf lsdb 对比两端是否一致 |
| 到了 Full 但没有路由 | ① 对端没宣告该网段 ② 被汇总/过滤 ③ 外部路由未引入 | 两端 display ospf lsdb、display ip routing-table |
补充:三个高频"坑"
-
RID 冲突:两台设备 RID 相同 → 邻居反复抖动、状态不稳。必须保证 RID 全网唯一。
-
MTU 不一致 :一端 1500、一端 1400,会卡在 ExStart ,且日志几乎不报错,极难发现。
-
静默接口误配 :把该跑 OSPF 的互联口配成
silent-interface,邻居永远起不来。
十四、本天小结与考点速记
1. 一张图串起全过程
OSPF = 链路状态 + 带宽度量 + 区域划分
启动 → 发 Hello(224.0.0.5)→ 邻居表
→ 条件匹配(2-Way)
├─ 失败 → 停在邻居,只发 Hello
└─ 成功 → ExStart(选主从,比 RID 大者胜)
→ Exchange(DBD 换摘要)
→ Loading(LSR/LSU/LSACK 补全 LSA)
→ Full(LSDB 同步 = 邻接)
→ SPF 算树 → 路由表
→ 稳定后:Hello 保活 + 30min LSA 刷新
2. 必背数字
| 数字 | 含义 |
|---|---|
| 89 | IP 协议号 |
| 224.0.0.5 / 224.0.0.6 | AllSPFRouters / AllDRouters |
| 10s / 40s | Hello / Dead(4 倍关系) |
| 10 | 华为 OSPF 默认优先级(Preference) |
| 100 Mbps | 默认参考带宽 |
| 1800s(30min) | LSA 刷新周期 |
| 3600s | LSA MaxAge |
| 0 | 骨干区域 ID;也是"不参与 DR 选举"的优先级 |
| 1 | DR 优先级默认值(范围 0~255) |
| 7 | 状态机个数(Down→Init→2-Way→ExStart→Exchange→Loading→Full) |
| 5 | 报文种类(Hello/DBD/LSR/LSU/LSACK) |
| 2 | 稳定态个数(2-Way 邻居、Full 邻接) |
3. 最容易考的五个对比
| 对比 | 结论 |
|---|---|
| 邻居 vs 邻接 | 2-Way 是邻居(只 Hello);Full 是邻接(LSDB 同步) |
| DR 选举 | 先比 priority(大者胜,默认 1,0 不参选),再比 RID(大者胜),非抢占 |
| 反掩码 | 0 不可变、1 可变,需连续;= 255.255.255.255 − 子网掩码 |
| ASE1 vs ASE2 | ASE1 含内部开销,ASE2 只算外部开销且默认 |
| RIP 汇总 vs OSPF 汇总 | RIP 需配 NULL0 防空口,OSPF 不需要 |
4. 与 RIP 的一句话总结
RIP 靠"邻居告诉我",OSPF 靠"自己算地图";RIP 数跳数,OSPF 量带宽;RIP 一个区域管到底,OSPF 分而治之。