Learning Objectives
- 說明手動維護靜態路由在網路變大、線路故障時的問題,以及動態路由協定要解決什麼
- 說明距離向量的做法:每台路由器把自己知道的網段與距離告訴鄰居,並在模擬器裡看到路由表逐輪收斂
- 說明計數到無限的成因,以及水平分割怎麼避免它
- 說明連結狀態的做法:洪泛連結狀態通告,每台路由器自己用 Dijkstra 算出成本最低的路徑
- 說明自治系統與 BGP:網際網路之間的路由依政策選擇,不一定是最短的路
為什麼要讓路由器自己交換路由
上一課的路由都是手動加的。兩三台路由器還好,但學校的網路可能有幾十台路由器、幾百個網段,手動維護會遇到三個問題:
| 問題 | 例子 |
|---|---|
| 量太大 | 新增一個網段,每一台路由器都要加一條路由;漏了一台,就有一部分的人連不到 |
| 容易不一致 | A 以為要往 B 走、B 以為要往 A 走,封包在兩台之間繞到 TTL 用完 |
| 不會應變 | 一條線斷了,靜態路由還是指向那條線;要等管理者發現、手動改,這段時間全部不通 |
動態路由協定(dynamic routing protocol)讓路由器彼此交換「我知道哪些網段、怎麼到」,自動算出路由表; 線路斷了或恢復,也會自動重算。所有路由器的路由表重新變得一致、不再改變的狀態,叫做收斂(convergence)。
在一個單位內部使用的動態路由協定,主要有兩大類做法:
| 做法 | 路由器告訴誰 | 告訴什麼 | 代表協定 |
|---|---|---|---|
| 距離向量(distance vector) | 只告訴鄰居 | 我的整張路由表:每個網段離我多遠 | RIP |
| 連結狀態(link state) | 傳給整個區域的所有路由器 | 只有我自己的連線:我接了誰、成本多少 | OSPF |
這一課用模擬器實際看這兩種做法怎麼運作。最後再看單位與單位之間,也就是整個網際網路,用的 BGP。
距離向量:告訴鄰居我知道什麼
距離向量的規則很簡單,每台路由器定期做同一件事:
- 把自己的路由表(每個目的網段、距離)告訴每一個鄰居
- 收到鄰居的表時,對每個網段算「鄰居說的距離+我到鄰居的距離」
- 如果比自己原本知道的更近(或這個網段原本就是經過這個鄰居),就更新路由表,下一跳設為那個鄰居
例如 R2 告訴 R1:「10.0.3.0/24 離我 1 跳」,R1 到 R2 是 1 跳,所以 R1 記下「10.0.3.0/24:2 跳,下一跳 R2」。 每台路由器都只相信鄰居說的話,不知道整張網路長什麼樣子;這種算法就是 Bellman-Ford 演算法。
RIP(Routing Information Protocol)是最經典的距離向量協定。它的距離是跳數(經過幾台路由器),最多 15 跳, 16 代表無法到達;路由器每 30 秒把路由表送給鄰居一次(RIP 第 2 版定義在 RFC 2453)。 距離只看跳數,所以 RIP 分不出一條快的光纖和一條慢的線路,只要跳數一樣就當成一樣好。
下面的模擬器把「每台路由器送一次、收一次」當成一輪,所有路由器同時進行。 真實的 RIP 依各自的計時器送出,順序不會這麼整齊;這裡是為了看清楚每一輪學到了什麼。
計數到無限與水平分割
距離向量只相信鄰居說的話,這會出問題。看一條串成一列的網路:R1 — R2 — R3 — R4。收斂後:
| 路由器 | 到 10.0.4.0/24(R4 的網段) |
|---|---|
| R3 | 1 跳,下一跳 R4 |
| R2 | 2 跳,下一跳 R3 |
| R1 | 3 跳,下一跳 R2 |
現在 R3–R4 斷了。R3 丟掉經過 R4 的路由,可是 R2 剛剛才說過「10.0.4.0/24 離我 2 跳」, R3 不知道 R2 這條路其實就是經過自己,於是記下「3 跳,下一跳 R2」。接著:
- R2 聽到 R3 說 3 跳,更新成 4 跳(它的下一跳本來就是 R3,所以要接受變化)
- R3 聽到 R2 說 4 跳,更新成 5 跳
- 兩台互相把距離越推越大……
一直數到 16(無法到達)才停止,這叫計數到無限(count to infinity)。這段時間裡,往 10.0.4.0/24 的封包在 R2 和 R3 之間來回繞。 RIP 把無限定成 16,就是為了讓這個過程不要太久;代價是 RIP 的網路直徑最多 15 跳。
水平分割(split horizon)的規則:從哪個鄰居學到的路由,就不要再告訴那個鄰居。 R2 的 10.0.4.0/24 是從 R3 學來的,所以 R2 不會把它告訴 R3;R3 斷線後就找不到別的路,直接標成無法到達,再傳出去。 另一種做法叫毒性逆轉(poisoned reverse):還是告訴那個鄰居,但距離直接寫 16。RFC 2453 規定 RIP 必須實作水平分割、建議實作毒性逆轉。
水平分割擋得住兩台路由器之間的互相誤導;三台以上路由器組成的環還是可能發生計數到無限,所以實際的協定還搭配其他計時器機制。
小測驗:距離向量
R1 收到鄰居 R2 的路由表,其中 10.9.0.0/16 距離 R2 是 4 跳;R1 自己原本記的是 6 跳、下一跳 R3。R1 會怎麼做?(每條線算 1 跳)
RIP 的路由表裡,某個網段的距離是 16,代表什麼?
水平分割的規則是什麼?
連結狀態:每台路由器都有一張完整的地圖
連結狀態換了一個思路:與其傳「我覺得某網段多遠」,不如讓每台路由器都拿到整張網路的地圖,自己算。
- 每台路由器描述自己的連線:接了哪些鄰居、每條線的成本(cost),寫成一份連結狀態通告(LSA,link-state advertisement),附上序號
- 把 LSA 洪泛(flooding)出去:收到新的 LSA,就轉給除了來源以外的所有鄰居;序號比手上舊的就丟掉。最後區域內每台路由器的連結狀態資料庫都一樣
- 每台路由器以自己為起點,用 Dijkstra 最短路徑演算法算出到每個網段成本最低的路,只把「第一步往哪走」(下一跳)寫進路由表
OSPF(Open Shortest Path First)是最常見的連結狀態協定,第 2 版定義在 RFC 2328。和 RIP 比較:
| RIP(距離向量) | OSPF(連結狀態) | |
|---|---|---|
| 路由器知道的 | 鄰居說的距離 | 整個區域的地圖 |
| 選路依據 | 跳數 | 成本(常依頻寬換算,管理者可以自己設定) |
| 線路斷掉時 | 一輪一輪傳,可能計數到無限 | 新的 LSA 很快洪泛出去,各自重算 |
| 代價 | 簡單、運算少 | 要存整張地圖、跑 Dijkstra,需要較多記憶體與運算 |
網路很大時,OSPF 會把網路分成幾個區域(area),每個區域內洪泛詳細的 LSA,區域之間只交換摘要,讓地圖不會大到算不動。 下面模擬器的成本標在每條線上;跳數最少的路不一定是成本最低的路。
自治系統與 BGP:網際網路之間的路由
RIP 和 OSPF 都用在一個單位內部。整個網際網路由幾萬個獨立管理的網路組成:電信業者、雲端業者、學術網路、大型企業…… 每一個由同一個單位管理、對外有一致路由政策的網路,叫一個自治系統(AS,autonomous system),有自己的 AS 編號。
| 自治系統內部 | 自治系統之間 | |
|---|---|---|
| 協定的總稱 | 內部閘道協定(IGP) | 外部閘道協定(EGP) |
| 例子 | RIP、OSPF | BGP(Border Gateway Protocol,第 4 版定義在 RFC 4271) |
| 目標 | 找出最快、成本最低的路 | 依政策決定要走哪條、要讓誰經過 |
BGP 是一種路徑向量(path vector)協定:它告訴鄰居的不只是距離,而是到某個網段要經過哪些 AS 的清單(AS_PATH)。 收到的路徑裡如果已經有自己的 AS 編號,就知道是迴圈、直接丟掉,所以不會計數到無限。BGP 的鄰居之間用 TCP 連線(連接埠 179)交換路由。
為什麼網際網路之間不選最短的路?因為每個 AS 背後是一個單位,有自己的考量:
- 商業關係:付錢給上游業者的線路,和免費互相交換流量的線路,成本完全不同;業者通常優先走自己有收入或免費的路
- 不幫別人轉送:一個單位只想讓自己的流量經過,不想讓兩個外人的流量借道
- 可靠度與法規:有些流量要避開特定的路徑
所以 BGP 先依管理者設定的政策挑選路由,政策相同時才比較 AS 路徑的長短等條件。 這也表示一個 AS 宣告了錯誤的路由,其他 AS 若照單全收,流量就可能被導到錯誤的地方;所以業者會過濾鄰居宣告的路由,只接受合理的網段。
小測驗:連結狀態、收斂與 BGP
連結狀態協定中,每台路由器洪泛出去的 LSA 內容是什麼?
下列哪一種情況,OSPF 選的路和 RIP 最可能不同?
「網路收斂了」的意思是?
BGP 選路和 OSPF 最大的不同是?
重點整理
- 動態路由協定讓路由器自動交換路由、在線路變化後重新收斂;手動的靜態路由量大、容易不一致、不會應變。
- 距離向量(RIP):只把整張路由表告訴鄰居,用「鄰居的距離+到鄰居的距離」更新;RIP 用跳數,16 代表無法到達。
- 線路斷掉時,距離向量可能計數到無限;水平分割(不把路由告訴教你的鄰居)與毒性逆轉可以避免兩台之間互相誤導。
- 連結狀態(OSPF):洪泛各自的 LSA,每台都有整張地圖,用 Dijkstra 算成本最低的路;收斂快,但需要較多記憶體與運算。
- 網際網路由許多自治系統組成,彼此用 BGP 交換「經過哪些 AS」的路徑,依政策選路,不一定選最短。
到這裡,路由器之間的事情差不多講完了。可是每台電腦的位址、閘道、DNS 是誰設定的?下一課講 DHCP:電腦一接上網路就自動拿到這些設定。