71 張圖詳解 IP 地址、IP 路由、分片和重組、三層轉發、ARP、ICMP

目錄

有小夥伴問:爲什麼沒有配置 IP 地址就無法上網?IP 協議又是啥?

這要從 TCP/IP 協議說起,互聯網使用的是 TCP/IP 協議,其中 IP 協議又是最重要的協議之一。IP 協議是基於 IP 地址將數據包發送給目的主機,能夠讓互聯網上任何兩臺主機進行通信。

網絡層通信

IP 協議位於 OSI 參考模型的第三層,即網絡層

網絡層

網絡層的主要作用是實現終端節點之間的通信。這種終端節點之間的通信,也叫點對點通信

IP 的作用

數據如何傳輸到目的地?

數據鏈路層實現兩個直連設備之間的數據傳輸,網絡層的 IP 協議實現沒有直連的兩個網絡之間的數據傳輸。

以旅行爲例,小美要去一個很遠的地方旅行,先計劃要乘坐的高鐵、地鐵、公交車,並且購買相應車票,再製定一個詳細行程表,記錄乘車時間。

高鐵票、地鐵票只能在一個區間內移動,就像網絡上的數據鏈路。出發點就像源 MAC 地址,目的地就像目的 MAC 地址,整個行程表的作用就相當於網絡層,出發點就像源 IP 地址,目的地就像目的 IP 地址。

小美的旅行

小美如果只有行程表,沒有車票,就無法乘坐交通工具到達目的地。相反,小美只有車票,不知道坐什麼車,在哪裏換乘,恐怕也到不了目的地。只有兩者兼備,既有某個區間的車票又有整個旅行的行程表,才能保證到達目的地。網絡中也需要數據鏈路層和網絡層協同工作,才能實現最終目的地址的通信。

IP 地址的基礎知識

在 TCP/IP 通信中使用 IP 地址識別主機和路由器。IP 地址是邏輯地址,需要手工配置或自動獲取,爲了保證正常通信,每個設備必須配置 IP 地址

IP 地址

IP 地址的定義

IP 地址由 32 位二進制數組成。爲了方便記錄,將 32 位的 IP 地址分爲 4 組,每 8 位爲一組,每組以 “.” 隔開,再將每組數轉換爲十進制數。

IP 地址表示方法

二進制與十進制怎麼快速轉換?

通過 Windows 系統自帶的計算器,選擇程序員,可實現二進制和十進制的快速轉換。默認十進制(“DEC”)輸入,單擊 “ BIN ” 切換成二進制輸入。同步顯示十六進制、十進制、八進制和二進制的數值。

二進制與十進制轉換

IP 地址一共有多少個?

將 IP 地址的 32 位二進制進行計算,得出約 43 億個 IP 地址。

IP 地址數量

使用 Windows 系統自帶計算機,選擇科學模式,可快速進行次方計算。

實際上,網絡的發展超乎想象,互聯網上的設備遠超 43 億, 2019 年 11 月 25 日全球的 IPv4 地址已經徹底耗盡,但是直到現在大家仍然還在用 IPv4 ,並沒有因爲地址沒了而無法上網。是因爲除了 IPv6 之外,我們使用 NAT 技術緩解了地址不足的問題。這篇文章裏的 IP 全是指的 IPv4 ,非 IPv6 。

IP 地址的組成

IP 地址由網絡號(網段地址)和主機號(主機地址)兩部分組成。

IP 地址組成

網絡號是設備所在區域的一種標識,網絡號相同的設備位於同一個網段內,網絡號不同的設備通過路由器實現通信。主機號是在同一個網段中不同設備的標識,不允許同一個網段內出現重複的主機號。

IP 地址配置舉例

路由器是根據目的 IP 地址的網絡號進行路由。

路由器轉發原理

那麼 IP 地址哪幾位是網絡號?哪幾位是主機號?早期是以分類地址區分,現在是以子網掩碼區分。

IP 地址的分類

IP 地址分爲四類,分別是 A 類、 B 類、 C 類、 D 類(還有一個保留的 E 類)。

