1. 程式人生 > >路由協議:敢問路在何方?

路由協議:敢問路在何方?

    前面例子中,我們都是在一個區域網內折騰。今天就讓我們擴大範圍,在多個區域網甚至到廣闊的網際網路世界中遨遊,看看這中間會發生什麼。

    這個過程中,跨閘道器訪問是我們要了解的第一個內容。

跨閘道器訪問

    當我們要了解跨閘道器訪問時,就牽扯到 MAC 地址和 IP 地址的變化,因此,我們先來看下 MAC 頭和 IP 頭的細節。

MAC 頭和IP 頭的細節

    如圖,在 MAC 頭裡,先是目標 MAC 地址,然後是源 MAC 地址,最後是協議型別。

    在 IP 頭裡,最重要的就是源 IP 地址和目標 IP 地址。除此之外,還有版本號,也就是我們常說的 IPv4 和 IPv6、服務型別 TOS(表示資料包優先順序)、TTL(資料包生存週期)以及標識協議(TCP 和 UDP)

    當我們訪問部落格園時,經過的第一個閘道器應該就是我們配置的預設閘道器。當本機訪問預設閘道器時,還是走區域網內部訪問的步驟:

  1. 將源地址和目標 IP 地址放入 IP 頭;
  2. 通過 ARP 協議獲得閘道器的 MAC 地址;
  3. 將源 MAC 地址和閘道器的 MAC 地址放入 MAC 頭中,傳送給閘道器。

    而我們的閘道器,一般就是指家裡的路由器,是一個三層轉發的裝置。它會把 MAC 頭和 IP 頭都取下來,然後根據裡面的內容,看看接下來把資料包轉發到哪裡。

    很多情況下,人們把閘道器叫做路由器。其實並不準備,用這個比喻應該更為恰當些:

路由器是一臺裝置,它有五個網口或者網絡卡,相當於有五隻手,分別連著五個區域網。每隻手的 IP 地址都和區域網的 IP 地址有著相同的網段,每隻手都是它握住的那個區域網的閘道器。

    任何一個想發往其他區域網的包,都會到達其中一隻手,被拿進來,拿下 MAC 頭和 IP 頭,然後根據自己的路由演算法,選擇另一隻手,加上 IP 頭和 MAC 頭,然後扔出去。

    注意,在上面這個過程中,有出現路由演算法。接下來,我們就來認識下它。

路由演算法

    路由演算法,又名選路演算法,是提高路由協議功能,儘量減少路由時所帶來的開銷的演算法。

    路由演算法可以根據多個特性來加以區分,找到到達目的地的最佳路由。

路由演算法的區分點有很多,有

  • 靜態與動態
  • 單路徑與多路徑
  • 平坦與分層
  • 主機智慧與路由器智慧
  • 域內與域間
  • 連結狀態與距離向量

    這裡主要介紹靜態與動態

路由演算法。

靜態路由

    靜態路由演算法,實質上是由閘道器配置好的對映表。

    我們家裡的路由器,可能會有這樣的路由配置

訪問部落格園,從 2 號口出去,下一跳是 IP2;
訪問百度,從 3 號口出去,下一跳是 IP3。

    類似上述這樣的規則就是靜態路由,按照一定的語法儲存在路由器裡。

    每當要選擇從哪個口丟擲去的時候,就一條一條的匹配規則,找到符合的規則,就按規則辦事,從指定口丟擲去,找下一跳 IP。

過閘道器的“變”與“不變”

    之前我們瞭解到,MAC 地址是一個區域網內才有效的地址。因此,MAC 地址只要過閘道器,就肯定會改變。而 IP 地址在過閘道器後 ,就不一定會改變了。

    經過閘道器 A 後,如果IP 地址沒有改變,那 A 就是轉發閘道器,否則,就是NAT閘道器

轉發閘道器

    如上圖,伺服器 A 要訪問伺服器 B,要經過過程:

1)伺服器 A 到 閘道器 A

  1. 檢查 B 的網段,發現不在同一個網段,因此發給閘道器
  2. 由於閘道器的 IP 地址是已經配置好了,因此傳送 ARP 獲取閘道器的 MAC 地址
  3. 傳送包

而最後傳送包的內容主要有:

  • 源 MAC:伺服器 A 的 MAC
  • 模板 MAC:192.168.1.1 閘道器的 MAC
  • 源 IP:192.168.1.101
  • 目標 IP:192.168.4.101

    資料包到達 192.168.1.1 這個網口後,網口發現 MAC 地址是它的,就將包收進來,然後開始“思考”往哪裡轉發。

    這時候,路由器 A 中配置了規則 A1:

