OSPF 路由數據庫的同步舞蹈
四個協議封包(DBD、LSU、LSAck)如何協作完成 LSDB 同步,建立 Adjacency
🎭 故事
場景:兩家公司的檔案交換
Router A 和 Router B 已經互相認識(成為了 Neighbor,進入 2-Way 狀態)。現在他們決定進一步合作:分享彼此掌握的所有網路信息。
Router A 手裡有一本「路由指南」,列著自己知道的所有網路:
10.1.0.0/24(辦公室 A)10.2.0.0/24(倉庫)10.3.0.0/24(工廠)
Router B 也有自己的「路由指南」:172.16.0.0/24(辦公室 B)、172.17.0.0/24(廠房)。他們決定交換這些「指南」,建立完整的世界地圖。
ExStart:決定誰主導
Router A 對 Router B 說:「嘿,我想和你交換信息。我先介紹一下我的檔案——」
Router A 發送一個 DBD(Database Descriptor) 封包,裡面寫著:「我有 3 條路由信息、我的序列號是 1000、我可以是 Master」。這叫 ExStart 狀態(「交換前的握手」)。
Router B 回應自己的 DBD:「我有 2 條路由信息、我接受你作為 Master 候選、我的序列號是 2000」。序列號最大的當 Master。Router B 的序列號 2000 > 1000,所以 Router B 成為 Master,主導整個交換過程。
Exchange:交換目錄清單
現在進入 Exchange 狀態。Router B(Master)發送 DBD,列出自己知道的路由:
DBD 封包(Router B):
- 路由 1:172.16.0.0/24,成本 50,序列號 201
- 路由 2:172.17.0.0/24,成本 100,序列號 202
Router A 回應自己的 DBD:
DBD 封包(Router A):
- 路由 1:10.1.0.0/24,成本 10,序列號 101
- 路由 2:10.2.0.0/24,成本 20,序列號 102
- 路由 3:10.3.0.0/24,成本 30,序列號 103
雙方互相看了對方的「目錄清單」,發現彼此都有對方沒有的路由信息。
Loading:請求詳細資訊
Router A 對 Router B 說:「我看到你有 172.16.0.0/24 和 172.17.0.0/24,我需要完整的信息,能給我嗎?」
Router A 發送 Link State Request,要求獲得詳細的 LSA(Link State Advertisement)。Router B 收到後,發送完整的 LSA 信息,Router A 邊接收邊處理,進入 Loading 狀態。
每次 Router B 發送 LSU 時,Router A 都要回應一個 LSAck(Link State Acknowledgment)確認:「我收到了。序列號 202 的信息已安全保存。」這確保了沒有遺漏任何信息。
Full:數據庫同步完成
所有信息都交換完畢!Router A 和 Router B 的 LSDB 現在都包含 5 條完整的路由信息,雙方進入 Full 狀態 ✅。
Neighbor 是認識,Adjacency 才是搬家鑰匙。Full 狀態意味著兩台路由器掌握了相同的「世界地圖」,可以共同決定最優的路由選擇。
📍 技術摘要
四個關鍵協議封包
| 封包 | 全名 | 目的 | 何時發送 |
|---|---|---|---|
| Hello | Hello | 發現鄰居 | 每 10 秒 |
| DBD | Database Descriptor | 交換目錄清單 | ExStart / Exchange |
| LSU | Link State Update | 發送詳細的 LSA | Exchange / Loading |
| LSAck | Link State Ack | 確認收到 LSA | 收到 LSU 時 |
五個 Adjacency 狀態
| 狀態 | 說明 |
|---|---|
| 2-Way | 相識(Neighbor 確認) |
| ExStart | 握手,決定 Master/Slave |
| Exchange | 交換 DBD(目錄清單) |
| Loading | 交換 LSU(詳細信息),確認 LSAck |
| Full ✓ | 完全同步,Adjacency 成立 |
序列號的作用:防止重複處理同一份信息、檢測過期的 LSA、以及 Master 選舉依據。
⚠️ 常見誤解
❌ Hello 是 OSPF 交換路由的全部
✅ Hello 只用於發現和維護 Neighbor;真正的路由交換靠 DBD、LSU、LSAck。Hello 建立的是「認識」,DBD/LSU/LSAck 建立的才是「同步」。
❌ LSU 和 LSAck 的順序可以顛倒
✅ 必須先收到 LSU,才能發送 LSAck;否則無法確認接收。這是可靠傳輸的基本邏輯。
❌ Full 狀態就意味著路由決策完成
✅ Full 狀態只表示數據庫同步完成;還需要 SPF 計算(Dijkstra 算法)才能得出最優路由,填入路由表。