分類地址

A 類地址

A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網絡號,網絡號的範圍是 0 ~ 127 。其中 0 和 127 屬於保留地址,減去兩個保留地址,因此有 126 個可用的 A 類地址。

A 類地址網絡號

計算 A 類地址數量

後 24 位是主機號,一個 A 類地址的主機地址數量就是 2 的 24 次方,即 16777216 個主機地址。

A 類地址主機號

計算 A 類主機地址數量

B 類地址

B 類 IP 地址是前兩位以 “10” 開頭的地址。從第 1 位到第 16 位是它的網絡號,網絡號的範圍是 128.0 ~ 191.255 。其中 128.0 和 191.255 屬於保留地址,減去兩個保留地址,因此有 16382 個可用的 B 類地址。

B 類地址網絡號

計算 B 類地址數量

後 16 位是主機號,一個 B 類地址的主機地址的數量就是 2 的 16 次方,即 65536 個主機地址。

B 類地址主機號

C 類地址

C 類 IP 地址是前三位以 “110” 開頭的地址。從第 1 位到第 24 位是它的網絡號,網絡號的範圍是 192.0.0 ~ 223.255.255 。其中 192.0.0 和 223.255.255 屬於保留地址,減去兩個保留地址,因此有 2097150 個可用的 C 類地址。

C 類地址網絡號

計算 C 類地址數量

後 8 位是主機號,一個 C 類地址的主機地址的數量就是 2 的 8 次方,即 256 個主機地址。

C 類地址主機號

D 類地址

D 類 IP 地址是前四位以 “1110” 開頭的地址。從第 1 位到第 32 位是它的網絡號,網絡號的範圍是 224.0.0.0 ~ 239.255.255.255 。D 類地址沒有主機號,用於組播

網段地址和廣播地址

當主機號全爲 0 時,表示的是網段地址,非主機地址。當主機號全爲 1 時是廣播地址,也不是主機地址。因此在分配 IP 地址過程中,需要排除這兩個地址。例如一個 C 類地址 192.168.1.0/24 最多隻有 254 個可用主機地址,而不是 256 個。

網段地址和廣播地址

廣播地址

IP 地址中的主機號全部爲 1 的就是廣播地址,它是向同一個網段中的所有主機發送數據包。例如一個 B 類主機地址 172.20.1.100 的廣播地址是 172.20.255.255 。

廣播地址

IP 組播

組播用於將包發送給特定組內的所有主機。

組播

組播使用 D 類地址。因此 IP 地址前四位是 “1110” 開頭的,就是組播地址。剩下的 28 位就是組播的組編號。組播的地址範圍是 224.0.0.0 ~ 239.255.255.255 ,其中 224.0.0.0 ~ 224.0.0.255 既可以在同一個網段內實現組播,又可以跨網段給全網所有組員發送組播包。

組播地址格式

子網掩碼

早期網絡地址採用固定網絡位長度的方式,使 IPv4 地址遭到大量浪費。如今網段地址的長度可變,同時也需要一種標識來獲取網段地址,以便路由器對數據包進行轉發,這種識別碼就是子網掩碼

子網掩碼用 32 位的二進制表示, IP 地址的網段地址部分設置爲 1 , IP 地址的主機地址部分設置爲 0 。換句話說, IP 地址有多少位網段地址,子網掩碼就有多少位取 1 ,其餘都取 0 。爲了方便記錄,每 8 位爲一組,以 “.” 隔開,再轉換爲十進制數。

例如:201.20.100.25 的子網掩碼是 255.255.255.0 ,算出它的網段地址。

子網掩碼

將子網掩碼和 IP 地址進行與( AND )運算,可得到這個 IP 地址的網段地址。

與運算

與( AND )運算

IP 地址和子網掩碼的二進制數,逐位進行計算。只有當 IP 地址和掩碼都是 1 時,運算結果爲 1 。其餘情況計算結果都爲 0 。

AND 運算

Windows 系統自帶計算機也可以進行二進制與運算。

