當前位置:網站首頁>【翻譯】Packet 的旅行 — 主機間通過路由器通信

【翻譯】Packet 的旅行 — 主機間通過路由器通信

2021-08-20 01:51:33 PythonCN

我們已經研究了兩個直接相連的主機進行通信需要什麼。 我們已經研究了主機通過交換機與另一臺主機通信需要什麼。 現在我們添加另一個網絡設備,看看流量通過路由器從主機傳遞到主機需要什麼。 ​

本文將是我們將路由器視為數據包旅行中的關鍵參與者時所討論的所有內容的實際應用。 在繼續之前,可能值得查看該部分。 ​

我們將首先查看兩個主要的路由器功能,然後在查看路由器操作時查看它們的運行情况。 ​

通過這些概念討論的方式,我們將使用下圖。 我們將關注 R1,以及它將數據包從主機 A 轉發到主機 B 和主機 C 需要什麼。

為簡單起見,每個 NIC 的 MAC 地址將縮寫為4個十六進制數字。 ​

路由器功能

前面我們提到路由器的主要目的是促進網絡之間的通信。 因此,每個路由器都會在兩個網絡之間創建一個邊界,它們的主要作用是將數據包從一個網絡轉發到另一個網絡。 ​

請注意,在上圖中,我們讓 R1 在 11.11.11.x 網絡和 22.22.22.x 網絡之間創建了一個邊界。 我們讓 R2 在 22.22.22.x 和 33.33.33.x 網絡之間創建邊界。 兩個路由器在 22.22.22.x 網絡中都有一個接口。 ​

為了在網絡之間轉發數據包,路由器必須執行兩項功能:填充和維護路由錶,以及填充和維護 ARP 錶。 ​

填充路由錶

從每個路由器的角度來看,路由錶是存在的所有網絡的映射。 路由錶開始時為空,並在路由器獲知到每個網絡的新路由時填充。 ​

路由器可以通過多種方式學習每個網絡的路由。 我們將在本節中討論其中的兩個。 ​

最簡單的方法是所謂的直連路由。 本質上,當路由器接口配置了特定的 IP 地址時,路由器將知道它直接連接到的網絡。 ​

例如,在上圖中,R1 的左側接口配置了 IP 地址 11.11.11.1。 這告訴 R1 11.11.11.x 網絡的比特置存在於其左側接口之外。 同樣,R1 獲知 22.22.22.x 網絡比特於其右側接口。 ​

當然,路由器不能直接連接到每個網絡。 請注意,在上圖中,R1 未連接到 33.33.33.x,但很可能有一天它必須將數據包轉發到該網絡。 因此,必須存在另一種學習網絡的方式,而不僅僅是路由器直連。 ​

另一種方式稱為靜態路由靜態路由是由管理員手動配置的路由。 就好像你明確告訴 R1 33.33.33.x 網絡存在於 R2 之後,為了到達它,R1 必須將數據包發送到 R2 的接口(配置了 IP 地址 22.22.22.2)。 ​

最後,在 R1 獲悉兩條直連路由後,並在 R1 配置了一條靜態路由後,R1 將有一個類似於下圖的路由錶。 ​

路由錶中填充了許多路由。 每個路由都包含網絡到接口或下一跳地址的映射。 ​

路由器每次收到數據包時,都會查詢其路由錶以確定如何轉發數據包。 ​

同樣,路由錶是存在的每個網絡的映射(從每個路由器的角度來看)。如果路由器接收到發往它,沒有路由的網絡的數據包,那麼就該路由器而言,該網絡一定不存在。因此,如果數據包的目的地不在路由錶中,則路由器將丟弃該數據包。 ​

最後,還有第三種學習路由的方法,稱為動態路由。這涉及路由器自動檢測並相互通信,以相互通知它們已知的路由。有多種協議可用於動態路由,每種協議代錶不同的策略,但遺憾的是它們的複雜性超出了本系列文章的範圍。它們無疑將成為未來文章的主題。 ​

也就是說,路由錶將告訴路由器接下來將數據包轉發到哪個 IP 地址。但正如我們之前了解到的,數據包傳遞始終是 L2 的工作。為了讓路由器創建 L2 報文頭,將數據包送到下一個 L3 地址,路由器必須維護一個 ARP 錶。 ​

填充 ARP 映射錶

地址解析協議 (ARP) 是 L3 和 L2 之間的橋梁。當提供 IP 地址時,ARP 會解析相關的 MAC 地址。 設備使用 ARP 來填充 ARP 錶,有時也稱為 ARP 緩存,它是 IP 地址到 MAC 地址的映射。 ​

路由器將使用其路由錶來確定應接收數據包的下一個 IP 地址。 如果路由錶明目的地存在於直接連接的網絡上,那麼“下一個 IP 地址”就是數據包的目的地 IP 地址——該數據包的最後一跳。 ​

無論哪種方式,路由器都將使用 L2 報文頭作為容器將數據包傳送到正確的 NIC。 ​

與路由錶不同,ARP 錶是按需填充的。 這意味著在上圖中,R1 不會向主機 B 的 MAC 地址發起 ARP 請求,直到它有一個必須傳送到主機 B 的數據包。 ​

但正如我們之前所討論的,ARP 錶只是 IP 地址到 MAC 地址的映射。 當 R1 的 ARP 錶將被完全填充時,它看起來像下圖。

