Day 10 我把 OSPF 的主線先串成:
Hello
↓
Neighbor
↓
Adjacency
↓
LSA
↓
LSDB
↓
SPF
↓
Routing Table
到這裡,我腦袋裡的拓撲一直很單純。
不是:
R1 ---- R2
就是:
R1 ---- R2 ---- R3
兩台 Router 之間一條線,看起來很乾淨。
但真實網路很常不是這樣。
假設一個 Ethernet LAN 上,同時接了四台 OSPF Router:
R1
|
R2 --- Switch --- R3
|
R4
四台 Router 明明都在同一個網段,也都能直接收到彼此送出的 OSPF Hello。
那新的問題就來了:
難道每一台 Router 都要跟其他每一台 Router 建立完整的 OSPF Adjacency,再彼此同步一次 LSDB 嗎?
如果 Router 越來越多,這件事看起來很快就會變得很吵。
這就是 DR / BDR 出場的地方。
先假裝沒有 DR / BDR。
如果同一個 LAN 裡只有兩台 Router:
R1 ---- R2
完整鄰接關係只有一組:
R1 ↔ R2
沒什麼問題。
如果變成四台:
R1
R2
R3
R4
每一台都跟其他每一台建立完整 Adjacency,會變成:
R1 ↔ R2
R1 ↔ R3
R1 ↔ R4
R2 ↔ R3
R2 ↔ R4
R3 ↔ R4
總共六組。
如果是十台呢?
兩兩配對會變成:
10 × 9 ÷ 2 = 45
Router 數量一增加,完整鄰接關係不是只多一點點。
它會越長越快。
而 OSPF 建立 Adjacency 之後,不只是「知道你在這裡」而已,還要處理資料庫同步與 Link-State 資訊交換。
所以真正的問題不是:
Router 看不看得到彼此?
而是:
這麼多 Router 都在同一個共享網段時,有沒有必要每一對都建立完整同步關係?
在 Ethernet 這種 Broadcast Multi-Access Network 上,OSPF 會選出一台:
DR
全名:
Designated Router
我一開始看到 Designated Router,很容易想成:
它是不是整個 OSPF 網路的老大?
其實不是。
比較好的理解是:
DR 是針對這一個 multi-access network segment 選出來的協調角色。
例如:
R1
(DR)
/ | \
/ | \
R2 R3 R4
R2、R3、R4 都會和 DR 建立完整鄰接關係。
這樣 Link-State 資訊的交換,就不用變成每一對 Router 都重複做一次完整同步。
如果只有 DR,新的問題馬上出現:
DR 掛掉怎麼辦?
所以同一個網段還會再選一台:
BDR
全名:
Backup Designated Router
也就是 DR 的備援角色。
如果 DR 失效,BDR 可以接手 DR 的角色,接著網路再選出新的 BDR。
所以可以先把它想成:
DR
↓
目前主要協調者
BDR
↓
已經在旁邊準備好的備援協調者
這比「DR 是主 Router、BDR 是副 Router」更精確一點,因為它們的角色只是在這個 OSPF multi-access segment 上成立。
沒有被選成 DR 或 BDR 的 Router,常會看到一個名稱:
DROTHER
例如:
R1 = DR
R2 = BDR
R3 = DROTHER
R4 = DROTHER
這裡最容易產生一個誤解:
DROTHER 之間是不是完全不認識彼此?
不是。
它們仍然可以透過 Hello 發現彼此,成為 Neighbor。
只是 DROTHER 和 DROTHER 之間通常不會建立到 FULL adjacency,常見狀態會停在:
2-WAY
而它們跟 DR / BDR 則可以建立:
FULL
所以:
Neighbor
≠
一定會變成 FULL Adjacency
這件事剛好把 Day 09 的觀念再補得更精確。
假設:
R1 = DR
R2 = BDR
R3 = DROTHER
R4 = DROTHER
R3 和 R4 都已經能透過 DR / BDR 參與這個 multi-access segment 的 OSPF 資訊交換。
因此不需要:
R3 ↔ R4 = FULL
也不需要每一台 Router 都對所有其他 Router 做一份完整 adjacency。
我現在會把 DR / BDR 的目的先記成:
在共享的 multi-access 網段中,降低完整鄰接與 Link-State 同步的複雜度。
不是因為其他 Router 不重要,而是因為沒有必要大家全部兩兩 FULL。
這裡開始出現考試很愛問的規則。
OSPF 在符合條件的 multi-access network 上選 DR / BDR 時,會先看:
OSPF interface priority
數字越高,越有機會被選。
如果 priority 一樣,再比較:
Router ID
Router ID 較高者勝出。
所以可以先記:
先比 Priority
↓
再比 Router ID
另外有一個很實用的規則:
Priority = 0
代表這個 interface 不參加 DR / BDR 選舉。
假設原本:
R1 priority 100 → DR
R2 priority 50 → BDR
後來才加入:
R3 priority 200
直覺會想:
200 最大,R3 應該馬上把 R1 擠掉吧?
OSPF 的 DR / BDR 選舉不是一直重新排名的設計。
已經選出的 DR / BDR 不會只因為後來加入一台 priority 更高的 Router,就立刻被搶走角色。
也就是常看到的:
DR / BDR election is non-preemptive
這很像會議主持人已經選好了,不會因為更資深的人晚到,就當場把主持人換掉。
不是。
這也是名稱很容易帶來的錯覺。
假設 R1 有兩個不同的 Ethernet segment:
LAN A
|
R1
|
LAN B
R1 在 LAN A 上可能是 DR,但到了 LAN B,可能只是 DROTHER。
因為 DR / BDR 的角色是針對:
特定 multi-access network segment
來選的。
不是整個 OSPF Area 只有一台 DR,也不是整個公司只能有一台 DR。
再回到最簡單的拓撲:
R1 -------- R2
一條 Point-to-Point Link 上就兩台 Router。
這時根本沒有:
十台 Router 全部掛在同一個 LAN
這種「大家要不要兩兩 FULL」的問題。
所以 Point-to-Point Network 不需要靠 DR / BDR 來解決 multi-access adjacency 的複雜度。
這也幫我建立一個比較重要的判斷方式:
不要看到 OSPF 就立刻想到 DR / BDR;先看這個介面的 network type。
讀 OSPF 時常會看到兩個 Multicast Address:
224.0.0.5
224.0.0.6
先不用把所有封包類型背完,只抓角色。
AllSPFRouters
代表這個 link 上的所有 OSPF Router。
AllDRouters
主要對 DR / BDR 使用。
所以我現在先記:
.5 → 所有 OSPF Router
.6 → DR / BDR
它們不是隨機出現的兩個 Multicast IP。
這篇目前先整理理論,Packet Tracer 實作我會標成待驗證。
show ip ospf neighbor
可以看到鄰居狀態,常會出現:
FULL/DR
FULL/BDR
2WAY/DROTHER
show ip ospf interface
可以觀察 Network Type、State、Designated Router、Backup Designated Router 和 Router Priority。
在介面設定:
ip ospf priority 0
可以讓該介面不參與 DR / BDR 選舉。
待驗證: 後續可在 Packet Tracer 建四台 Router 接同一台 Switch,比較不同 priority 下的 DR / BDR 選舉,以及 DROTHER 彼此停在 2-WAY 的狀態。
現在 OSPF 的故事又完整一點:
Hello
↓
發現 Neighbor
↓
判斷是否建立完整 Adjacency
↓
如果是 Broadcast Multi-Access Network
↓
選 DR / BDR
↓
DROTHER 與 DR / BDR 建立 FULL Adjacency
↓
交換 Link-State 資訊
↓
LSA
↓
LSDB
↓
SPF
↓
Routing Table
所以 Day 09 的:
Neighbor → Adjacency
其實中間還有條件。
不是看到 Neighbor 就一定 FULL,而是 OSPF 會依網路類型與角色,決定哪些鄰居需要建立完整 adjacency。
不是。
DR / BDR 是在特定 multi-access segment 上的角色。
同一台 Router 在不同介面上,可以有不同角色。
不是。
它們仍然可以是 Neighbor,只是彼此通常停在 2-WAY,不需要建立 FULL adjacency。
不是。
DR / BDR 選舉是 non-preemptive。
後來才加入的高 priority Router,不會自動把現任 DR 擠掉。
不是。
DR / BDR 是為 multi-access network 的問題而存在。
Point-to-Point Link 沒有這個需求。
如果今天只留一句話:
DR / BDR 是 OSPF 在共享 Ethernet 網段上,用來避免所有 Router 都彼此建立完整 adjacency 的協調機制。
我現在會把四個角色這樣記:
DR
↓
這個 segment 的主要協調者
BDR
↓
DR 的備援
DROTHER
↓
仍然是 OSPF Router,也會成為 Neighbor
但不需要彼此全部 FULL
Priority / Router ID
↓
決定 DR / BDR 選舉的重要條件
而最重要的不是把三個縮寫背起來,而是知道它們為什麼會出現:
共享 LAN 上 Router 越來越多
↓
全部兩兩 FULL 太複雜
↓
OSPF 選出 DR / BDR
↓
把完整 adjacency 的結構收斂
因為同一個共享網段可能有很多 OSPF Router;如果所有 Router 都彼此建立完整 adjacency,鄰接與資料庫同步的複雜度會快速增加。
不是。
它們仍然可以是 Neighbor,只是通常不會彼此建立 FULL adjacency。
先看 OSPF interface priority;相同時再比較 Router ID。
Priority 0 不參與 DR / BDR 選舉。
不會。
DR / BDR 選舉是 non-preemptive。
不需要。
因為它沒有多台 Router 共用同一個 multi-access segment 的問題。
DR / BDR 不是 OSPF 的「總隊長」,而是某個共享網段裡,專門把鄰接與 Link-State 交換整理得不要那麼亂的角色。
下一個問題也很自然。
現在我們已經知道 OSPF 可以讓 Router 拼出拓撲。
但如果企業網路越來越大:
幾十台 Router
↓
幾百條 Link
↓
LSDB 越來越大
↓
SPF 計算也越來越複雜
難道所有 Router 都要知道整個 OSPF Domain 的每一個細節嗎?
接下來就會碰到:
Area
Area 0
ABR
也就是:
OSPF 為什麼還要切 Area?