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建立邻居关系,不是一蹴而就的。它有一套严谨的状态机,我习惯把它分成三个阶段:发现、协商、同步。下面这张图能帮你快速理解整个流程。
嗯,这里要注意几个关键状态:
- 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的泛洪,我总结为三个原则:
- 可靠传输:收到LSA后,接收方必须发送LSAck确认。没收到确认,发送方会重传。这跟TCP的确认机制有点像。
- 防环机制:每台路由器维护一个LSDB,收到LSA后先检查自己有没有。如果有且序列号更新,就更新并继续转发;如果序列号相同,忽略;如果序列号更旧,回复一个更新的LSA给对方。
- 定时刷新: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报文的交互过程。亲眼看到状态机的每一步变化,比死记硬背强一百倍。