只有 32 位的 IPv4,為何依然夠用?
一、前言
我一直在強(qiáng)調(diào),打好基礎(chǔ)怎么變都不慌,但是一直也沒有重點(diǎn)分享過這些基礎(chǔ)技術(shù)。正好 2019 年了,決定再挖個(gè)大的新坑,準(zhǔn)備開始寫一些那些多年不變的基礎(chǔ)技術(shù),算法、數(shù)據(jù)結(jié)構(gòu)、網(wǎng)絡(luò)協(xié)議、設(shè)計(jì)模式、操作系統(tǒng)有時(shí)間都會(huì)寫。先挖坑,挖完慢慢填,我盡量寫的有趣一些,希望大家能夠看下去。
今天就來講講網(wǎng)絡(luò)協(xié)議中的 CIDR(無類型域間選路),先來說說 CIDR 的背景。
二、CIDR 的背景
2.1 IPv4 和 IPv6
現(xiàn)存所有的網(wǎng)絡(luò)設(shè)備硬件中,網(wǎng)卡是設(shè)備上網(wǎng)必備的硬件條件,網(wǎng)卡雖然有唯一(相對(duì)唯一)的 Mac 地址去標(biāo)識(shí),但是依然需要分配一個(gè) IP 地址。有了 IP 地址,才能讓世界知道你的位置。
簡單來說,IP 地址是一個(gè)網(wǎng)卡在網(wǎng)絡(luò)世界的通訊地址,這就相當(dāng)于現(xiàn)實(shí)世界中,我們?cè)诰W(wǎng)購時(shí)填的收貨地址??梢詭椭鷦e人,從世界的任何位置,找到我們。
現(xiàn)存的 IP 協(xié)議有兩套,就是我們常說的 IPv4 和 IPv6。IPv4 由于最初設(shè)計(jì)的"缺陷",長度只有 32 位,大約只能提供 40 億個(gè)地址。早期設(shè)計(jì)時(shí),可能也想不到互聯(lián)網(wǎng)會(huì)發(fā)展到現(xiàn)在這個(gè)地步,隨便一個(gè)設(shè)備都需要聯(lián)網(wǎng)。
這就造成了 IPv4 地址很快就不夠用了,尤其是這樣 32 位地址中,還被分為了 A、B、C、D、E 這五類地址,拋開一些特殊的 IP 地址,可供使用的就更少了。由此可見 IPv4 在當(dāng)初設(shè)計(jì)時(shí),是有多么奢侈。
隨后 IPv6 就被設(shè)計(jì)出來。我們知道當(dāng)容量不夠的時(shí)候,擴(kuò)容是一條短期正確,但是長期來看依然是存在隱患的事情,無論擴(kuò)大到多少,如果沒有合理的規(guī)劃,用完其實(shí)也是遲早的事情。
IPv6 的長度增加到 128 位,可以提供更多的地址,但是 IPv4 和 IPv6 相互之間并不兼容,導(dǎo)致遷移困難。如今 IPv6 已經(jīng)慢慢在被一些大廠所使用,例如在淘寶 App 的啟動(dòng)頁底部,就可以看到 IPv6 的標(biāo)識(shí)。即便如此,在未來很長的一段時(shí)間內(nèi),依然會(huì)保持兩個(gè)協(xié)議并行支持。
IPv6 并不是本文的重點(diǎn),再說回到 IPv4 的地址過少這個(gè)硬傷上。雖然地址確實(shí)不夠用,但是設(shè)備需要聯(lián)網(wǎng)確實(shí)是強(qiáng)需求,這也是必須要解決的問題,聯(lián)網(wǎng)就需要 IP 地址,是不是感覺進(jìn)入死循環(huán)了。
IPv4 這種 A、B、C 類為主要的分類的 IP 數(shù)量,到底少到什么地步呢?這里看一張表就知道了。
能夠感受到 IPv4 的尷尬了嗎?C 類地址能夠包含的***主機(jī)數(shù)量,是在太少了,現(xiàn)在隨便一個(gè)網(wǎng)吧可能就不夠用了,而 B 類地址包含的***主機(jī)數(shù)量又太多了,大量用不到的地址,很容易造成地址的浪費(fèi)。有句老話怎么說的,旱的旱死,澇的澇死。
于是就出現(xiàn)了一個(gè)折中的方案,那就是我們本文要聊的 CIDR,中文名為無類型域間選路。
2.2 子網(wǎng)的劃分
現(xiàn)在還不到說 CIDR 的時(shí)候(就是不愛寫這種基礎(chǔ)技術(shù),想寫清楚會(huì)發(fā)現(xiàn)有太多需要前置交代)。在說 CIDR 之前,還有個(gè)背景需要交代,那就是子網(wǎng)。
互聯(lián)網(wǎng)這個(gè)大網(wǎng),中間被分割成一個(gè)個(gè)子網(wǎng),而子網(wǎng)下又被進(jìn)一步分割。
從我們上面的 IP 分類圖中,可以看出,一個(gè) IP 地址的 32 位中,還被分為兩類,分別是網(wǎng)絡(luò)號(hào)和主機(jī)號(hào),將主機(jī)號(hào)都置為 0,得到的就是網(wǎng)絡(luò)地址。
可以看出,這樣很明顯的兩級(jí)劃分,也被稱為兩級(jí) IP 地址。而 IP 地址的利用率有時(shí)很低,這種兩級(jí)劃分的方式就顯得不那么靈活,于是就出現(xiàn)了子網(wǎng)。
子網(wǎng)其實(shí)就在之前的兩級(jí) IP 地址中,又加了一層子網(wǎng)號(hào),將其變成三級(jí)結(jié)構(gòu)。雖然增加了子網(wǎng)號(hào),但是 IP 地址的長度依然是 32 位,網(wǎng)絡(luò)號(hào)肯定是無法變更的,所以這里的子網(wǎng)就只能從主機(jī)號(hào)想辦法。此時(shí)的子網(wǎng)號(hào),其實(shí)就是從主機(jī)號(hào)中借位,這樣就等于是減少了主機(jī)數(shù),將其分割到不同的子網(wǎng)中。
涉及到子網(wǎng),還有一個(gè)重要的概念,就是子網(wǎng)掩碼。子網(wǎng)掩碼,就是為了區(qū)分識(shí)別對(duì) IP 地址劃分的子網(wǎng)的。子網(wǎng)掩碼很簡單,它就是將網(wǎng)絡(luò)號(hào)和子網(wǎng)號(hào),對(duì)應(yīng)的位全部置為 1,將主機(jī)號(hào)對(duì)應(yīng)的位都置為 0,這就是子網(wǎng)掩碼了。
這三個(gè)信息中,只要知道 IP 地址和子網(wǎng)掩碼,自然就可以推算出對(duì)應(yīng)的網(wǎng)絡(luò)地址。這也正是我們前面說的子網(wǎng)的概念,其實(shí)是將一個(gè)大的網(wǎng)絡(luò),在其內(nèi)部分割成一個(gè)個(gè)小的子網(wǎng),但是在網(wǎng) 絡(luò)的外層來看,還是一個(gè)大的網(wǎng)絡(luò),他們都是通過網(wǎng)絡(luò)地址來通信的。
例子一:
例子二:
從上面的兩個(gè)例子中,可以看出,相同的 IP 地址,不同的子網(wǎng)掩碼,可以得出相同的網(wǎng)絡(luò)地址,但是他們卻是被劃分在不同的子網(wǎng)當(dāng)中的。
三、無類型域間選路(CIDR)
3.1 什么是 CIDR
通過子網(wǎng)掩碼去劃分的子網(wǎng),是借走的主機(jī)號(hào),這是有損耗的。例如借走兩位主機(jī)號(hào),原則上可以劃分四個(gè)子網(wǎng)(11、10、01、00),但是其中全 0 和全 1 是不使用的,所以就只剩下兩個(gè)了。使用 CIDR 是沒有這個(gè)問題的,它可以使用全 0 和全 1,不會(huì)造成浪費(fèi)。
終于可以說到 CIDR 了。
CIDR 中文全稱是無分類域間路由,是英文 Classless Inter-Domain Routing 的縮寫。CIDR 打破了原先設(shè)計(jì)的 A、B、C 類地址的概念,將 32 位 IP 地址保持兩分的結(jié)構(gòu),就是依然保持前面是網(wǎng)絡(luò)號(hào),后面是主機(jī)號(hào)。
這樣如何區(qū)分呢?CIDR 會(huì)在 IP 地址的后面,用斜線分割一個(gè)網(wǎng)絡(luò)前綴占位數(shù)的標(biāo)識(shí)。
例如:10.100.120.2/24,斜線后面有一個(gè)數(shù)字 24,這種地址的表示形式,就是 CIDR。這里的 24 表示,32 位的 IP 地址中,前 24 位是網(wǎng)絡(luò)號(hào),后 8 位是主機(jī)號(hào)。
這一組 CIDR,包含的信息可就多了,還是拿 10.100.120.2/24 來舉例。
將主機(jī)號(hào),所有的位都置為 1,就是廣播地址,例如:10.100.120.255,如果發(fā)送這個(gè)地址,10.100.120 網(wǎng)絡(luò)里面的機(jī)器都可以收到。
將 24 位網(wǎng)絡(luò)號(hào)都置為 1,8 位主機(jī)號(hào)置為 0,得到的就是子網(wǎng)掩碼,255.255.255.0。
CIDR 除了表示一個(gè) IP 地址,還相當(dāng)于給出了一個(gè) CIDR 子網(wǎng)的地址范圍。將主機(jī)號(hào),從全 0 到全 1 的范圍,就是當(dāng)前子網(wǎng)的所能包含的***地址數(shù)。
3.2 容易算錯(cuò)的 CIDR
再來回憶一下 IP 地址的格式,32 位中以 8 位為一個(gè)單位,用 . 進(jìn)行分割。所以比較常見的 /24、/16 這種就比較容易區(qū)分,不需要將十進(jìn)制轉(zhuǎn)換成二進(jìn)制,就可以明顯看出來,那些是網(wǎng)路號(hào),那些是主機(jī)號(hào),
家庭 WiFi 中,一般不會(huì)超過 256 個(gè)設(shè)備,所以 /24 也就夠用了,例如 192.168.1.117/24。
如果遇上不是 8 的整數(shù)倍 CIDR,有時(shí)候我們就容易算錯(cuò)。
我們來看一下 16.158.165.20/22 這個(gè) CIDR,求一下這個(gè)網(wǎng)絡(luò)的起始 IP 地址、子網(wǎng)掩碼和廣播地址。
你要是上來就寫 16.158.165.1、255.255.255.0、16.158.165.255,那你就錯(cuò)了。
首先看到 /22 不是 8 的整數(shù)倍,肉眼不好區(qū)分,我們轉(zhuǎn)成二進(jìn)制就清晰了。
遇到不好算的 CIDR,換成二進(jìn)制再看看,一切都清晰了。
3.3 CIDR 應(yīng)用
前面說到,互聯(lián)網(wǎng)就是被切分成一個(gè)個(gè)子網(wǎng)下存在的,一個(gè)個(gè)子網(wǎng)往下還可以繼續(xù)切分,但是對(duì)外就是一個(gè)整體。所以 CIDR 這種方式,/x 這個(gè)數(shù)值越小,說明當(dāng)前子網(wǎng)下的主機(jī)數(shù)量越多。反之可以通過增加 /x 來繼續(xù)進(jìn)行子網(wǎng)的劃分。
例如從 /16 變?yōu)?/20,右移了四位,等于又切分出來 16 個(gè)子網(wǎng)。
舉個(gè)例子,有一個(gè) CIDR 地址塊,201.0.68.0/22,然后我們可以怎么切分?拆分成二進(jìn)制就清晰了。
要是有心,我們還可以繼續(xù)往下切分,但是正常我們?yōu)榱吮WC子網(wǎng)可用,一般也會(huì)保持一個(gè)子網(wǎng)下的主機(jī)數(shù)不會(huì)太少。
四、小結(jié)時(shí)刻
CIDR 這種分割子網(wǎng)的規(guī)則,其實(shí)設(shè)計(jì)的很巧妙,只要向右移位網(wǎng)絡(luò)前綴所占的位數(shù),就可以繼續(xù)分割子網(wǎng)。就算以后全面升級(jí)了 IPv6 后,我個(gè)人認(rèn)為應(yīng)該也不會(huì)拋棄 CIDR 這種方式。
CIDR 這種分割子網(wǎng)的計(jì)算方法,你明白了嗎?留一道思考題吧,已知 16.158.165.20/20 這個(gè) CIDR,計(jì)算子網(wǎng)掩碼、網(wǎng)絡(luò)地址、廣播地址嗎?
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)聯(lián)系作者獲取授權(quán)】