2. OSPF协议基础回顾:OSPF工作原理、邻居状态机、LSA类型与泛洪机制

好,咱们进入正题。OSPF这个协议,说白了就是让路由器之间互相“交个底”——谁在哪儿,怎么走最快。我当年刚接触OSPF时,觉得它比RIP复杂太多了,但后来发现,它的设计其实非常优雅。你想想看,一个网络里几十上百台路由器,要能快速收敛、无环路由,没有一套严谨的机制根本玩不转。

2.1 OSPF工作原理:链路状态的核心思想

OSPF的核心思想,我总结为四个字:各说各话,全局同步。每台路由器只负责把自己直连的链路状态(比如接口IP、开销、邻居是谁)广播出去。所有路由器收到后,拼出一张完整的网络拓扑图——这就是链路状态数据库(LSDB)。

有了这张图,每台路由器独立运行SPF算法(Dijkstra算法),算出到每个目的地的最短路径。这跟RIP那种“听邻居说”的矢量算法完全不同。我在项目中遇到过好几次RIP环路的问题,换成OSPF后,再也没为环路头疼过。

关键区别:OSPF是“我亲眼看到的”,RIP是“我听邻居说的”。前者更可靠,后者容易传错话。

2.2 邻居状态机:从Hello到Full的八步舞

OSPF建立邻居关系,不是一蹴而就的。它有一套严谨的状态机,我习惯把它分成三个阶段:发现、协商、同步。下面这张图能帮你快速理解整个流程。

OSPF邻居状态机 Down Attempt Init 2-Way ExStart Exchange Loading Full 发现阶段 协商阶段 同步阶段

嗯,这里要注意几个关键状态:

  • Down:初始状态,啥都没收到。
  • Init:收到对方的Hello包,但对方没在包中看到自己。说白了就是“我看到你了,但你还没看到我”。
  • 2-Way:双方都在Hello包中看到了对方。这是邻居关系的建立标志。在广播网络中,这一步就开始选举DR/BDR了。
  • ExStart:开始协商主从关系,决定谁先发DD报文。我见过有人在这里卡住,多半是MTU不匹配。
  • Exchange:交换DD报文,描述各自的LSDB摘要。
  • Loading:发现对方有自己没有的LSA,发LSR请求,对方回复LSU。
  • Full:LSDB完全同步。恭喜,邻居关系建立成功。

避坑指南:我曾经在排障时发现两台路由器一直卡在ExStart状态,折腾了半天,最后发现是接口MTU不一致。OSPF要求DD报文大小不能超过接口MTU,否则会被静默丢弃。所以,务必检查两端MTU

2.3 LSA类型:OSPF的“情报”分类

OSPF用LSA(链路状态通告)来传递信息。不同的LSA类型,承载不同的情报。我整理了一张表,方便你对照记忆。

类型码 名称 谁产生的 传播范围 核心内容
1 Router LSA 每台路由器 本区域 路由器的接口信息、邻居、链路类型
2 Network LSA DR 本区域 广播网络中的路由器列表
3 Summary LSA (网络) ABR 跨区域 其他区域的网络路由
4 Summary LSA (ASBR) ABR 跨区域 ASBR的位置信息
5 AS External LSA ASBR 整个AS 引入的外部路由(如静态、RIP)
7 NSSA LSA ASBR NSSA区域 在NSSA区域中通告外部路由

我个人习惯把LSA类型分成三组来记:

  • 内部路由(Type 1 & 2):描述区域内部的拓扑。Type 1是每台路由器自己的“自传”,Type 2是DR为广播网络写的“花名册”。
  • 区域间路由(Type 3 & 4):由ABR生成,用于跨区域通信。Type 3是网络路由,Type 4是ASBR的“指路牌”。
  • 外部路由(Type 5 & 7):由ASBR引入的外部网络。Type 5是标准的外部路由,Type 7是NSSA区域的特殊处理。

注意:Type 5 LSA在整个AS内泛洪,但不会进入Stub区域和NSSA区域。如果你在Stub区域里看不到外部路由,别慌,这是设计如此。

2.4 泛洪机制:信息如何传遍全网

LSA生成后,怎么让所有路由器都收到?这就是泛洪机制要解决的问题。OSPF的泛洪,我总结为三个原则:

  1. 可靠传输:收到LSA后,接收方必须发送LSAck确认。没收到确认,发送方会重传。这跟TCP的确认机制有点像。
  2. 防环机制:每台路由器维护一个LSDB,收到LSA后先检查自己有没有。如果有且序列号更新,就更新并继续转发;如果序列号相同,忽略;如果序列号更旧,回复一个更新的LSA给对方。
  3. 定时刷新:LSA默认每30分钟刷新一次,老化时间3600秒。如果一台路由器挂了,它的LSA会在3600秒后自动消失。

你想想看,如果没有防环机制,一个LSA在网络里来回传,那不就成死循环了?OSPF用序列号(从0x80000001到0x7FFFFFFF)和老化时间(Age)完美解决了这个问题。

实战经验:我记得有一次排查OSPF路由不稳定的问题,发现某台路由器的LSA序列号一直在跳变。后来定位到是接口频繁flapping,导致路由器不断生成新的LSA。泛洪风暴差点把网络打垮。所以,接口稳定性是OSPF健康的基础

2.5 小结:OSPF的核心逻辑

好了,回顾一下。OSPF的工作流程可以概括为:

  • 通过Hello报文发现邻居,走完状态机到Full。
  • 每台路由器生成自己的LSA(Type 1/2),描述直连链路。
  • LSA通过泛洪机制可靠地传遍整个区域(或整个AS)。
  • 每台路由器基于LSDB运行SPF算法,算出无环的最短路径树。

说白了,OSPF就是一套“先同步,再计算”的协议。同步做不好,路由就全乱套。下一节我们会深入讨论OSPF攻击的常见手法,但在此之前,请确保你对这些基础概念烂熟于心——因为攻击者往往就是利用这些机制的漏洞来搞破坏的。

我的建议:如果你在实验室里搭OSPF环境,不妨抓包看看Hello报文和DD报文的交互过程。亲眼看到状态机的每一步变化,比死记硬背强一百倍。


专注资料整理