
假設同一網路上存在兩個網關。如果我理解正確的話,發送者電腦上的 IP 路由表決定哪些封包通過哪個網關路由。
IP 路由表包含網關的 IP 位址。
發送IP封包時如何使用網關的IP位址?
答案1
TL;DR:網關的位址僅儲存在儲存 TCP/IP 封包的乙太網路封包中
伺服器->交換器->路由器流量以及伺服器->交換器->伺服器流量是IP尋址實際上不起任何作用的地方。這是底層協定的世界,很可能是乙太網路。所以這是一個基於 MAC 尋址的世界。
所以你只需要解決預設網關是IP地點的困惑即可。嗯,有點...向人類展示的內容...但是該網關的 IP 是僅有的需要做一件事,那就是問:這附近誰有192.168.1.1?答案是網關是 MAC 88:99:aa:bb:cc:dd:ee:ff。 (這就是 ARP 查詢/回應,兩個世界之間的轉換器。)MAC 是實際使用的。封包在乙太網路層級上到達該 MAC,儘管事實上在 IP 層級上封包指定了最終接收者的完全不相關的目標 IP 位址。
因此,透過設定乙太網路封包的「目標 MAC」字段,將封包標記為前往選定的網關。如果有多個網關,則該欄位決定該網路上的哪個網關將取得它。 (「框架」是一個底層膠囊,用於容納資料包或資料包的一部分。)
概括:雖然路由表是 IP 的核心,但其名為「下一跳」的列是絕不當資料包透過線路傳輸時,透過 IP 尋址來實現。下一跳實際上始終使用乙太網路、MPLS 或其他底層協定:
$ ip route show
192.168.98.0/24 via 192.168.99.1 dev eth0
| | |
| <- IP world -> | <- underlying world -> |
| | |
上面,即使底層世界提到諸如 之類的東西192.168.99.1
(這是一個 IP 世界概念),它們實際上並不是字面意思。
答案2
IP資料封包頭只包含來源位址和目的位址資訊。根據目的地,路由器應該知道下一步將封包轉發到哪裡,並且該資訊儲存在路由表中。
可能有靜態路由位址或其子網路的資訊以及預設網關用於其餘部分。這通常是本地網路上的情況:可能有到其他本地網路的靜態路由和其餘網路(即網際網路)的預設閘道。如果有幾個預設網關0.0.0.0
即前往或的路線::
,活動的路由由其選擇偏愛或者公制價值。
當目的地之間存在多條路由時,事情會變得更加複雜,就像互聯網級別的 ISP 之間存在路由一樣。有幾種方法可以在路由器之間共享資訊:路由資訊協定(安息吧),開放最短路徑優先(OSPF),以及邊界網關協議(邊界網關協定)。無論如何共享此信息,路由表都知道下一跳,而 IP 封包只知道其最終目的地。
答案3
簡短而簡單的答案:它不會在資料包中進行編碼,或者它是乙太網路目標位址,這取決於您如何看待它。 IP/乙太網路堆疊查看哪個網關處理目標 IP 位址,向網關 IP 位址發送 ARP 請求以取得其 MAC 位址,然後將封包傳送到網關的 MAC 位址。然後網關轉送封包並再次執行相同的操作。這假設有乙太網路。
我想我回答了你的問題。我曾經也想過同樣的事情。您的問題也可以解釋為主機如何在給定特定路由表的情況下決定將傳出資料包傳送到哪個網關。
答案4
當然,需要考慮的一個細節是路線是否匹配。如果我發送到 192.0.2.55/24 並且有一條路由可用於發送到 10.55.0.0/16 的流量,則該路由將被忽略,因為它不適用。
通常考慮的下一個標準是讓更具體的路線優先於更一般的路線。我所說的「特定」路由是指較小的子網路。換句話說,使用 /CIDR 表示法時,數字更大,而使用「子網路遮罩」表示法時,子網路遮罩更大。換句話說,目標網路的可能位址較少。
因此,「預設閘道」(也稱為「最後網關」)通常指定 0.0.0.0/0 網路的所有流量的目的地。較小網路的任何路由都將比該路由“更具體”,並且優先。因此,192.0.2.0/24 將具有更高的優先權。
第三,路由通常有另一個稱為「度量」的字段,或者有時有一個不同的名稱,例如「優先順序」。如果您有多個大小相同的網絡,這可能會產生影響。
這些「度量」值可以是自動產生的(例如,高速網路用於更多流量的方式),但可以手動調整。
發送的 IP 封包中編碼的有關網關的資訊在哪裡?
IP 封包不包含任何有關路由的信息,除了指定目標 IP 位址之外。路由詳細資訊由沿途處理路由的設備決定,且此類詳細資訊通常不會放置在 IP 封包中。 (因此,設備不會查找此類詳細信息,因為它不存在。由於設備不會查找此類信息,因此嘗試包含此類信息是毫無意義的。)
RFC 791 第 11 頁顯示 IP 封包中資訊的「ASCII ART」樣式表。在該表之後,該文件顯示了詳細資訊(例如,第 15 頁上所述的「選項」部分)。