與運算舉例

IP 地址的另一種表示方式是在每個 IP 地址後面追加網絡號的位數用 “ / ” 隔開。例如:201.20.100.25/255.255.255.0 可表示爲 201.20.100.25/24 。

CIDR 與 VLSM

解決 IP 地址浪費問題,除了使用子網掩碼,還使用了 CIDR 和 VLSM 技術。

CIDR ,即無類域間路由,採用任意長度分割 IP 地址的網絡號和主機號。它有兩個作用:

CIDR 應用

VLSM ,即可變長子網掩碼,它可以對 A 、 B 、 C 類地址再進行子網劃分,以達到充分利用 IP 地址的目的。

假如一家企業有 100 臺電腦,按以前的辦法,只能分配一個 C 類地址 222.222.222.0 。但是 VLSM 可以在一個 C 類地址上劃分出多個子網地址,再分配其中一個容納主機數量與稍大於企業需求數量的子網地址給企業,這樣就可以實現 IP 地址的合理使用。

計算子網容量

子網地址劃分

CIDR 和 VLSM 的區別

CIDR 是主機號向網絡號借位,目的是把幾個網絡彙總成一個大的網絡,增加子網主機數量;

VLSM 是網絡號向主機號借位,目的是把一個標準的網絡劃分成幾個子網,減少子網主機數量。

公網地址與私有地址

IP 地址分爲公網地址和私有地址。公網地址是在互聯網上使用的,私有地址是在局域網中使用的。

公網地址由 Internet NIC 負責分配,通過它直接訪問互聯網。

公網地址範圍

私有地址是一段保留的 IP 地址。只在局域網中使用,無法在互聯網上使用。但是私有地址可以通過 NAT 技術,將私有地址轉換爲公網地址接入互聯網。

私有地址範圍

公網 IP 地址在互聯網範圍內是唯一的,私有 IP 地址只要在同一個局域網內唯一即可。在不同局域網內出現相同的私有 IP 不會影響使用。

IP 路由

IP 路由是設備根據 IP 地址對數據進行轉發的操作。當一個數據包到達路由器時,路由器根據數據包的目的地址查詢路由表,根據查詢結果將數據包轉發出去,這個過程就是 IP 路由。

路由控制

路由表

爲了將數據包發給目的節點,所有節點都維護着一張路由表。路由表記錄 IP 數據在下一跳應該發給哪個路由器。IP 包將根據這個路由表在各個數據鏈路上傳輸。

路由表

路由表的生成方式有兩種:一種是手動設置,也叫靜態路由。另一種是路由器之間通過交換信息自動刷新,也叫動態路由

靜態路由與動態路由

下一跳

Hop ,中文叫 “跳”。它是指網絡中的一個區間。IP 包就是在網絡中一跳一跳的轉發,在每一個區間內決定 IP 包下一跳的路徑。

一跳是指數據鏈路中廣播域的區間,也就是說不經過路由器而能直接到達的相連主機或路由器網卡的一個區間。

多跳路由

IP 數據包就像包裹,而送貨車就像數據鏈路。包裹不可能自己移動,必須有送貨車承載轉運。而一輛送貨車只能將包裹送到某個區間範圍內。每個不同區間的包裹將由對應的送貨車承載、運輸。IP 的工作原理也是如此。

IP 工作原理

路由條目類型

默認路由

默認路由是指路由表中任何一個地址都能與之匹配的條目。所有數據包都可以使用默認路由進行數據轉發。默認路由爲 0.0.0.0/0 或 default 。

默認路由

主機路由

“IP 地址 / 32” 被稱爲主機路由,它是路由表中指向單個 IP 地址或主機名的路由條目。例如:192.168.153.15/32 就是一條主機路由,表示整個 IP 地址的所有位都將參與路由。

迴環地址

以 127 開頭的 IP 地址都是環回地址,其所在的迴環接口可以理解爲虛擬網卡。使用迴環地址時,數據包會直接被主機的 IP 層獲取,而不經過鏈路層,也不會流向網絡。一般用來檢查主機上運行的網絡服務是否正常。

