Day 08 第一次碰到 OSPF。
我原本的理解大概是:
Static Route 是自己一條一條寫路線,OSPF 則是 Router 自己去學路線。
這句話大致上沒有錯。
但仔細一想,問題馬上又來了:
Router 是要怎麼「自己學」?
假設今天有三台 Router:
R1 -------- R2 -------- R3
R1 怎麼知道旁邊有 R2?
R2 又怎麼知道 R3 也有在跑 OSPF?
Router 總不能開機之後突然心電感應:
R1:欸,隔壁是不是有人?
R2:有啊,我也是 OSPF。
R1:好,那我們交換一下地圖。
結果查下去才發現,OSPF 真的差不多就是這個流程。
只是它有正式名稱:
Hello
↓
Neighbor
↓
Adjacency
↓
交換資訊
↓
算出 Route
今天就先把這條線搞懂。
先回到最基本的拓撲:
R1 -------- R2
假設:
R1
192.168.12.1
R2
192.168.12.2
而且兩台 Router 都已經設定 OSPF。
我之前會下意識覺得:
都設定 OSPF 了,所以它們應該就知道彼此吧?
其實不是。
OSPF 還是要先確認:
同一條網路上,有沒有其他 OSPF Router?
所以第一件事情不是算最短路徑,也不是直接交換完整 Routing Table,而是先送出 Hello Packet。
OSPF Router 會定期送出 Hello Packet。
最白話的理解:
R1:
Hello~
這條線上有沒有也在跑 OSPF 的 Router?
R2 收到之後,也會送自己的 Hello:
R2:
有,我也是。
因此:
R1 -------- R2
R1 → Hello → R2
R1 ← Hello ← R2
這時候兩台 Router 才開始知道:
原來隔壁有人。
所以我現在會把 Hello Packet 理解成:
OSPF 的打招呼封包。
它的重要用途之一就是發現 Neighbor。
這裡我一開始很容易把 Neighbor 想成:
只要實體上接在旁邊,就是 Neighbor。
但比較準確一點是:
OSPF Neighbor 是兩台 OSPF Router 透過 Hello 發現彼此,而且相關參數符合之後建立的關係。
也就是:
有網路線連著
不一定代表:
OSPF Neighbor
例如:
R1 -------- R2
網路本身可能完全通,甚至:
ping 192.168.12.2
也可能成功。
但是如果 R2 根本沒有啟用 OSPF:
R1:Hello?
R2:……
那它們就不會建立 OSPF Neighbor。
所以這裡又讓我分清楚一件事情:
IP Connectivity
跟:
OSPF Neighbor Relationship
不是同一件事。
再往下看,我才發現 Hello Packet 裡面不是只有一句 Hello。
Router 還會透過 Hello 確認一些 OSPF 參數。
概念上可以想成:
R1:
你好,我是 OSPF Router。
我的一些 OSPF 設定是這樣。
R2:
我也是。
讓我看看我們的設定能不能對得上。
有些重要設定如果不同,兩台 Router 就可能沒辦法正常成為 Neighbor。
例如常見的:
Area ID
Hello Timer
Dead Timer
等等。
這裡我目前先不死背全部。
今天真正重要的是理解:
Hello Packet 不只是找人,也是確認「我們能不能當 OSPF 鄰居」。
看到 Area ID 的時候,我又卡了一下。
OSPF 為什麼還需要 Area?
先不要一次把 Area 全部展開。
今天只先記一個概念:
OSPF 可以把一個很大的網路切成不同區域。
例如:
Area 0
R1 -------- R2 -------- R3
最重要的一個區域叫:
Area 0
也叫:
Backbone Area
以後網路變大的時候,可以再出現 Area 1、Area 2、Area 3。
今天先知道:
兩台 Router 要建立正常的 OSPF 鄰居關係,Area 的設定很重要。
Area 為什麼存在,我想留到後面再拆。
不然現在很容易從 Neighbor 一路歪到大型企業網路設計去。
接著又看到兩個很像的詞:
Neighbor
Adjacency
我一開始真的會直接把它們當成同一件事。
但概念上可以先分成兩層。
先發現對方:
R1:喔,原來你在這裡。
R2:對,我也看到你了。
這比較像:
我們知道彼此存在。
接下來建立更完整的 OSPF 關係,準備交換網路資訊。
可以把它想成:
Neighbor
↓
認識
Adjacency
↓
建立可以交換 OSPF 資訊的關係
所以我目前會記成:
Neighbor = 認識
Adjacency = 建立可以交換 OSPF 資訊的關係
這個說法雖然比較白話,但至少比把兩個字硬背起來有意義多了。
假設現在:
R1 -------- R2 -------- R3
R1 跟 R2 建立 OSPF 關係。
R2 跟 R3 也建立 OSPF 關係。
接下來 Router 就要開始交換它們知道的網路資訊。
例如:
R1 後面有:
192.168.1.0/24
而:
R3 後面有:
192.168.3.0/24
R2 就像站在中間:
192.168.1.0/24
|
R1
|
R2
|
R3
|
192.168.3.0/24
經過 OSPF 資訊交換後,R1 最後可以學到:
192.168.3.0/24
不是直接連在自己身上,卻知道:
要往 R2 那邊走。
這時:
show ip route
才可能看到 OSPF 學到的 Route:
O 192.168.3.0/24 ...
Day 08 看到的那個 O,現在終於開始知道它背後發生什麼事了。
這是今天我覺得很重要的一個修正。
如果把 OSPF 想得太簡單,很容易變成:
Hello
↓
Route
但實際概念比較像:
Hello
↓
發現 Neighbor
↓
建立 OSPF 關係
↓
交換網路狀態資訊
↓
建立對網路的理解
↓
計算最佳路徑
↓
放進 Routing Table
這樣 Day 08 講的 OSPF Cost 才有位置可以放。
Router 不是收到一個 Hello 就開始比 Cost。
而是得先:
認識其他 Router → 得到網路資訊 → 再算路。
這邊也是一個很容易講錯的地方。
我原本可能會直接說:
OSPF Router 彼此交換 Routing Table。
但嚴格一點講,不應該這樣理解。
OSPF 是:
Link-State Routing Protocol
重點在 Link State。
也就是 Router 會交換網路連線狀態相關的資訊。
最後各台 Router 自己建立出對整個網路拓撲的理解,再自己算最佳路徑。
所以比較像:
R1:我這裡有哪些 Link
R2:我這裡有哪些 Link
R3:我這裡有哪些 Link
大家交換資訊之後,各自在腦中拼出:
R1 ----- R2 ----- R3
然後再去算:
我要去某個 Network,應該走哪一條路?
所以 OSPF 不只是:
你告訴我 Routing Table 長怎樣
而比較像:
你告訴我你看到的網路長怎樣
我自己來算路。
這樣也比較能理解為什麼它叫 Link-State。
Day 08 一直在看 Routing Table。
今天才開始發現,OSPF 內部其實還有其他資訊。
目前先不用背完整名稱,只先建立概念:
Neighbor 資訊
↓
誰是我的 OSPF 鄰居?
拓撲資訊
↓
整個 OSPF 網路大概長怎樣?
Routing Table
↓
最後真正拿來轉送封包的路線
也就是:
看見鄰居
↓
知道拓撲
↓
算出路線
↓
Routing Table
突然就比較能理解:
OSPF 並不是 Routing Table 本身。
OSPF 是一套讓 Router 學習網路、計算路徑的機制。
Routing Table 則是最後結果之一。
Day 08 學到 OSPF 可以根據 Cost 選路。
假設:
R2
/ \
/ \
R1 R4
\ /
\ /
R3
R1 要到 R4 有兩條路:
R1 → R2 → R4
或:
R1 → R3 → R4
Day 08 直接在想:
哪條 Cost 比較低?
今天再往前補之後,完整流程應該是:
先找到 OSPF Neighbor
↓
建立關係
↓
交換 Link-State 資訊
↓
知道整個拓撲
↓
計算 Cost
↓
選出最佳路徑
↓
寫進 Routing Table
這樣 OSPF 的整條故事線終於開始連起來。
在 Cisco Router 上,可以用:
show ip ospf neighbor
查看 OSPF Neighbor。
例如概念上可能看到:
Neighbor ID State
2.2.2.2 FULL
現在看到 FULL,至少不再只是覺得:
反正 FULL 就是成功。
而是大概知道:
Router 已經跟這個 OSPF Neighbor 建立完整的鄰接關係。
另一個 Day 08 看過的:
show ip route
則是看最後 Routing Table。
所以兩個指令看的其實是不同階段:
show ip ospf neighbor
↓
OSPF 跟誰建立關係?
show ip route
↓
最後學到了哪些路?
這個差別我覺得很值得記。
如果今天只背:
show ip ospf neighbor
過幾天大概又忘了。
我覺得真正要留下來的是這條:
OSPF Router
↓
Hello
↓
發現 Neighbor
↓
建立 Adjacency
↓
交換 Link-State 資訊
↓
知道網路拓撲
↓
計算 Cost
↓
選出最佳路徑
↓
Routing Table
Day 08 看到的是後半段:
Cost
→ Route
→ ECMP
今天才把前半段補起來。
OSPF Router 用來發現、維持 Neighbor 關係的重要封包。
兩台 OSPF Router 發現彼此,並確認相關設定能夠配合後形成的鄰居關係。
比單純「知道對方存在」更進一步,建立可以交換 OSPF 網路資訊的關係。
不能這樣簡化。
OSPF 是 Link-State Protocol。Router 交換網路的 Link-State 資訊,再自己計算最佳路徑。
前面這一大串流程計算完之後,最後真正拿來決定封包往哪走的結果。
OSPF 不是一開始就在算最短路徑,而是先用 Hello 找到鄰居,建立關係、交換網路資訊之後,才有辦法算出路線。
Day 08 問的是:
OSPF 怎麼選路?
Day 09 則往前追了一層:
OSPF 在選路以前,到底怎麼先知道網路長什麼樣子?
而答案的起點就是 Hello。