技術小故事

OSPF 路由數據庫的同步舞蹈

四個協議封包(DBD、LSU、LSAck)如何協作完成 LSDB 同步,建立 Adjacency

2026-04-23 · 5 min read
OSPF LSDB Adjacency DBD

🎭 故事

場景:兩家公司的檔案交換

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/24172.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 狀態意味著兩台路由器掌握了相同的「世界地圖」,可以共同決定最優的路由選擇。

📍 技術摘要

四個關鍵協議封包

封包全名目的何時發送
HelloHello發現鄰居每 10 秒
DBDDatabase Descriptor交換目錄清單ExStart / Exchange
LSULink State Update發送詳細的 LSAExchange / Loading
LSAckLink 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 算法)才能得出最優路由,填入路由表。