路由彙總

路由彙總主要是爲了減少路由條目,把可以聚合的路由匯聚爲一個大網絡。

路由表越大,查找路由表所需的內存和 CPU 也就越多,時間也會越長,導致轉發 IP 數據包的性能下降。如果想要搭建大規模、高性能的網絡,就需要儘可能的路由表的大小。

路由彙總

IP 分片與重組

數據鏈路不同, MTU 則不同

每種數據鏈路的最大傳輸單元( MTU )不同,網絡層的 IP 是數據鏈路的上一層, IP 通過分片屏蔽數據鏈路的差異,實現不同數據鏈路互通。從 IP 的上一層看,它完全可以忽略各個數據鏈路上的 MTU ,只需要按照源 IP 地址發送的長度接收數據包。

數據鏈路 MTU 表

IP 報文的分片與重組

當遇到 IP 數據包大於數據鏈路 MTU 時,往往無法直接發送出去,主機或路由器就會對 IP 數據包進行分片處理。

經過分片後的 IP 數據,只會在目標主機上進行重組,中途經過路由器時不會進行重組。

IP 報文的分片與重組

路徑 MTU 發現

分片機制有兩點不足:

爲了解決這個問題,要使用路徑 MTU 發現( Path MTU Discovery )技術。路徑 MTU 是指從發送端主機到接收端主機之間不需要分片時最大 MTU 值。即路徑中存在的所有數據鏈路中最小的 MTU 。路徑 MTU 發現是從發送主機按照路徑 MTU 的值將數據報分片後進行發送,避免在中途的路由器上進行分片處理。

路徑 MTU 發現

路徑 MTU 發現的工作原理如下:

  1. 發送端主機發送 IP 數據包時將其頭部的分片禁止標誌位設置爲 1 。根據這個標誌位,途中的路由器即使收到需要分片的大包,也不會分片,而是直接將包丟棄。之後通過一個 ICMP 不可達消息將數據鏈路上 MTU 值給發送端主機。

  2. 發送端主機根據收到的 MTU 值對數據包進行分片處理,再把 IP 數據包發送給相同的目的主機。如此重複,直到數據包被髮送到目標主機爲止沒有再收到任何 ICMP ,就認爲最後一次 ICMP 所通知的 MTU 即是一個合適的 MTU 值。MTU 值至少可以緩存約 10 分鐘,在這 10 分鐘內使用剛得到的 MTU ,過了 10 分鐘後就重新做一次路徑 MTU 發現。

上面的例子是 UDP ,如果是在 TCP 的情況下,根據路徑 MTU 的大小計算出最大段長度( MSS ),然後再根據這些信息進行數據包的發送。因此,在 TCP 中如果使用路徑 MTU 發現, IP 層則不會再分片。

路由器三層轉發原理

路由器有多個端口,分別連接不同的數據鏈路。它通過識別目的 IP 地址的網絡號,再根據路由表進行轉發,路由表中有匹配的路由條目纔會轉發,無匹配的路由條目則直接丟棄。路由條目既可以手動設置靜態路由,也可以通過路由協議自動生成動態路由。

路由器如何進行三層轉發?

當一臺路由器收到一個數據包時,會執行如下步驟:

  1. 對數據包進行解封裝

    通過解封裝,查看網絡層頭部信息的目的 IP 地址

  2. 在路由表中查找匹配的路由條目

    查找匹配的路由條目,就需要將數據包的目的 IP 地址與各個路由條目的網段地址先進行二進制與( AND )運算,再將運算結果與路由條目的網段地址進行比較,若一致則該條目與目的 IP 地址相匹配。最後,與所有路由條目完成運算和比較,可得到一條或多條相匹配的路由條目。也可能沒有匹配的路由條目,那麼丟棄數據包。

    查找路由條目流程圖

  3. 從多個匹配項中選擇掩碼最長的路由條目。

    如果路由表中有多條路由條目都匹配數據包的目的 IP 地址,則路由器會選擇掩碼長度最長的路由條目,這種匹配方式稱爲最長匹配原則

    例如:10.1.3.10 的網絡地址與 10.1.3.0/16 和 10.1.3.0/24 兩項都匹配,這時應該選擇匹配度最長的 10.1.3.0/24 。

    最長匹配原則

  4. 將數據包按照相應路由條目進行轉發

    路由條目中包含下一跳出接口。當路由器找到相應的路由條目後,它就會根據對應的下一跳和出接口,將數據包從出接口發送數據給下一跳設備。

