我一直在強調,打好基礎怎麼變都不慌,但是一直也沒有重點分享過這些基礎技術。正好 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 來舉例。
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 這種分割子網的計算方法,你明白了嗎?自己随便寫一個 CIDR 地址,例如:16.158.165.20/20,看看能計算出子網掩碼、最小地址、廣播地址嗎?再嘗試将其劃分成幾個子網試試。
本文對你有幫助嗎?留言、點贊、轉發是最大的支持,謝謝!
在頭條号私信我。我會送你一些我整理的學習資料,包含:Android反編譯、算法、設計模式、虛拟機、Linux、Kotlin、Python、爬蟲、Web項目源碼。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!