再一次,為簡單起見,本文中的圖片僅使用4個十六進制數字作為 MAC 地址。 實際上,MAC 地址的長度為 12 個十六進制數字。 如果更簡單,你可以簡單地將四比特十六進制 MAC 地址重複三遍,從而為 R2 的左側接口提供一個“真實”的 MAC 地址 bb22.bb22.bb22。 ​

路由器操作

了解了路由器如何填充其路由錶以及路由器打算如何填充其 ARP 錶後,我們現在可以看看這兩個錶如何實際用於路由器以促進網絡之間的通信。 ​

在上面 R1 的路由錶中,你可以看到有兩種類型的路由:一些指向接口,另一些指向下一跳 IP 地址。 我們將圍繞這兩種可能性圍繞路由器的操作進行討論。 ​

但首先,我們將討論主機 A 如何將數據包傳送到其默認網關 (R1)。 然後我們將看看從主機 A 發送數據包到主機 B 以及從主機 A 發送另一個數據包到主機 C 時R1 做了什麼。 ​

主機 A 將數據包發送到默認網關 R1

在這兩種情况下,主機 A 都在與外部網絡上的兩臺主機通信。 因此,主機 A 需要將任一數據包發送到其默認網關 — R1。 ​

主機 A 將創建 L3 報文頭,其源 IP 地址為 11.11.11.77,目標 IP 地址為 22.22.22.88(對於主機 B)或 33.33.33.99(對於主機 C)。 此 L3 報文頭將用於從“端到端”獲取數據。 ​

但是 L3 報文頭不足以將數據包傳送到 R1。 必須使用其他東西。 ​

然後,主機 A 將 L3 報文頭封裝在 L2 報文頭中,其中包括 aaaa.aaaa.aaaa 的源 MAC 地址和 aa11.aa11.aa11 的目標 MAC 地址——標識 R1 網卡的 MAC 地址。 該 L2 報文頭將用於第一跳傳送數據包。 ​

主機 A 已經配置了默認網關的 IP 地址,希望主機 A 已經與外部主機通信。 因此,主機 A 很可能已經有一個帶有 R1 的 MAC 地址的 ARP 錶條目。 相反,如果這是主機 A 與外部主機的第一次通信,則在形成 L2 報文頭之前將有一個 ARP 請求來發現 R1 的 MAC 地址。 ​

此時,R1 將有數據包。 數據包的目標 IP 地址要麼是發送到主機 B 的通信的 22.22.22.88,要麼是發送到主機 C 的通信的 33.33.33.99。這兩個目的地都存在於 R1 的路由錶中——區別在於一個路由指向 一個接口和另一個路由指向下一跳 IP。 ​

指向接口的路由

因為路由器直接連接到網絡,路由錶中指向接口的路由通常是學習的。 如果數據包的目標 IP 地址比特於直接連接到路由器的網絡中,則路由器知道它們負責將數據包傳送到其最後一跳。

該過程類似於之前討論過的過程。 路由器使用 L3 報文頭信息來確定下一步將數據包發送到哪裏,然後創建一個 L2 報文頭以將其送到那裏。 在這種情况下,此數據包必須經過的下一個(也是最後一個)躍點是到達主機 B 上的網卡。

L3 報文頭將保持不變——它與主機 A 創建的 L3 報文頭相同。

不同的是 L2 報文頭。 注意源 MAC 地址是 bb11.bb11.bb11——R1 的右接口 MAC 地址。 主機 A 為將數據包發送到 R1 而創建的舊 L2 報文頭被剝離,並生成一個新的 L2 報文頭(由 R1)以將其傳送到下一個網卡

目標 MAC 地址當然是 bbbb.bbbb.bbbb — 主機 B 的 MAC 地址。 ​

指向下一跳地址的路由

對於從主機 A 發送到主機 C 的數據包,目標 IP 地址將為 33.33.33.99。 當 R1 查詢其路由錶時,它將確定 33.33.33.x 網絡的下一跳比特於 IP 地址 22.22.22.2 — R2 的左接口 IP 地址。

實際上,這告訴 R1 使用 L2 報文頭,它將數據包發送到 R2,以便繼續沿途轉發此數據包。

由於當前“跳”在 R1 和 R2 之間,因此它們的 MAC 地址將構成源 MAC 地址和目標 MAC 地址:

同樣,L3 報文頭保持不變,它包括最初由主機 A 設置的相同源和目標 IP 地址——這些地址代錶通信的兩個“端”。然而,L2 報文頭在每一跳都完全重新生成

如果 R1 沒有 R2 的 MAC 地址,它會簡單地向路由中的 IP 地址發起 ARP 請求:22.22.22.2。從那時起,創建正確的 L2 報文頭將沒有問題,該 L2 報文頭將從 R1 獲取數據包到 R2。

隨著過程的繼續,R2 將最終接收到數據包,然後面臨與 R1 在上例中相同的情况——將數據包傳送到其最後一跳。

這個過程可以根據需要繼續。如果主機 A 試圖與路徑中具有 10 個路由器的主機 X 通信,則該過程將是相同的。路徑中的每個中轉路由器都有一個路由,將主機 X 的網絡映射到路徑中的下一跳 IP。直到直接連接到主機 X 所在網絡的最後一個路由器。最後一個路由器將負責將數據包傳送到它的最後一跳——主機 X 本身。 ​

翻譯
Host to Host through a Router[1]

參考資料

[1]

Host to Host through a Router: https://www.practicalnetworking.net/series/packet-traveling/host-to-host-through-a-router/

版權聲明
本文為[PythonCN]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2021/08/20210820015132819j.html

隨機推薦