路由轉發

ARP

只要確定了 IP 地址,就可以向這個目標地址發送 IP 數據報文。但是在進行實際通信時,還要知道每個 IP 地址所對應的 MAC 地址。

地址解析協議,簡稱 ARP 協議。是根據目的設備的 IP 地址來查詢對應 MAC 地址的協議。

ARP 的工作原理

當主機 A 向同一個網段內的主機 C 發送數據,但是不知道主機 C 的 MAC 地址。

ARP 工作原理

  1. ARP 請求:主機 A 以主機 C 的 IP 地址爲目的 IP 地址,以廣播 MAC 地址爲目的 MAC 地址,在同網段內發送這個廣播報文,這個報文就叫 ARP 請求報文

    二層交換機不查看 IP 地址,根據目的 MAC 地址將報文除接收端口外的所有端口發送。

    ARP 請求報文

  2. ARP 響應:主機 C 發現目的 IP 地址是自己的 IP 地址,於是主機 C 以自己 MAC 地址和 IP 地址作爲源 MAC 地址和源 IP 地址,以主機 A 的 MAC 地址和 IP 地址作爲目的 MAC 地址和目的 IP 地址,發送響應報文給主機 A ,這個報文就叫 ARP 響應報文。其它主機收到主機 A 的 ARP 請求報文,因爲目的 IP 地址不是自己的 IP 地址,因此不會進行響應。

    當主機 A 在發送 ARP 廣播請求報文時,二層交換機已經有主機 A 的 MAC 地址表條目。當收到主機 C 發送的單播 ARP 響應報文時,二層交換機將報文從相應端口發送出去。並將主機 C 的 MAC 地址和對應端口記錄到 MAC 地址表中。

    ARP 響應報文

  3. 更新 ARP 緩存表:主機 A 收到 ARP 響應報文後,將主機 C 的 IP 地址和 MAC 地址記錄到 ARP 緩存表中。下次再向主機 C 發送數據時,直接將緩存的目的 MAC 地址進行封裝。

    更新 ARP 緩存表

當主機 A 向不同網段的主機 C 發送數據,但是不知道主機 C 的 MAC 地址。

ARP 代理

  1. 主機 A 使用主機 C 的 IP 地址查詢 ARP ,ARP 發現主機 C 不在同一個網段,需要通過默認網關(即默認路由的下一跳地址),但是沒有網關 MAC 地址;

    默認網關

  2. 主機 A 先將發送給主機 C 的數據放入緩存中,然後發送 ARP 請求報文,主機 A 以網關 IP 地址爲目的 IP 地址發送 ARP 廣播請求報文

    網關 ARP 請求報文

  3. 路由器收到 ARP 廣播請求報文後,將主機 A 的 MAC 地址和對應端口添加到自己的 MAC 表中,然後查看目的 IP 地址發現是請求自己的 MAC 地址,於是單播發送 ARP 響應報文

    網關 ARP 響應報文

  4. 主機 A 收到 ARP 響應報文後,將發送給主機 C 的數據封裝網關 MAC 地址爲目的 MAC 地址進行發送;

    主機 A 向主機 C 發數據

  5. 路由器收到報文後,查看目的 IP 地址,是發送給主機 C 的,於是查詢路由表從相應端口發送數據。由於沒有主機 C 的 MAC 地址,路由器發送 ARP 請求報文,源 MAC 地址和源 IP 地址替換爲發送端口的 MAC 地址和 IP 地址;

    主機 C 的 ARP 請求報文

  6. 主機 C 收到 ARP 請求報文後,添加路由器的端口和 MAC 地址到 MAC 地址表,單播發送 ARP 響應報文

    主機 C 的 ARP 響應報文

  7. 路由器收到主機 C 的 MAC 地址後,將其添加到 MAC 地址表中。將主機 A 發送給主機 C 的報文重新封裝,以自己的 MAC 地址爲源 MAC 地址,以主機 C 的 MAC 地址爲目的 MAC 地址,發送給主機 C ;

    ARP 代理發送數據

  8. 主機 C 收到主機 A 發送的數據,發送過程結束。