要訪問 192.168.4.0/24,就從 192.168.56.1 這個網口出去,下一跳是 192.168.56.2

2)閘道器 A 到 閘道器 B

    於是,路由器 A 匹配了 A1,要從 192.168.56.1 這個口發出去,發給 192.168.56.2。於是,又開始了這個過程:

  1. 檢查 B 的網段,發現在同一個網段, ARP 獲取 MAC 地址
  2. 傳送包

資料包的內容是:

  • 源 MAC:192.168.56.1 的 MAC
  • 模板 MAC:192.168.56.2 的 MAC
  • 源 IP:192.168.1.101
  • 目標 IP:192.168.4.101

    資料包到達 192 .168.56.2 網口,網口發現 MAC 地址是它的,就將包收進來,然後去檢查路由規則。

    路由器 B 配置以下規則 B1:

想訪問 192.168.4.0/24,就從 192.168.4.1

    而路由器 B 發現,它的右網口就是目標地址網段的,因此就沒有下一跳了。

3)閘道器 B 到 伺服器 B

路由器 B 匹配上 B1。從 192.168.4.1 出口,發給 192.168.4.101。資料包內容:

  • 源 MAC:192.168.4.1 的 MAC
  • 模板 MAC:192.168.4.101 的 MAC
  • 源 IP:192.168.1.101
  • 目標 IP:192.168.4.101

    伺服器 B 收到資料包,發現 MAC 地址是它的,就把包收進來。

    通過上面的過程可以看出,每到一個新的區域網, MAC 地址都是要變的,而 IP 地址則都不變。在 IP 頭裡面,不會儲存任何閘道器的 IP 地址。

    而我們說的下一跳,就是某個 IP 要將這個 IP 地址轉換為 MAC 放入 MAC 頭

NAT 閘道器

    NAT 閘道器,也就是 Network Address Translation。

    由於各個區域網都有各自的網段,很容易出現 IP 衝突的情況。如上圖,美國伺服器 A 的 IP 地址和 法國伺服器 B 的 IP 地址都是 192.168.1.101/24,從 IP 上看,好像是自己訪問自己,但實際上從美國的 192.168.1.101 訪問法國的 192.168.1.101。

    如何解決這個問題呢?既然區域網之間沒有商量好 IP 分配,各管各的,那到國際上,也就是中間的局域網裡面,就需要使用另外的地址,就像出國後,我們要改用護照一樣。

    首先,目標伺服器 B 在國際上要有一個國際的身份,我們給它一個 190.168.56.2.在閘道器 B 上,我們記下來,國際身份 192.168.56.2 對應國內身份 192.168.1.101.凡是要訪問 192.168.56.2 的,閘道器都要轉成 192.168.1.101。

    於是,源伺服器 A 要訪問目標伺服器 B,目標地址就變成國際 IP 地址 192.168.56.2。過程如下:

1)源伺服器 A 發資料包到閘道器 A

  1. 檢查伺服器 B IP,不在同一網段
  2. ARP 獲取閘道器 MAC 地址
  3. 傳送包

資料包的內容是這樣的:

  • 源 MAC:伺服器 A 的 MAC
  • 目標 MAC:192.168.1.1 這個網口的 MAC
  • 源 IP:192.168.1.101
  • 目標 IP:192.168.56.2

    路由器 A 中 192.168.1.1 這個網口收到資料包後,檢查 MAC 地址一致,將包收進來。

    在路由器 A 中配置了規則:

想訪問 192.168.56.2/24,就從 192.168.56.1 網口發出去,發給 192.168.56.2,沒有下一跳。

    由於路由器的右網口(192.168.56.1) IP 地址和目標 IP 地址在同一網段,因此沒有下一跳。

2)閘道器 A 到閘道器 B
當網路包傳送到中間的區域網時,伺服器 A 也需要有個國際身份。因此,源 IP 地址 192.168.1.101 要改成 192.168.56.1,所以資料包的內容是:

  • 源 MAC:192.168.56.1 的 MAC
  • 目標 MAC:192.168.56.2 的 MAC
  • 源 IP:192.168.56.1
  • 目標 IP:192.168.56.2

    包到達 192.168.56.2 這個網口後,發現 MAC 一致,就將包收進來。

    而路由器 B 是 NAT 閘道器,它上面配置了,國際身份 192.168.56.2 對應國內的 192.168.1.101,於是目標地址改為 192.168.1.101。

    同樣的,路由器 B 中配置了規則:

想訪問 192.168.1.101,就從 192.168.1.1 網口出去,沒有下一跳。

    於是,資料包就從 192.168.1.1 這個網口發給 192.168.1.101。

