第 10 章 IP 路由
本章重點 10-1 什麼是 IP 路由? 10-2 路由表簡介 10-3 靜態與動態路由
IP 路由 我們在先前的章節中, 多次說明 IP 最主要的功能便是負責在網際網路上傳遞IP 封包。為了達成傳遞封包的目的, IP 必須涵蓋以下兩類規格: 靜態規格:包含 IP 封包的格式、IP 位址的規劃等等。我們在第 8 章已經詳細介紹了這些主題。 動態規格:包含 IP 封包在網路之間傳送的方式。這部份統稱為 IP 路由 (IP Routing)。 本章首先說明 IP 路由的基本觀念, 接著介紹路由器的原理, 以及路由器的運作核心―路由表, 最後介紹路由表建立的方式。
10-1 什麼是 IP 路由? 簡單地說, 在網路之間將 IP 封包傳送到目的節點的過程, 即稱為 IP 路由。換言之, 除非是在同一個網路內的兩個節點互傳 IP 封包, 否則在傳送 IP 封包時, 必然會歷經 IP 路由的過程。
什麼是 IP 路由?
什麼是 IP 路由? 在 IP 路由的過程中, 網路之間的連結扮演了重要的角色。因此, 要了解 IP 路由, 首先必須了解連結網路的裝置―路由器。我們在第 3 章網路裝置中曾介紹過路由器, 以下則是將重點放在 IP 路由中路由器運作的方式。
節點、主機與路由器 為了方便說明, 本章所用節點、主機、路由器等名詞定義如下: 節點 (Node):使用 TCP/IP 協定組合的網路裝置, 包含主機和路由器。 主機 (Host):無路由功能的節點, 一般配備網路卡的個人電腦, 皆可視為主機。 路由器 (Router):具有路由功能的節點。
10-1-1 路由器的特性 路由器為連結網路的重要裝置, 不僅在實體上可連結多個網路, 還必須具有轉送 IP 封包的能力。在整個 IP 封包的傳送過程中, 通常必須經由多部路由器的合作, 才能將 IP 封包送達目的節點。 路由器作為 IP 封包的轉送裝置, 具有以下特性: 具有兩個 (含) 以上的網路介面, 可連接多個網路, 或是直接連接到其他路由器。所謂網路介面, 泛指所有可連接網路的裝置, 例如:個人電腦上的網路卡。
路由器的特性 至少能解讀封包在 OSI 模型第 3 層 (網路層) 的資訊。這是因為路由器必須知道封包的目的網路位址, 才能進一步地執行路由工作。 具有路由表 (Routing Table)。路由表記載了有關路由的重要資訊, 路由器必須根據路由表, 才能判斷要將 IP 封包轉送到哪一個網路, 為 IP 封包選擇最佳的路徑。
路由器的特性 目前在網路層最常用的協定是 IP 和 IPX, 因此我們通常將路由器區分為 IP 路由器和IPX 路由器(較高級的路由器則可以同時支援兩種協定)。由於本書係討論 TCP/IP 網路環境的 IP 路由, 所以後文所指的路由器都假設是 IP 路由器。 除了廠商製造、販售的路由器外, 一般個人電腦只要符合上述特性, 亦可視為路由器。因此, 只要您的電腦插了兩張網路卡並安裝合適的軟體, 也可扮演一部路由器。
10-1-2 路由器的功能 路由器最主要的功能就是轉送 IP 封包。為了能正確地轉送 IP 封包, 路由器必須根據封包的目的 IP 位址, 為它選擇一條最佳路徑。所謂的路徑, 主要是指下列兩種資訊: 要經過路由器的哪個網路介面。 要再送到另一部路由器或是直接送到目的節點。如果目的節點位於與路由器直接連接的網路上, 則不必再轉送給其他路由器, 直接將 IP 封包送至目的節點即可。
路由器的功能 以下圖為例, 假設現在 A1 主機要傳送 IP 封包給 F1 主機:
路由器的功能 當 R1 路由器收到 A1 送來的 IP 封包時, 必須根據封包的目的 IP 位址(也就是 F1 主機的 IP 位址), 對照 R1 本身的路由表來決定其路徑。 從上圖的網路組態來看, 要將 IP 封包送至 F1 主機, R1 只有一條路徑可選擇, 便是將封包轉送給R2 路由器。決定路徑後, R1 便可將封包從連接 B 網路的介面送出, 轉交給 R2 路由器繼續下一步動作。
路由器的功能 本例中 R1 有「連接 A 網路」、「連接 B 網路」和「連接 C 網路」 3 個網路介面;R2 有「連接 B 網路」、「連接 D 網路」和「連接 E 網路」 3 個網路介面;R3 有「連接 E 網路」和「連接 F 網路」兩個網路介面。
路由器的功能 在上圖中 R1 與 R2 之間是透過 B 網路相連, 理論上是沒有問題的, 但萬一 B 網路發生問題時, 可能會影響 R1 與 R2 之間的連通。 因此在實務上, 會考慮直接讓路由器與路由器相連, 中間不要再經過一個區域網路。同理, R2 與 R3 路由器也會直接相連, 不會透過 E 網路。
10-1-3 IP 路由的過程 承上例, 假設 A 網路的 A1 主機, 要傳送 IP 封包給 F 網路的 F1 主機。我們將逐一檢視傳送過程中, 每部主機與路由器的動作, 藉此說明 IP 封包在路由器之間轉送的過程。
A1 主機 A1 主機在送出 IP 封包前, 必須先執行以下動作: 若 F1 位於 A1 主機所在的區域網路 (亦即 A 網路), A1 首先利用 ARP 取得 F1 的 MAC 位址, 然後以該 MAC 位址作為鏈結(Data Link)層的目的位址, 將封包直接送給 F1。
A1 主機 若 F1 不在 A1 主機所在的區域網路, 則 A1 根據路由表, 判斷出應將 IP 封包送至哪一部路由器。區域網路通常只有一部路由器, 亦即預設閘道, 在本例中, 即是 R1 路由器。A1 決定將 IP 封包送至 R1 後, 先利用 ARP 取得 R1 連接 A 網路的網路介面 MAC 位址, 然後直接將 IP 封包傳送給 R1。
R1 路由器 R1 路由器收到 IP 封包時, 會執行以下的動作: 解讀 IP 封包表頭的資訊。若存活時間等於 1 , 即停止轉送此 IP 封包, 並發出ICMP 的錯誤訊息給 A1 (請參考 9-5-5 節);若存活時間大於 1, 則將存活時間減 1 後, 繼續以下步驟。
R1 路由器 讀取 IP 封包的目的位址。以此例而言, 即是 F1 主機的 IP 位址。根據 IP 封包的目的位址, 以及 R1 路由器本身所擁有的路由表, 為 IP 封包選擇一條路徑。 若 F1 主機位於 R1 所連接的網路中 (例如:A、B、C 網路), 則直接以 ARP 取得 F1 的 MAC 位址, 然後將 IP 封包傳送給 F1。
R1 路由器 若 F1 主機位於遠端的網路 (未與 R1 連接的網路, 例如:D 、E 、F 網路), 則必須從路由表判斷應該將 IP 封包轉送給哪一部路由器處理。以此例而言, 便是將 IP 封包轉送至 R2 路由器。決定將封包轉送給 R2 路由器後, R1 便利用 ARP 取得 R2 路由器連接 B 網路的網路介面 MAC 位址, 然後直接將 IP 封包傳送給 R2。
R2 路由器 R2 路由器收到R1 送來的 IP 封包時, 所執行的動作與 R1 路由器相似, 以下僅扼要敘述: 讀取 IP 封包的目的位址, 根據路由表得知應將封包送給 R3 路由器, 再利用 ARP 取得 R3 的 MAC 位址。 將 IP 封包轉送至 R3 路由器。
R3 路由器 R3 路由器收到 IP 封包時, 所執行的動作如下: 判斷 IP 封包表頭的存活時間。 因為 F1 位於 R3 所連接的網路中 (F 網路), 因此 R3 直接以 ARP 取得 F1 的 MAC 位址, 然後將 IP 封包傳送給 F1。
R3 路由器 從上述過程中我們可以得知, 在 IP 封包傳送的過程中, 沿途所經每部路由器必須能替 IP 封包選擇正確的路徑, 才能讓 IP 封包順利到達目的地。 在網際網路上的 IP 路由, 當然複雜了許多, 但是基本的原理卻是相同。如果網際網路上每部路由器都能克盡其職, 任兩部主機便可透過 IP 路由的機制, 互相傳送 IP 封包。
10-1-4 直接與間接傳遞 在整個 IP 路由的過程中, IP 封包的傳遞大致可分為『直接』與『間接』兩種形式。 直接傳遞
直接與間接傳遞 前述的 A1 主機傳送 IP 封包至 F1 主機的過程中, 屬於間接傳遞的部份為: 屬於直接傳遞的部份則為: A1 → R1 R1 → R2 R2 → R3 屬於直接傳遞的部份則為: R3 → F1 如果 A1 主機傳送封包給同樣位於 A 網路的 A2 主機, 則只須用到直接傳遞, 不會產生間接傳遞。
10-2 路由表簡介 路由表其實是一個小型的資料庫, 其中的每一筆路由紀錄, 記載了通往每個節點或網路的路徑。 當路由器收到 IP 封包時, 必須根據 IP 封包的目的位址, 更精確地說, 是 IP 位址中的網路位址(Network ID), 選擇一筆合適的路由紀錄, 然後將封包透過此紀錄所指定的網路介面轉送出去。 本節首先介紹路由表的各個欄位, 然後再說明路由器如何為 IP 封包選擇最佳路徑。
10-2-1 路由表的欄位 路由表的欄位會因製造廠商及規格而有差異, 不過基本上會有以下欄位: 網路位址 (Network Destination) 網路遮罩 (Netmask) 介面 (Interface) 閘道 (Gateway) 成本 (Metric) 為了方便說明, 首先我們模擬一個簡化的網路環境。
路由表的欄位
路由表的欄位 在上圖的環境中, 總共有 A、B、C、D等 4 個網路, 以及 R1 、R2 等兩部路由器。
網路位址與網路遮罩 由於這兩個欄位的資訊必須合起來解讀才有意義, 因此將之合併說明。 路由紀錄利用網路位址與網路遮罩兩個欄位來代表的目的地 IP 位址的範圍, 也就是用來定義目的網路。 有關網路位址與網路遮罩的說明請參閱第 8 章。
網路位址與網路遮罩 以 R1 路由器而言, 通往 A、B、C、D 等網路的路由記錄, 其網路位址與網路遮罩兩個欄位值如下 (其它欄位暫時省略):
網路位址與網路遮罩 請注意, 路由紀錄也可用來代表通往某個主機的路徑。當路由紀錄代表單一主機時, 網路位址欄位必須填入主機的 IP 位址, 網路遮罩欄位則是 255.255.255.255 。 假設 R1 路由器中有一筆 A1 主機的路由記錄, 則網路位址與網路遮罩兩個欄位值如下。
網路位址與網路遮罩 為了節省空間, 路由表中的紀錄一般代表一個網路;代表單一主機的紀錄則較為罕見。
介面 此欄位記錄路由器本身網路介面的 IP 位址。由於路由器具有多個網路介面, 而每個網路介面都會對應一個 IP 位址, 當路由器決定以某筆路由紀錄來轉送 IP 封包時, 便會將 IP 封包從該紀錄指定的介面轉送出去。
介面
閘道 記錄要將 IP 封包轉送至哪一部路由器。若目的網路已直接連接在此一路由器, 代表毋須再將 IP 封包轉送給其他路由器, 因此閘道欄位填入網路介面的 IP 位址即可。 以 R1 路由器為例, 通往 A、B、C 網路的路由紀錄, 由於這 3 個網路直接與 R1 連接, 不必再轉送給其他路由器, 因此閘道欄位填入網路介面的 IP 位址。 至於 D 網路, 因為必須將封包轉送給 R2 路由器, 因此閘道欄位填入 R2 路由器連接B 網路的網路介面位址。
閘道
成本 用來表示路徑的成本。如果有兩筆路由紀錄的網路位址與網路遮罩相同, 則路由器會挑選成本最小的路徑來使用。成本通常設為到達目的網路所須經過的躍程(Hop) 數目。 什麼是躍程數目呢?IP 封包從來源端傳送到目的端, 途中所經過的路由器數目即是躍程數目。
成本 請參考圖 10-03, 以 R1 路由器為例, 到 A、B、C 網路的路徑為 1 個躍程;到 D 網路為 2 個躍程:
成本 但是, 成本欄位並不必然就是代表躍程數目, 在不同的路由協定, 可能會有不同的意義。例如, OSPF (一種動態路由協定) 會根據頻寬、延遲等等因素來計算成本欄位值。 因此成本欄位可說是對於每條路徑的『加權』 (Weighting) 值 , 而路由器會優先選擇成本最小的路徑!
10-2-2 決定路徑的步驟 當路由器收到 IP 封包時, 會為它選擇一條最佳路徑, 其實就是選擇一筆最合適的路由紀錄。以下為路由器選擇路徑的步驟: 將 IP 封包的目的 IP 位址與路由紀錄的網路遮罩做位元 AND 運算。例如:目的 IP 位址若為 203.74.205.33, 路由紀錄的網路遮罩為 255.255.255.224, 則運算結果為 203.74.205.32 。
決定路徑的步驟
決定路徑的步驟 將上述結果與路由紀錄的網路位址比較。若二者相同, 代表適合用這筆路由紀錄來轉送此 IP 封包。 對每一筆路由紀錄重複第 1 、2 步驟。若找不到任何適用的紀錄, 則使用預設路由, 亦即將封包轉送給預設的路由器來處理。
決定路徑的步驟 若有多筆符合的紀錄, 則從中找出網路遮罩欄位中最多 1 的紀錄。這是因為網路遮罩欄位的 1 愈多, 代表目的網路的規模愈小, 因此路徑較為精確。假設符合步驟 1 、2 有以下兩筆紀錄。 則路由器會優先使用第 1 筆紀錄。
決定路徑的步驟 找出成本最小的紀錄。成本欄位代表路徑的成本, 因此路由器會優先選擇成本較低的路徑。
10-3 靜態與動態路由 前幾節介紹了 IP 路由的原理, 接下來我們將說明如何建立路由表。路由表的建立方式有以下兩種: 靜態方式 (Static):由網管人員手動將路由紀錄逐一加入路由表。 動態方式 (Dynamic):由路由協定自動建立與維護路由表, 毋須人為輸入。
10-3-1 靜態路由 由於靜態路由的路由表, 必須以人工的方式來建立, 因此適用於小型且穩定的網路環境。本節將示範如何在小型網路環境中使用靜態路由。
範例 1:1 部路由器的環境 首先假設一個最簡單的路由環境 ― 1部連接兩個網路的路由器。
範例 1:1 部路由器的環境 LAN 1 與 LAN 2 的網路位址與網路遮罩如下表所示:
範例 1:1 部路由器的環境 R1 路由器的介面如下所示:
範例 1:1 部路由器的環境 若要讓 LAN 1 與 LAN 2 能夠互傳封包, 必須在 R1 加入以下兩筆路由紀錄: 第 1 筆紀錄可轉送目的地為 LAN 1 的 IP 封包;第 2 筆紀錄可轉送目的地為LAN 2 的 IP 封包。
如何在路由表中新增路由紀錄? 如果您用的是硬體路由器, 例如:思科 (Cisco) 的路由器, 通常可用 telnet 命令連上路由器, 然後以 ip route 命令來新增路由紀錄。 如果是以個人電腦作為路由器, 則作業系統或軟體會提供相關的工具程式。以 Windows 2000 Server 為例, 可在路由及遠端存取中設定路由紀錄, 也可從命令提示字元執行 route 命令, 新增、修改或刪除路由表中的路由紀錄。
範例 2:2 部路由器的環境 接著我們以 2 部路由器連接 3 個網路為例。
範例 2:2 部路由器的環境 LAN 1、LAN 2 與 LAN 3 的網路位址與網路遮罩如下表所示:
範例 2:2 部路由器的環境 R1 路由器的介面如下所示: R2 路由器的介面如下所示:
範例 2:2 部路由器的環境 假使要讓 3 個網路能正常運作, 則必須分別在 R1 與 R2 加入適當的路由紀錄。
範例 2:2 部路由器的環境 前兩筆紀錄與範例 1 相同, 用來轉送 LAN 1 與 LAN 2 的封包。第 3 筆紀錄可將目的地為 LAN 3 的 IP 封包轉送給 R2, 因此, 閘道欄位必須填入 R2 連接 LAN 2 的介面 IP 位址。 R2 必須加入以下 3 筆路由紀錄。
範例 2:2 部路由器的環境
範例 2:2 部路由器的環境 第 1 筆紀錄可將目的地為 LAN 1 的 IP 封包轉送給 R1, 因此, 閘道欄位必須填入 R1 連接 LAN 2 的介面 IP 位址。後兩筆紀錄用來轉送 LAN 2 與 LAN 3 的封包。
範例 3:2 部路由器 + 預設路由 延續先前的網路架構, 我們再加上一部 R3 路由器, 對外連接至網際網路。
範例 3:2 部路由器 + 預設路由 LAN 1、LAN 2、LAN 3 以及 R1 、R2 的設定與範例 2 相同。R3 路由器的介面如下所示:
範例 3:2 部路由器 + 預設路由 R1 與 R2 路由器除了必須加入範例 2 的路由紀錄外, 還要再建立『預設路由』。當 R1 與 R2 收到的 IP 封包與所有的路由紀錄都不相符時, 便會使用預設路由將之傳送給 R3 。 例如:R1 若收到目的位址為 168.95.192.1 的 IP 封包, 因為與3 個 LAN 的路由紀錄都不相符, 因此便轉送給 R3, 再送到網際網路上。
範例 3:2 部路由器 + 預設路由 R1 必須建立以下的路由紀錄作為預設路由: 路由紀錄的網路位址為 0.0.0.0, 且網路遮罩為 0.0.0.0 時, 代表此為預設路由。
範例 3:2 部路由器 + 預設路由 R2 必須建立以下的路由紀錄作為預設路由: R3 可說是 LAN 1、LAN 2、LAN 3 等網路聯外的閘道, 因此必須有這 3 個網路的路由紀錄。
範例 3:2 部路由器 + 預設路由
範例 3:2 部路由器 + 預設路由 這 3 筆紀錄分別負責轉送目的地為 LAN 1、LAN 2 與 LAN 3 的封包。 此外, R3 也必須設定預設路由, 將封包轉送到網際網路。R3 的預設路由通常是指向與 ISP 連接的路由器。
10-3-2 動態路由 當網路規模不大時, 採用靜態方式建立路由表的確是個可行的方式。但是當網路不斷擴大時, 路由表的資料將會以等比級數暴增。此時若再使用靜態方式, 則在設定和維護路由表時, 會變得複雜且困難重重。 為了解決這個問題, 有人提出了利用動態方式建立路由表的觀念, 讓路由器能透過某些機制, 自動地建立與維護路由表。並在有多重路徑可供選擇時, 自動計算出最佳的路徑來傳送封包。
動態路由 採用動態方式建立路由表的網路就是動態路由網路 (Dynamic Routing Network);而負責建立、維護動態路由表, 並計算最佳路徑的機制就是動態路由協定 (Dynamic Routing Protocol)。常見的動態路由機制有距離向量演算法與鏈接狀態演算法。
距離向量演算法 簡言之, 距離向量演算法 (Distance Vector Algorithm) 就是讓每部路由器都和鄰接的路由器交換路由表, 藉以得知網路狀態, 判斷封包傳送的最佳路徑。 更精確地說, 應該是每一部路由器都會將自己的路由表廣播到網路上, 藉以建立動態路由表。
距離向量演算法
距離向量演算法 當每一部路由器收到此廣播封包時, 便會核對自己的路由表, 進行以下步驟: 收到的路由紀錄中, 是否有我沒有記錄到的資料?若然, 則新增此筆紀錄, 反之則繼續下一個步驟。 此筆紀錄是不是由同一部路由器所發出?若然, 則更新路由紀錄, 反之則進入下一個步驟。 比對路徑成本。若該筆路由紀錄的成本較小, 則更新路由紀錄, 反之, 則不予理會。
距離向量演算法 最後每部路由器都會擁有一份完整的動態路由表, 裡面則記錄了所有網路的路的距離 (要經過多少個躍程) 與向量 (經由哪一個介面, 也就是方向)。 在上述交換路由表的過程中, 距離向量演算法會計算出最小成本的路徑, 當做封包傳遞的最佳路徑, 例如:
距離向量演算法
距離向量演算法 在上圖的網路架構中, 若LAN1 要送封包到LAN2, 實際可走的路徑有2 條: 1. LAN1 → A 路由器→ B 路由器→ LAN2 2. LAN1 → A 路由器→ C 路由器→ D 路由器→ LAN2 由於在交換路由表時, 每部路由器都會把自己路由表中每筆紀錄的成本加1,然後廣播到網路上。因此, A 路由器透過距離向量演算法便可得知第1 條路徑的成本為1 (經過一部路由器), 而第 2 條路徑成本為2 (經過兩部路由器), 從而選擇第1 條路徑, 將封包傳送出去。
距離向量演算法 距離向量演算法的優點是其運作方式單純, 不過也有如下缺點: 用路由器數量當成本, 而未考慮其連線的屬性, 假設上圖中的A、B 連線是100Mbps 乙太網路, 而A、C、D 是1Gbps 或更快的乙太網路, 則反過來第2 條路徑會是較佳的選擇。
距離向量演算法 可能會引發『路由迴圈』, 舉例來說, 若A、C 間的線路突然故障, 而C 還沒來得及通知D, 後者就依其既有路由表內容送封包到C 請它送給A, C 可能將之傳回D 請它改道, 但後者又再依路由表記錄送給C...;甚至可能因D先廣播其『舊』的路由表, 讓C 以為可經由D 到達LAN1..., 如此封包不斷來回傳送就稱為路由迴圈。
距離向量演算法 網路上各路由器取得一致資訊的時間 (稱為收歛時間), 會隨網路中路由器數量增加而大幅增加, 且網路拓蹼改變時, 重新收斂也較慢。因此不適合中、大型的網路。 另外, 使用距離向量演算法的路由器通常會定時向鄰居廣播路由表內容, 有時反而佔用了不少網路頻寬。因此後來就出現另一種鏈接狀態演算法。
鏈接狀態演算法 鏈接狀態演算法(Link-State Algorithm) 又稱最短路徑優先(SPF, Shortest Path First) 演算法, 因為在鏈接狀態的路由協定中, 會利用所取得的資料, 依SPF演算法建立代表整個網路地圖的樹狀結構, 並依此來決定後續傳送封包時的路徑。 Shortest Path First 演算法又稱為 Dijkstra 演算法 (根據提出者 Edsger Dijkstra 命名), 此演算法的細節請參見演算法相關書籍。
鏈接狀態演算法 使用鏈接狀態演算法的路由器, 會將其所有連接的狀態 (連線的類型、成本, 該連線所連接的路由器等) 通知其它路由器, 各路由器收到資訊時, 會再將之向外發送出去。經過一連串的傳送動作, 各路由器會取得網路中『所有』路有器每一個連線的狀態資訊, 接著就利用SPF 演算法, 算出到不同目的地的成本, 建立最短路徑的樹狀地圖, 再用它來建立路由表, 如下圖所示。
鏈接狀態演算法
鏈接狀態演算法 使用鏈接狀態演算法, 路由器不但能得知整個網路的最短路徑, 且會在網路拓蹼改變時主動通知其它路由器, 因此收斂時間短, 也比較不會有路由迴圈的問題。 但因為要做比較複雜的運算, 路由器需要較強的計算能力及較多的記憶體空間, 不過這在硬體發達的今日, 通常不是問題。
鏈接狀態演算法 距離向量演算法的路由器只會知道透過某介面, 經過幾個路由器可達目的網路, 但它不會知道會經過『哪幾個路由器』;鏈接狀態演算法則會知道傳送路徑中所有路由器及其狀態。
動態路由協定 動態路由協定種類繁多, 其運作方式及協定內容算是較深入的主題, 限於篇幅將不逐一介紹, 以下僅列出一些常見的動態路由協定: 距離向量路由協定:RIP (Routing Information Protocol) 鏈接狀態路由協定:OSPF (Open Shortest Path First)、IS-IS (Intermediate System to Intermediate System) 網際網路路由協定 (例如ISP 之間):BGP (Border Gateway Protocol)