National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 10

動態路由

距離向量與連結狀態的觀念,以及網際網路之間的 BGP
Interaction 25 minute(s)

Learning Objectives

  • 說明手動維護靜態路由在網路變大、線路故障時的問題,以及動態路由協定要解決什麼
  • 說明距離向量的做法:每台路由器把自己知道的網段與距離告訴鄰居,並在模擬器裡看到路由表逐輪收斂
  • 說明計數到無限的成因,以及水平分割怎麼避免它
  • 說明連結狀態的做法:洪泛連結狀態通告,每台路由器自己用 Dijkstra 算出成本最低的路徑
  • 說明自治系統與 BGP:網際網路之間的路由依政策選擇,不一定是最短的路

為什麼要讓路由器自己交換路由

上一課的路由都是手動加的。兩三台路由器還好,但學校的網路可能有幾十台路由器、幾百個網段,手動維護會遇到三個問題:

問題 例子
量太大 新增一個網段,每一台路由器都要加一條路由;漏了一台,就有一部分的人連不到
容易不一致 A 以為要往 B 走、B 以為要往 A 走,封包在兩台之間繞到 TTL 用完
不會應變 一條線斷了,靜態路由還是指向那條線;要等管理者發現、手動改,這段時間全部不通

動態路由協定(dynamic routing protocol)讓路由器彼此交換「我知道哪些網段、怎麼到」,自動算出路由表; 線路斷了或恢復,也會自動重算。所有路由器的路由表重新變得一致、不再改變的狀態,叫做收斂(convergence)。

在一個單位內部使用的動態路由協定,主要有兩大類做法:

做法 路由器告訴誰 告訴什麼 代表協定
距離向量(distance vector) 只告訴鄰居 我的整張路由表:每個網段離我多遠 RIP
連結狀態(link state) 傳給整個區域的所有路由器 只有我自己的連線:我接了誰、成本多少 OSPF

這一課用模擬器實際看這兩種做法怎麼運作。最後再看單位與單位之間,也就是整個網際網路,用的 BGP。

距離向量:告訴鄰居我知道什麼

距離向量的規則很簡單,每台路由器定期做同一件事:

  1. 把自己的路由表(每個目的網段、距離)告訴每一個鄰居
  2. 收到鄰居的表時,對每個網段算「鄰居說的距離+我到鄰居的距離」
  3. 如果比自己原本知道的更近(或這個網段原本就是經過這個鄰居),就更新路由表,下一跳設為那個鄰居

例如 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」。接著:

  1. R2 聽到 R3 說 3 跳,更新成 4 跳(它的下一跳本來就是 R3,所以要接受變化)
  2. R3 聽到 R2 說 4 跳,更新成 5 跳
  3. 兩台互相把距離越推越大……

一直數到 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 到 10.0.4.0/24 那一列的距離怎麼變。

小測驗:距離向量

1.

R1 收到鄰居 R2 的路由表,其中 10.9.0.0/16 距離 R2 是 4 跳;R1 自己原本記的是 6 跳、下一跳 R3。R1 會怎麼做?(每條線算 1 跳)

2.

RIP 的路由表裡,某個網段的距離是 16,代表什麼?

3.

水平分割的規則是什麼?

第 1 次作答

連結狀態:每台路由器都有一張完整的地圖

連結狀態換了一個思路:與其傳「我覺得某網段多遠」,不如讓每台路由器都拿到整張網路的地圖,自己算。

  1. 每台路由器描述自己的連線:接了哪些鄰居、每條線的成本(cost),寫成一份連結狀態通告(LSA,link-state advertisement),附上序號
  2. 把 LSA 洪泛(flooding)出去:收到新的 LSA,就轉給除了來源以外的所有鄰居;序號比手上舊的就丟掉。最後區域內每台路由器的連結狀態資料庫都一樣
  3. 每台路由器以自己為起點,用 Dijkstra 最短路徑演算法算出到每個網段成本最低的路,只把「第一步往哪走」(下一跳)寫進路由表

OSPF(Open Shortest Path First)是最常見的連結狀態協定,第 2 版定義在 RFC 2328。和 RIP 比較:

RIP(距離向量) OSPF(連結狀態)
路由器知道的 鄰居說的距離 整個區域的地圖
選路依據 跳數 成本(常依頻寬換算,管理者可以自己設定)
線路斷掉時 一輪一輪傳,可能計數到無限 新的 LSA 很快洪泛出去,各自重算
代價 簡單、運算少 要存整張地圖、跑 Dijkstra,需要較多記憶體與運算

網路很大時,OSPF 會把網路分成幾個區域(area),每個區域內洪泛詳細的 LSA,區域之間只交換摘要,讓地圖不會大到算不動。 下面模擬器的成本標在每條線上;跳數最少的路不一定是成本最低的路。

互動練習:洪泛與 Dijkstra

圖下方的表格是每台路由器的連結狀態資料庫:每一格是「這台路由器有沒有收到某台的 LSA」,#後面是序號;再下面是選取的路由器(點圖上的路由器可以換)算出的路由表。 連線列可以切斷線路或改成本;最下方的面板可以在選取的路由器上逐步執行 Dijkstra。

自治系統與 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

1.

連結狀態協定中,每台路由器洪泛出去的 LSA 內容是什麼?

2.

下列哪一種情況,OSPF 選的路和 RIP 最可能不同?

3.

「網路收斂了」的意思是?

4.

BGP 選路和 OSPF 最大的不同是?

第 1 次作答

重點整理

  • 動態路由協定讓路由器自動交換路由、在線路變化後重新收斂;手動的靜態路由量大、容易不一致、不會應變。
  • 距離向量(RIP):只把整張路由表告訴鄰居,用「鄰居的距離+到鄰居的距離」更新;RIP 用跳數,16 代表無法到達。
  • 線路斷掉時,距離向量可能計數到無限;水平分割(不把路由告訴教你的鄰居)與毒性逆轉可以避免兩台之間互相誤導。
  • 連結狀態(OSPF):洪泛各自的 LSA,每台都有整張地圖,用 Dijkstra 算成本最低的路;收斂快,但需要較多記憶體與運算。
  • 網際網路由許多自治系統組成,彼此用 BGP 交換「經過哪些 AS」的路徑,依政策選路,不一定選最短。

到這裡,路由器之間的事情差不多講完了。可是每台電腦的位址、閘道、DNS 是誰設定的?下一課講 DHCP:電腦一接上網路就自動拿到這些設定。

這一課完成了!
Next lesson:DHCP
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。