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