技術小故事

OSPF 鄰居與 Adjacency 的區別

用擬人化故事說明 OSPF Neighbor 和 Adjacency 的本質差異與狀態轉移

2026-04-23 · 5 min read
OSPF Neighbor Adjacency

🎭 故事:OSPF 的「認識」與「親密」關係

第一幕:「嘿,你好嗎?」— 建立 Neighbor 關係

Router A 和 Router B 被連接在同一條網路線路上。它們互相不認識,不知道對方是誰、能做什麼、掌握什麼資訊。

  1. Down 狀態:Router A 喊:「有人在嗎?」Router B 什麼都沒收到,狀態還是 Down。
  2. Init 狀態:Router A 的 Hello 到達了。Router B 收到後:「哦,有個叫 Router A 的傢伙存在」,進入 Init 狀態(「我看到你了,但你還沒看到我」)。
  3. 2-Way 狀態:Router B 回應 Hello,在自己的 Hello 中寫著:「我看到了 Router A!」。Router A 收到後:「太好了!Router B 也看到我了」。雙方進入 2-Way 狀態

這就是 Neighbor 關係成立。兩台路由器現在是「相識的陌生人」,互相確認了彼此的存在。

第二幕:「我們要更進一步嗎?」— 升級到 Adjacency 關係

在廣播網路上(如乙太網),可能有很多個路由器。OSPF 必須決定:誰應該成為「密友」?

  1. DR 選舉:假設 Router B 當選 DR,Router A 當選 BDR。其他路由器只有 DR 和 BDR 才值得深度合作。
  2. ExStart 狀態:Router A 對 Router B 說:「我們開始交換資訊吧。由我先說,還是你先說?」Router B(DR)回答:「我是 Master,由我主導」。
  3. Exchange 狀態:雙方互相列出自己知道的所有路由資訊的「目錄」(DBD),然後互相檢查:「你有什麼我沒有?」
  4. Loading 狀態:發現對方有自己沒有的路由資訊,發送請求,對方逐一回應詳細的 LSA。
  5. Full 狀態:所有資訊都同步完畢。Router A 和 Router B 進入 Full 狀態

這就是 Adjacency 關係成立。兩台路由器現在是「閨蜜」——不僅互相知道彼此,而且掌握對方的完整路由資訊,時刻保持同步。

第三幕:另一台路由器的故事

假設網路中還有 Router C,不是 DR 也不是 BDR。Router C 和 Router B 達到 2-Way 狀態後,停止了。Router C 不會和 Router B 進一步升級到 ExStart / Full。

它們的關係被凍結在 2-Way:「我知道你,你知道我,但就這樣了」。Router C 會把路由資訊的更新通知發給 DR,但不會和 DR 進行深度同步。這就是 DROther 的工作方式:通過 DR 這個樞紐,實現高效的網路拓撲維護。

📍 定義(RFC 2328)

概念定義關鍵點
Neighbor兩台路由器有共同的網路介面,通過 Hello 協議發現只交換 Hello 封包
Adjacency選定的鄰居路由器之間建立的關係,用於交換路由資訊涉及 DBD、LSA 交換

狀態機轉移

Neighbor 的成熟度

Down → Attempt → Init → 2-Way ✓(Neighbor 確認)

Adjacency 的成熟度

2-Way → ExStart → Exchange → Loading → Full ✓(Adjacency 完成)

關鍵區別

維度NeighborAdjacency
狀態範圍Down ~ 2-Way2-Way ~ Full
資訊交換只有 HelloHello + DBD + LSA
網路依賴所有相鄰路由器廣播網:DR/BDR;P2P:所有相鄰
目標發現彼此存在同步拓撲資訊,參與 SPF 計算

網路類型的影響

網路類型誰形成 Adjacency?
Point-to-Point兩端都進入 Full(形成 Adjacency)
Broadcast僅與 DR 和 BDR(其他停留在 2-Way)
NBMA僅與 DR 和 BDR
Point-to-Multipoint與所有鄰居
OSPF 的設計智慧:Neighbor 和 Adjacency 的分層關係,完美體現了效率與完整性的平衡。廣播網路通過 DR 選舉讓某些路由器充當「樞紐」,避免 O(n²) 的信息氾濫;Point-to-Point 則直接讓兩端進入 Full,展現了對不同拓撲的適應性。

⚠️ 常見誤解

❌ Neighbor 和 Adjacency 是同義詞

Neighbor 是前置條件,Adjacency 是進階關係。所有 Adjacency 都必須先有 Neighbor,但不是所有 Neighbor 都會形成 Adjacency。

❌ 2-Way 狀態就代表 Adjacency 完成

2-Way 是 Neighbor 的完成,Adjacency 需要繼續走過 ExStart → Exchange → Loading,最終達到 Full 狀態才算完成。

❌ 所有 Neighbor 都會形成 Adjacency

廣播網中,大多數 Neighbor 停留在 2-Way,不形成 Adjacency。只有與 DR 和 BDR 的關係才會進入 Full。Point-to-Point 是例外,兩端都會進入 Full。