網路協議之 CIDR:只有 32 位的 IPv4,為何依然夠用?


一、前言
我一直在強調,打好基礎怎麼變都不慌,但是一直也沒有重點分享過這些基礎技術。正好 2019 年了,決定再挖個大的新坑,準備開始寫一些那些多年不變的基礎技術,演算法、資料結構、網路協議、設計模式、作業系統有時間都會寫。先挖坑,挖完慢慢填,我儘量寫的有趣一些,希望大家能夠看下去。
今天就來講講網路協議中的 CIDR (無型別域間選路),先來說說 CIDR 的背景。
二、CIDR 的背景
2.1 IPv4 和 IPv6
現存所有的網路裝置硬體中,網絡卡是裝置上網必備的硬體條件,網絡卡雖然有唯一( 相對唯一 )的 Mac 地址去標識,但是依然需要分配一個 IP 地址。有了 IP 地址,才能讓世界知道你的位置。
簡單來說, IP 地址是一個網絡卡在網路世界的通訊地址 ,這就相當於現實世界中,我們在網購時填的收貨地址。可以幫助別人,從世界的任何位置,找到我們。
現存的 IP 協議有兩套,就是我們常說的 IPv4 和 IPv6 。IPv4 由於最初設計的"缺陷",長度只有 32 位,大約只能提供 40 億個地址。早期設計時,可能也想不到網際網路會發展到現在這個地步,隨便一個裝置都需要聯網。
這就造成了 IPv4 地址很快就不夠用了,尤其是這樣 32 位地址中,還被分為了 A、B、C、D、E 這五類地址,拋開一些特殊的 IP 地址,可供使用的就更少了。由此可見 IPv4 在當初設計時,是有多麼奢侈。

隨後 IPv6 就被設計出來。我們知道當容量不夠的時候,擴容是一條短期正確,但是長期來看依然是存在隱患的事情,無論擴大到多少,如果沒有合理的規劃,用完其實也是遲早的事情。
IPv6 的長度增加到 128 位,可以提供更多的地址,但是 IPv4 和 IPv6 相互之間並不相容,導致遷移困難。如今 IPv6 已經慢慢在被一些大廠所使用,例如在淘寶 App 的啟動頁底部,就可以看到 IPv6 的標識。即便如此,在未來很長的一段時間內,依然會保持兩個協議並行支援。
IPv6 並不是本文的重點,再說回到 IPv4 的地址過少這個硬傷上。雖然地址確實不夠用,但是裝置需要聯網確實是強需求,這也是必須要解決的問題,聯網就需要 IP 地址,是不是感覺進入死迴圈了。
IPv4 這種 A、B、C 類為主要的分類的 IP 數量,到底少到什麼地步呢?這裡看一張表就知道了。

能夠感受到 IPv4 的尷尬了嗎?C 類地址能夠包含的最大主機數量,是在太少了,現在隨便一個網咖可能就不夠用了,而 B 類地址包含的最大主機數量又太多了,大量用不到的地址,很容易造成地址的浪費。有句老話怎麼說的,旱的旱死,澇的澇死。
於是就出現了一個折中的方案,那就是我們本文要聊的 CIDR ,中文名為 無型別域間選路 。
2.2 子網的劃分
現在還不到說 CIDR 的時候( 就是不愛寫這種基礎技術,想寫清楚會發現有太多需要前置交代 )。在說 CIDR 之前,還有個背景需要交代,那就是 子網 。
網際網路這個大網,中間被分割成一個個子網,而子網下又被進一步分割。
從我們上面的 IP 分類圖中,可以看出,一個 IP 地址的 32 位中,還被分為兩類,分別是 網路號 和 主機號 ,將主機號都置為 0,得到的就是 網路地址 。

可以看出,這樣很明顯的兩級劃分,也被稱為 兩級 IP 地址 。而 IP 地址的利用率有時很低,這種兩級劃分的方式就顯得不那麼靈活,於是就出現了子網。

子網其實就在之前的兩級 IP 地址中,又加了一層 子網號 ,將其變成三級結構。雖然增加了子網號,但是 IP 地址的長度依然是 32 位,網路號肯定是無法變更的,所以這裡的子網就只能從主機號想辦法。此時的子網號,其實就是從主機號中借位,這樣就等於是減少了主機數,將其分割到不同的子網中。
涉及到子網,還有一個重要的概念,就是 子網掩碼 。子網掩碼,就是為了區分識別對 IP 地址劃分的子網的。子網掩碼很簡單,它就是將網路號和子網號,對應的位全部置為 1,將主機號對應的位都置為 0,這就是子網掩碼了。
這三個資訊中,只要知道 IP 地址和子網掩碼,自然就可以推算出對應的 網路地址 。這也正是我們前面說的子網的概念,其實是將一個大的網路,在其內部分割成一個個小的子網,但是在網 絡的外層來看,還是一個大的網路,他們都是通過 網路地址 來通訊的。
例子一:

