OSPF Hello 的初次相遇
兩個陌生的路由器如何透過 Hello 協議相互發現,建立 Neighbor 關係
故事
場景:陌生的網路鄰域
Router A 和 Router B 被連接在同一條乙太網上,
卻互相不認識。Router A 不知道 Router B 是誰;對 B 而言,A 也只是一段未命名的訊號。
但它們都被工程師設定了同一個 OSPF Process ID,也都被丟進 Area 0note · 1Area 0 是 OSPF 的 backbone area。所有其他 area 都必須能直接或經由 virtual link 連回 Area 0。。
這是兩個聾啞的點。要能形成路由,它們得先聽見彼此。
觸發:Hello 的第一聲呼喚
Router A 的 OSPF 進程啟動後,馬上問自己:「我在網路上嗎?有沒有其他路由器在我附近?」
於是它向 224.0.0.5note · 2224.0.0.5 是 AllSPFRouters 多播位址;所有啟用 OSPF 的介面都會訂閱這個 group,但只有 OSPF 進程會處理收到的封包。 多播了一個 Hello 封包,裡面寫著:
- Router ID ·
1.1.1.1— 我是誰 - Area ·
0— 我在哪個區域 - Hello / Dead Interval ·
10 / 40— 我多久講一次話、多久沒回就當我死了 - Neighbor List ·
(空)— 我目前還誰都沒看見
回應:原來你也在這
Router B 在 10 秒內收到 A 的 Hello。它先檢查幾件事:Area 一致嗎?
Hello / Dead Interval 對齊嗎?認證、Stub 旗標相同嗎?
全部都通過後,B 把 1.1.1.1 寫進自己的 Neighbor 列表,
並回了一個自己的 Hello — 但這次,Neighbor List 不再是空的,
裡面寫著 1.1.1.1。
A 收到後,看見自己的 ID 出現在對方的 Hello 裡, 於是把狀態從 Init 升到 2-Way。到這一刻,雙方才算真正「認識」。
Hello 不是握手,是點名。點到對方的名字,才算握到手。
技術摘要
Hello 封包的內容
Hello 包用 IP Protocol 89 直接封裝,不走 TCP / UDP。重點欄位:
- Router ID — 用來唯一標識自己(通常取 Loopback 最高 IP)
- Area ID — 表示所在的區域,兩端必須一致
- Network Mask — Broadcast 網段才檢查
- Hello Interval — 每多少秒廣播一次 Hello(預設 10 秒)
- Dead Interval — 多久沒聽到對方就視為斷線(預設 40 秒)
- Options · Neighbor List
實際在 Cisco 設備上,可以這樣驗證 Neighbor 是否成功建立:
Neighbor ID Pri State Dead Time Address Interface
2.2.2.2 1 FULL/DR 00:00:35 10.0.0.2 Gi0/0
3.3.3.3 1 2-WAY/DROTHER 00:00:32 10.0.0.3 Gi0/0
Hello / Dead Interval
Dead Interval 通常是 Hello Interval 的 4 倍。
在 Point-to-Point 與 Broadcast 是 10/40;NBMA 與 Point-to-Multipoint 預設拉長到 30/120。
兩端必須相同,否則 Hello 互通也建不起 Neighbor。
常見誤解
❌ Neighbor 就能交換路由資訊
✅ Neighbor 只是相互認識(2-Way)。 交換 LSDB 需要進一步升級到 Adjacency — 那是 ExStart / Exchange / Loading / Full 之後的事。
❌ Hello 用 UDP 傳送
✅ OSPF 直接坐在 IP 層上,protocol number 是 89,
沒有 TCP 或 UDP header。
❌ Router ID 必須是介面 IP
✅ Router ID 是 32-bit 的識別碼, 只是「長得像 IP」。建議綁在 Loopback 上,避免實體介面 down 掉就跟著換 ID。
接下來會發生什麼
Hello 只是把陌生變成「相互認識」。下一步是 從 2-Way 到 Full 的攀爬 — 我們會跟著兩個 Router 一起走過 ExStart 的握手戰、 Exchange 階段的 DBD 互換,以及最後 Full 狀態落定的那一刻。