OSPF 鄰居與 Adjacency 的區別
用擬人化故事說明 OSPF Neighbor 和 Adjacency 的本質差異與狀態轉移
🎭 故事:OSPF 的「認識」與「親密」關係
第一幕:「嘿,你好嗎?」— 建立 Neighbor 關係
Router A 和 Router B 被連接在同一條網路線路上。它們互相不認識,不知道對方是誰、能做什麼、掌握什麼資訊。
- Down 狀態:Router A 喊:「有人在嗎?」Router B 什麼都沒收到,狀態還是 Down。
- Init 狀態:Router A 的 Hello 到達了。Router B 收到後:「哦,有個叫 Router A 的傢伙存在」,進入 Init 狀態(「我看到你了,但你還沒看到我」)。
- 2-Way 狀態:Router B 回應 Hello,在自己的 Hello 中寫著:「我看到了 Router A!」。Router A 收到後:「太好了!Router B 也看到我了」。雙方進入 2-Way 狀態 ✅
這就是 Neighbor 關係成立。兩台路由器現在是「相識的陌生人」,互相確認了彼此的存在。
第二幕:「我們要更進一步嗎?」— 升級到 Adjacency 關係
在廣播網路上(如乙太網),可能有很多個路由器。OSPF 必須決定:誰應該成為「密友」?
- DR 選舉:假設 Router B 當選 DR,Router A 當選 BDR。其他路由器只有 DR 和 BDR 才值得深度合作。
- ExStart 狀態:Router A 對 Router B 說:「我們開始交換資訊吧。由我先說,還是你先說?」Router B(DR)回答:「我是 Master,由我主導」。
- Exchange 狀態:雙方互相列出自己知道的所有路由資訊的「目錄」(DBD),然後互相檢查:「你有什麼我沒有?」
- Loading 狀態:發現對方有自己沒有的路由資訊,發送請求,對方逐一回應詳細的 LSA。
- 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 完成)
關鍵區別
| 維度 | Neighbor | Adjacency |
|---|---|---|
| 狀態範圍 | Down ~ 2-Way | 2-Way ~ Full |
| 資訊交換 | 只有 Hello | Hello + 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。