计网 - IPv4 协议:路由和寻址的区别是什么?
文章目錄
- Pre
- 什么是 IP 協議?
- IP 協議的工作原理
- 分片(Fragmentation)
- 增加協議頭(IP Header)
- “魚和熊掌”不能兼得——延遲、吞吐量、丟包率
- 延遲(latency)
- 吞吐量(Throughput)
- 丟包率(Packet loss)
- 尋址(Addressing)
- IPv4 地址
- 尋址過程
- 步驟 1:找到頂層網絡
- 步驟 2:找到下一層網絡
- 步驟 3:找到再下一級網絡
- 步驟 4:定位設備
- 路由(Routing)
- 總結
- QA
- 路由和尋址的區別是什么?
- 127.0.0.1, localhost, 0.0.0.0 有什么不同
Pre
如果說傳輸層協議,除了 TCP/UDP,我們還可以有其他選擇,比如 Google 開發的 QUIC 協議,幫助在傳輸層支持 HTTP 3.0 傳輸。
但是在網絡層,IP 協議幾乎一統天下。IP 協議目前主要有兩個版本 IPv4 和 IPv6。這一講我們先介紹 IPv4 協議。
IPv4使用范圍很大,平時工作中很容易遇到,比如開發場景、網絡優化場景、解決線上問題場景等。相信你經常會碰到一些和 IP 協議相關的名詞,比如一道常見的面試題目:路由和尋址的區別是什么?
因此,學習 IPv4 還是非常有意義的。接下來,就帶著對上面的問題,開啟今天的學習。
什么是 IP 協議?
IP 協議(Internet Protocol)是一個處于壟斷地位的網絡層協議。 IPv4 就是 IP 協議的第 4 個版本,是目前互聯網的主要網絡層協議。IPv4 為傳輸層提供 Host-To-Host 的能力,IPv4 需要底層數據鏈路層的支持。
IP 協議并不負責數據的可靠性。傳輸數據時,數據被切分成一個個數據封包。IP 協議上層的傳輸層協議會對數據進行一次拆分,IP 協議還會進一步進行拆分。進行兩次拆分是為了適配底層的設備。
數據在網絡中交換(封包交換算法),并不需要預先建立一個連接,而是任由數據在網絡中傳輸,每個節點通過路由算法幫助數據封包選擇下一個目的地。
可靠性保證數據無損地到達目的地。可靠性是 IP 協議上方的 Host-To-Host 協議保證的,比如 TCP 協議通過應答機制、窗口等保證數據的可靠性。 IP 協議自身不能保證可靠性。比如 IP 協議可能會遇到下面這幾個問題:
-
封包損壞(數據傳輸過程中被損壞);
-
丟包(數據發送過程中丟失);
-
重發(數據被重發,比如中間設備通過 2 個路徑傳遞數據);
-
亂序(到達目的地時數據和發送數據不一致)。
但是 IP 協議并不會去處理這些問題,因為網絡層只專注解決網絡層的問題, 而且不同特性的應用在不同場景下需要解決的問題不一樣。對于網絡層來說,這里主要有 3 個問題要解決:
-
延遲
-
吞吐量
-
丟包率
這三個是魚和熊掌不能兼得,我們后續會討論。
另外,IP 協議目前主要有兩種架構,一種是 IPv4,是目前應用最廣泛的互聯網協議;另一種是 IPv6,目前世界各地正在積極地部署 IPv6。
IP 協議的工作原理
- IP 協議接收 IP 協議上方的 Host-To-Host 協議傳來的數據,然后進行拆分,這個能力叫作分片(Fragmentation)。
- 然后 IP 協議為每個片段(Fragment)增加一個 IP 頭(Header),組成一個IP 封包(Datagram)。
- 之后,IP 協議調用底層的局域網(數據鏈路層)傳送數據。最后 IP 協議通過尋址和路由能力最終把封包送達目的地。
接下來具體看下完整的過程。
分片(Fragmentation)
分片就是把數據切分成片。 IP 協議通過它下層的局域網(鏈路層)協議傳輸數據,因此需要適配底層傳輸網絡的傳輸能力。數據太大通常就不適合底層網絡傳輸,這就需要把大的數據切片。 當然也可能選擇不切片,IP 協議提供了一個能力就是把封包標記為不切片,當底層網絡看到不切片的封包,又沒有能力傳輸的時候,就會丟棄這個封包。你要注意,在網絡環境中往往存在多條路徑,一條路徑斷了,說不定其他路徑可以連通。
增加協議頭(IP Header)
切片完成之后,IP 協議會為每個切片(數據封包 Datagram)增加一個協議頭。一個 IPv4 的協議頭看上去就是如下圖所示的樣子:
其中分成 4 個部分。
-
最重要的是原地址和目標地址。IPv4 的地址是 4 組 8 位的數字,總共是 32 位。
-
Type Of Service 服務的類型,是為了響應不同的用戶訴求,用來選擇延遲、吞吐量和丟包率之間的關系。
-
IHL(Internet Header Length)用來描述 IP 協議頭的大小。所以 IP 協議頭的大小是可變的。IHL 只有 4 位,最大值 1111 = 15。最大是 15 個雙字0.0(15*4 字節 = 60 字節)。
-
Total Length 定義報文(封包 Datagram)的長度。
-
Identification(報文的 ID),發送方分配,代表順序。
-
Fragment offset 描述要不要分包(拆分),以及如何拆分。
-
Time To Live 描述封包存活的時間。因此每個 IP 封包發送出去后,就開始銷毀倒計時。如果倒計時為 0,就會銷毀。比如中間的路由器看到一個 TTL 為 0 的封包,就直接丟棄。
-
Protocol 是描述上層的協議,比如 TCP = 6,UDP = 17。
-
Options 代表可選項。
-
Checksum 用來檢驗封包的正確性,如果 Checksum 對不上,就需要選擇丟棄這個封包。
“魚和熊掌”不能兼得——延遲、吞吐量、丟包率
上面我們看到 IPv4 協議中提供了一個叫作 Type of Service(服務類型)的字段。這個字段是為了在延遲、吞吐量和丟包率三者間選擇。
延遲(latency)
延遲指的是 1 bit 的數據從網絡的一個終端傳送到另一個終端需要的時間。這個時間包括在發送端準備發送的時間、排隊發送的時間、發送數據的時間、數據傳輸的時間等。
吞吐量(Throughput)
吞吐量指單位時間內可以傳輸的平均數據量。比如用 bit/s 作為單位,就是 bps。吞吐量和延遲沒有聯系,比如延遲很高的網絡,有可能吞吐量很高??梢灶惐瘸伤芎艽罅魉俸苈?#xff0c;對比水管很細流速很快,這兩種情況,最終流量可以是相等的。
丟包率(Packet loss)
丟表率指發送出去的封包沒有到達目的地的比例。 在最大流速確定的網絡中,丟表率會直接影響吞吐量。
我們的網絡有時候需要低延遲,比如玩一款 RTS 游戲或者 Moba 游戲,這種時候延遲非常重要。另外如果把延遲看作一個平均指標,丟包也會影響延遲——一個包丟了,需要重發。而有的應用需要高吞吐量,延遲不是很重要,比如說網盤下載文件。大部分應用期望丟包不能太嚴重,比如語音電話,少量丟包還能聽清,大量丟包就麻煩了,根本聽不清對方說什么。嚴格希望不丟包的應用比較少,只有極特殊的網絡控制管理場景,才需要在互聯網層要求不丟包。
當然這三個條件,通常不能同時滿足。如果同時追求延遲、吞吐量、丟包率,那么對網絡設備的要求就會非常高,說白了就會非常貴。
因此 IP 協議頭中的 Type of Service 字段里,有以下 4 種主要的類型可以選擇:
-
低延遲
-
高吞吐量
-
低丟包率
-
低成本
尋址(Addressing)
地址想要表達的是一個東西在哪里。尋址要做的就是:給一個地址,然后找到這個東西。IPv4 協議的尋址過程是逐級尋址。
IPv4 地址
IPv4 地址是 4 個 8 位(Octet)排列而成,總共可以編址 43 億個地址。
比如 103.16.3.1 就是一個合法的 Ipv4 地址。4 組數字用.分開,是為了讓人可讀,實際上在內存和傳輸過程中,就是直接用 32 位。
可以觀察一下103.16.3.1的二進制,如下圖所示:
尋址過程
尋址就是如何根據 IP 地址找到設備。因為 IPv4 的世界中,網絡是一個樹狀模型。頂層有多個平行的網絡,每個網絡有自己的網絡號。然后頂層網絡下方又有多個子網,子網下方還有子網,最后才是設備。
IP 協議的尋址過程需要逐級找到網絡,最后定位設備。下面我們具體分析下這個過程。
步驟 1:找到頂層網絡
比如103.16.3.1最頂層的網絡號可以和255.0.0.0(子網掩碼)做位與運算得到,如下所示:
復制代碼
103.16.3.1 & 255.0.0.0 = 103.0.0.0因此103.0.0.0就是103.16.3.1所在的頂層網絡。255.0.0.0.稱作子網掩碼。子網掩碼的作用就是幫助根據 IP 地址找到對應子網。子網掩碼是很多個1接著很多個0,和 IP 地址一起使用。
步驟 2:找到下一層網絡
接下來要找到下一級網絡,就需要用 IP 地址和下一級的子網掩碼做位與運算。 比如:
103.16.3.1 & 255.255.0.0 = 103.16.0.0其中103.16.0.0就是下一級的網絡號。
步驟 3:找到再下一級網絡
接下來使用255.255.255.0子網掩碼找到下一級網絡是103.16.3.0。
步驟 4:定位設備
設備就在子網103.16.3.0中,最終找到的設備號是1。
當然子網掩碼也不一定都是255,比如這個子網掩碼255.240.0.0也是可以的。但通常我們把 IPv4 的網絡分成這樣 4 層。
路由(Routing)
在尋址過程中,數據總是存于某個局域網中。如果目的地在局域網中,就可以直接定位到設備了。如果目的地不在局域網中,這個時候,就需再去往其他網絡。
由于網絡和網絡間是網關在連接,因此如果目的地 IP 不在局域網中,就需要為 IP 封包選擇通往下一個網絡的路徑,其實就是選擇其中一個網關。你可能會問:網關有多個嗎?如果一個網絡和多個網絡接壤,那自然需要多個網關了。下圖中,路由器在選擇 IP 封包下一個應該是去往哪個 Gateway?
假如,我們要為 IP 地址 14.215.177.38 尋址,當前路由器所在的網絡的編號是16.0.0.0。那么我們就需要知道去往 14.0.0.0 網絡的 Gateway IP 地址。
如果你在當前網絡中用route查看路由表,可能可以看到一條下面這樣的記錄。
Destination:14.0.0.0Gateway:16.12.1.100Mask:255.0.0.0Iface:16.12.1.1這條記錄就說明如果你要去往 14.0.0.0 網絡,IP 地址 14.215.177.38 先要和 255.0.0.0 進行位運算,然后再查表,看到 14.0.0.0,得知去往 Gateway 的網卡(IFace)是 16.12.1.1。
當封包去向下一個節點后,會進入新的路由節點,然后會繼續上述路由過程,直到最終定位到設備。
總結
這里我們梳理學習了 IP 協議和 IP 協議的工作原理。
- 首先 IP 協議會進行分片,將上游數據拆成一個個的封包(Datagram),
- 然后為封包增加 IP 頭部。封包發送出去后,就開始了尋址過程。尋址就是找到 IP 地址對應的設備。在局域網內,如果找不到設備,就需要路由。
- 路由就是找到數據應該往哪里發送。最后通過層層路由定位到具體的設備。
QA
路由和尋址的區別是什么?
尋址(Addressing)就是通過地址找設備。和現實生活中的尋址是一樣的,比如根據地址找到一個公寓。在 IPv4 協議中,尋址找到的是一個設備所在的位置。
路由(Routing)本質是路徑的選擇。就好像知道地址,但是到了每個十字路口,還需要選擇具體的路徑。
所以,要做路由,就必須能夠理解地址,也就是需要借助尋址的能力。要通過尋址找到最終的設備,又要借助路由在每個節點選擇數據傳輸的線路。因此,路由和尋址,是相輔相成的關系。
127.0.0.1, localhost, 0.0.0.0 有什么不同
-
127.0.0.1是本地回環地址(loopback),發送到 loopback 的數據會被轉發到本地應用。
-
localhost 指代的是本地計算機,用于訪問綁定在 loopback 上的服務。localhost 是一個主機名,不僅僅可以指向 IPv4 的本地回環地址,也可以指向 IPv6 的本地回環地址 [::1]。
-
0.0.0.0是一個特殊目的 IP 地址,稱作不可路由 IP 地址,它的用途會被特殊規定。通常情況下,當我們把一個服務綁定到0.0.0.0,相當于把服務綁定到任意的 IP 地址。比如一臺服務器上有多個網卡,不同網卡連接不同的網絡,如果服務綁定到 0.0.0.0 就可以保證服務在多個 IP 地址上都可以用。
總結
以上是生活随笔為你收集整理的计网 - IPv4 协议:路由和寻址的区别是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计网 - 一台内存在 8G 左右的服务器
- 下一篇: 计网 - TCP 实战:如何进行 TCP