3)閘道器 B 到伺服器 B
資料包從 192.168.1.1 網口發出後,同樣經過這些步驟:

  1. 檢查伺服器 B 的 IP,在同一網段
  2. ARP 獲取伺服器 B 的 MAC 地址
  3. 傳送包

這時的資料包就變成了:

  • 源 MAC:192.168.1.1 的 MAC
  • 目標 MAC:192.168.1.101 的 MAC
  • 源 IP:192.168.56.1
  • 目標 IP:192.168.1.101

    伺服器收到包後,檢查 MAC 地址一致,就將資料包收進來。

    從伺服器 B 接收的資料包可以看出,源 IP 為 伺服器 A 的國際身份,因而傳送返回包的時候,也發給這個國際身份,由路由器 A 做 NAT,轉換為國內身份。

動態路由

動態路由演算法
距離向量路由演算法

1)基本思路

基於Bellman-Ford 演算法。每個路由器都儲存一個路由表,包含多行,每行對應網路中的一個路由器,每一行包含兩部分資訊,一個是要到目標路由器,從哪條線出去,另一個是到目標路由器的距離

2)存在問題

a. 好訊息傳得塊,壞訊息傳的慢

新加入的路由器能夠很快的新路由器資訊廣播出去。但是如果一個路由器掛了,掛的訊息沒有廣播。每個經過這個宕機節點的路由器,無法得知該節點一宕機,而是試圖通過其他的路徑訪問,直到試過了所有的路徑,才發現這個路由器已經宕機了。

示例:

b. 每次傳送訊息,要傳送整個全域性路由表

    上面的兩個問題,限制了距離向量路由的網路規模,僅適用於小型網路(小於 15 跳)。

鏈路狀態路由演算法

1)基本思路

基於Dijkstra 演算法。當一個路由器加入網路是,首先是發現鄰居,給鄰居說 hello,鄰居都回復。然後計算和鄰居的距離,傳送一個 echo,要求馬上返回,除以 2 就是距離。接著將自己和鄰居之間的鏈路狀態包廣播出去,傳送到整個網路的每個路由器。

    這種演算法中,每個路由器都能在自己本地構建一個完整的圖,然後針對這個圖使用 Dijkstra 演算法,找到兩點之間的最短路徑。

    不像距離向量路由協議那樣,更新時傳送整個路由表。鏈路狀態路由協議只廣播更新的或改變的網路拓撲,這使得更新資訊更小,節省了寬頻和 CPU 利用率。而且一旦一個路由器掛了,它的鄰居都會廣播這個訊息,可以使得壞訊息迅速收斂。

動態路由協議
基於鏈路狀態路由演算法的 OSPF

OSPF(Open Shortest Path First, 開放式最短路徑優先)協議,廣泛應用在資料中心的協議。由於主要用在資料中心內部,用於路由決策,因此稱為內部閘道器協議(Interior Gateway Protocol,簡稱 IGP)

    內部閘道器協議的重點就是找到最短路徑。當存在多個最短路徑時,可以在這多個路徑中進行負載均衡,這常常被稱為等價路由

    等價路由不僅可以用來分攤流量,還可以提高容錯率,當一條路徑不通時,還可以通過另外一條路到達目的地。

基於距離向量路由演算法的 BGP

針對網路之間的路由協議,稱為外網路由協議(Border Gateway Protocol,簡稱 BGP)

    每個資料中心都有自己的路由配置。例如,哪些外部 IP 可以讓內部知曉,哪些內部 IP 可以讓外部知曉,哪些可以通過,哪些不能通過。

    因此,在各個資料中心進行互動時,需要一種協議,通過這種協議,可以知道相鄰資料中心的路由配置,從而找到資料中心之間最好的路由。

    BGP 協議就是這樣的協議。它不著眼於發現和計算路由,而在於控制路由的傳播和選擇最好的路由。

總結

  • 資料包要離開本區域網,就要經過閘道器,閘道器就是路由器的一個網口;
  • 路由器是一個三層裝置,理由有如何尋找下一跳的規則;
  • 經過路由器之後的 MAC 頭肯定會變。如果 IP 不變,就是 轉發閘道器,否則就是 NAT閘道器
  • 路由分靜態路由和動態路由,動態路由可以配置複雜的策略路由,控制轉發策略;
  • 動態路由主流演算法有兩種,距離向量演算法和鏈路狀態演算法。基於兩種演算法產生兩種協議,BGP 協議和 OSPF 協議。

參考:

  1. 百度百科
  2. 劉超-趣談網路協議系列課;