例子二:

從上面的兩個例子中,可以看出,相同的 IP 地址,不同的子網掩碼,可以得出相同的網路地址,但是他們卻是被劃分在不同的子網當中的。
三、無型別域間選路(CIDR)
3.1 什麼是 CIDR
通過子網掩碼去劃分的子網,是借走的主機號,這是有損耗的。例如借走兩位主機號,原則上可以劃分四個子網(11、10、01、00),但是其中全 0 和全 1 是不使用的,所以就只剩下兩個了。使用 CIDR 是沒有這個問題的,它可以使用全 0 和全 1,不會造成浪費。
終於可以說到 CIDR 了。
CIDR 中文全稱是無分類域間路由,是英文 Classless Inter-Domain Routing 的縮寫。CIDR 打破了原先設計的 A、B、C 類地址的概念,將 32 位 IP 地址保持兩分的結構,就是依然保持前面是網路號,後面是主機號。
這樣如何區分呢?CIDR 會在 IP 地址的後面,用斜線分割一個 網路字首佔位數 的標識。

例如:10.100.120.2/24,斜線後面有一個數字 24,這種地址的表示形式,就是 CIDR。這裡的 24 表示,32 位的 IP 地址中,前 24 位是網路號,後 8 位是主機號。
這一組 CIDR,包含的資訊可就多了,還是拿 10.100.120.2/24 來舉例。
-
將主機號,所有的位都置為 1,就是 廣播地址 ,例如:10.100.120.255,如果傳送這個地址,10.100.120 網路裡面的機器都可以收到。
-
將 24 位網路號都置為 1,8 位主機號置為 0,得到的就是 子網掩碼 ,255.255.255.0。
-
CIDR 除了表示一個 IP 地址,還相當於給出了一個 CIDR 子網的地址範圍。將主機號,從全 0 到全 1 的範圍,就是當前子網的所能包含的 最大地址數 。
3.2 容易算錯的 CIDR
再來回憶一下 IP 地址的格式,32 位中以 8 位為一個單位,用 .
進行分割。所以比較常見的 /24
、 /16
這種就比較容易區分,不需要將十進位制轉換成二進位制,就可以明顯看出來,那些是網路號,那些是主機號,
家庭 WiFi 中,一般不會超過 256 個裝置,所以 /24
也就夠用了,例如 192.168.1.117/24。

如果遇上不是 8 的整數倍 CIDR,有時候我們就容易算錯。
我們來看一下 16.158.165.20/22 這個 CIDR,求一下這個網路的起始 IP 地址、子網掩碼和廣播地址。
你要是上來就寫 16.158.165.1、255.255.255.0、16.158.165.255,那你就錯了。
首先看到 /22
不是 8 的整數倍,肉眼不好區分,我們轉成二進位制就清晰了。

遇到不好算的 CIDR,換成二進位制再看看,一切都清晰了。
3.3 CIDR 應用
前面說到,網際網路就是被切分成一個個子網下存在的,一個個子網往下還可以繼續切分,但是對外就是一個整體。所以 CIDR 這種方式, /x
這個數值越小,說明當前子網下的主機數量越多。反之可以通過增加 /x
來繼續進行子網的劃分。
例如從 /16
變為 /20
,右移了四位,等於又切分出來 16 個子網。
舉個例子,有一個 CIDR 地址塊,201.0.68.0/22,然後我們可以怎麼切分?拆分成二進位制就清晰了。

要是有心,我們還可以繼續往下切分,但是正常我們為了保證子網可用,一般也會保持一個子網下的主機數不會太少。
四、小結時刻
CIDR 這種分割子網的規則,其實設計的很巧妙,只要向右移位網路字首所佔的位數,就可以繼續分割子網。就算以後全面升級了 IPv6 後,我個人認為應該也不會拋棄 CIDR 這種方式。
CIDR 這種分割子網的計算方法,你明白了嗎?留一道思考題吧,已知 16.158.165.20/20 這個 CIDR,計運算元網掩碼、網路地址、廣播地址嗎?(公眾號後臺回覆“ CIDR結果 ”,獲取答案)再嘗試將其劃分成幾個子網試試。
本文對你有幫助嗎? 留言、點好看、轉發 是最大的支援,謝謝!
reference:
https://blog.csdn.net/dan15188387481/article/details/49873923
「 聯機圓桌 」:point_left:推薦我的知識星球,一年 50 個優質問題,上桌聯機學習。
公眾號後臺回覆成長『 成長 』,將會得到我準備的學習資料,也能回覆『 加群 』,一起學習進步;你還能回覆『 提問 』,向我發起提問。
推薦閱讀:
關於字元編碼,你需要知道的都在這裡 |圖解:HTTP 範圍請求 |Java 異常處理 | 安卓防止使用者關閉動畫導致動畫失效 |Git 找回遺失的程式碼 | 阿里的 Alpha 助力 App 啟動速度優化