當主機 C 向主機 A 發送回覆報文時,同主機 A 向主機 C 發送數據的步驟一致。

ARP 代理

如果 ARP 請求是從一個網絡的主機發往同一網段卻不在同一物理網絡上的另一臺主機,那麼連接它們的具有代理 ARP 功能的設備就可以回答該請求,這個過程稱作代理 ARP 。

代理 ARP 功能屏蔽了分離的物理網絡,讓用戶使用起來,跟在同一個物理網絡上一樣。

免費 ARP

免費 ARP 是一種特殊的 ARP 請求,它並非通過 IP 找到對應的 MAC 地址,而是當主機啓動的時候,發送一個免費 ARP 請求,即請求自己的 IP 地址的 MAC 地址。

與普通 ARP 請求報文的區別在於報文中的目標 IP 地址。普通 ARP 報文中的目標 IP 地址是其它主機的 IP 地址;而免費 ARP 的請求報文中,目標 IP 地址是自己的 IP 地址

免費 ARP

免費 ARP 的作用:

ICMP

IP 提供盡力而爲的服務,指爲了把數據包發送到目的地址盡最大努力。它並不做對端目的主機是否收到數據包的驗證,無法保證服務質量。

ICMP(互聯網控制消息協議)是提供這類功能的一種協議。ICMP 的主要功能包括,確認 IP 包是否成功送達目的地址,通知發送過程中 IP 包被丟棄的原因。

ICMP 報文像 TCP/UDP 一樣通過 IP 進行傳輸,但是 ICMP 的功能不是傳輸層的補充,應該把它當做網絡層協議。

ICMP 頭部封裝字段如下圖。

ICMP 頭部封裝格式

通過類型字段和編碼字段的取值判斷這個 ICMP 消息的類型。常見的 ICMP 消息所對應的類型和編碼值如下圖。

常見 ICMP 消息類型

從功能上,ICMP 的消息分爲兩類:一類是通知出錯原因的錯誤消息,另一類是用於診斷的查詢消息

ICMP 消息類型

ping

我們常用的 ping 工具就是通過 ICMP 消息測試網絡層連通性的。源主機發出 Echo request 消息,目的主機迴應 Echo reply 消息,則兩臺主機間的網絡層通信正常。也可以通過 ping 命令來判斷目標主機是否啓用。

ping

附錄

IPv4 頭部

IP 提供最簡單的服務:實現從源到目的的數據轉發。不會在傳輸數據前先與接收方建立連接,也不保證傳輸的可靠性,它只提供盡力而爲的服務。

IP 通信時傳輸的是 IP 報文, IP 報文由 IP 頭部和數據兩部分組成。IP 頭部包含控制報文轉發的必要信息。通過 IP 頭部的結構,可以對 IP 的功能有一個詳細的瞭解。

IP 報文格式

什麼是字節?什麼是比特?

比特,英文名 bit ,也叫_位_。二進制中最小單位,一個比特的值要麼是 0 要麼是 1 。

字節,英文名 Byte 。一個字節由八個比特構成。


參考資料:

IP 基礎知識 “全家桶”,45 張圖一套帶走 - 小林 coding

TCP/IP 詳解 卷 1:協議 - W·Richard Stevens

網絡基礎 - 田果

圖解 TCP/IP - 竹下隆史

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3cpaVcnRZ6Svx1uXdOHjpQ