Githubgit
本系列文章旨在向程序員分享一些網絡基本知識,讓程序員具有基本的網絡常識,以便與網絡工程師溝通。本系列文章不會涉及如何組建網絡、如何配置交換機/路由器等硬件相關的內容,因此不適合想考CCNA/HCNA證書的人士。程序員
在IP地址一文中咱們提到了A、B、C三類IP地址,也提到了IP地址中包含了network id和host信息,那麼你知道這3類地址分別可以容納多少臺host嗎?github
以一個C類地址192.168.1.xxx/24
爲例,由於子網掩碼的1佔用了24位,剩餘的0都是用來給host用的——有8位,因此block size=2 ^ 8=256,又因按約定一個block中的第一個值被留做network id(192.168.1.0
),最後一個值被留做 broadcast addr(192.168.1.255
),因此實際host的數量=256 - 2=254。網絡
同理一個B類地址128.10.xxx.xxx/16
的host數量=2 ^ 16-2=65,534個,一個A類地址10.xxx.xxx.xxx/8
的host數量=2 ^ 24-2=16,777,214個。工具
看到問題沒有,當你在使用一個A或B類地址的時候會發現host數量太過巨大,那麼現實生活中組建如此巨大的網絡是不現實的,所以咱們須要劃分子網。spa
給一個有類型IP地址劃分子網的方式很簡單,在子網掩碼中借用後面的0把它們變成1,好比將一個C類地址的子網掩碼1的位數變成25:192.168.1.0/25
,它比C類地址的/24
多了一個bit,這種形式稱爲無類別域間路由(CIDR),它的子網掩碼就是255.255.255.128
,這樣一來就將本來192.168.1.0/24
分割稱了兩個子網。code
下面這張表列出了借用bit數與分割子網數的關係:圖片
Borrowed Bits | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
Mask Value | 128 | 192 | 224 | 240 | 248 | 252 |
Subnets | 2 | 4 | 8 | 16 | 32 | 64 |
Block size | 128 | 64 | 32 | 16 | 8 | 4 |
Hosts | 126 | 62 | 30 | 14 | 6 | 2 |
爲什麼沒有列出借用七、8個bit的狀況,由於若是借用7個bit則host數量=0。若是借用8個bit則block size=1,host數量=-1,顯然不夠用。ip
若是借用的bit數超過8會怎樣,好比一個A類地址10.10.1.1/8
變成10.10.1.1/18
會怎樣呢?咱們這個IP地址和子網掩碼變成二進制觀察一下:路由
IP Addr(dec) : 10 . 10 . 1 . 1 IP Addr(bin) : 00001010 . 00001010 . 00000001 . 00000001 subnet mask(bin) : 11111111 . 11111111 . 11000000 . 00000000 subnet mask(dec) : 255 . 255 . 192 . 0
能夠看到子網掩碼的1擴展到了第三個字節且佔用了第三個字節的2個bit,所以分割子網數=2 ^ 2=4,block size=256 / 4 = 64。
到這裏你會發現子網數、block size、host數都比較好算,Mask Value不太好算,下表總結了一個計算方式:將綠色鏈接的兩個數字相加就可以獲得紅色箭頭所指格子裏的數字:
如今咱們來計算一下192.168.1.0/25
的每一個子網的network id、 broadcast addr、block size、host數量、mask value:
192.168.1.0/25
被劃分爲了2個子網,爲何是兩個?其實很簡單,子網數=2 ^ borrowed bits=2 ^ 1=2那麼每一個子網的network id和 broadcast addr是什麼呢?其實能夠根據block size來計算:
192.168.1.0
,由於block size=128,因此下一個子網network id就是0+128=128=192.168.1.128
。192.168.1.127
,因下一個子網是最後一個子網,因此它的 broadcast addr確定是255=192.168.1.255
。下面是詳細表格:subnet | 0 | 128 |
---|---|---|
first host | 1 | 129 |
last host | 126 | 254 |
broadcast addr | 127 | 255 |
前面講的是如何分割C類地址的子網,由於一個C類地址的前3個字節老是固定的,因此計算network id老是發生在第4個字節上。因此對於A類地址來說,分割子網的CIDR是/8+
,B類地址是/16+
,C類地址是24+
。
問題來了,若是對一個A類地址好比10.10.0.0/18
分割字網,那麼該如何計算呢?
在這裏咱們得先講一下IP地址「進位」的方式。當你對第n個字節作加法,加到256的時候,則第n個字節清0,第n-1個字節加1,好比咱們對10.10.0.0
的第3個字節不斷的加128:
10 . 10 . 0 . 0 10 . 10 . 128 . 0 10 . 11 . 0 . 0 10 . 11 . 128 . 0
這很重要,由於當看到一個CIDR時,咱們要知道它的子網掩碼延伸到第幾個字節,而後在這個字節上不斷的加block size,從而獲得每一個子網的network id,而後計算broadcast addr、host範圍等。
舉個例子,10.10.0.0/18
的掩碼延伸到了第3個字節,佔用了2個bit,block size=64,因此:
subnet1: network id=10.10.0.0 broadcast addr=10.10.63.255 subnet2: network id=10.10.64.0 broadcast addr=10.10.127.255 subnet3: network id=10.10.128.0 broadcast addr=10.10.191.255 subnet4: network id=10.10.192.0 broadcast addr=10.10.255.255 subnet5: network id=10.11.0.0 broadcast addr=10.11.63.255 subnet6: network id=10.11.64.0 broadcast addr=10.11.127.255 ...
注意看broadcast addr,subnet 1的broadcast addr=subnet 2 network id - 1=10.10.64.0 - 1,由於IP地址是一個「進位」系統,因此獲得10.10.63.255。
上面咱們已經瞭解如何進行子網分割,雖然咱們避免了IP地址的浪費,可是依然還會有問題。好比一個公司有三個部門,PC數量分別是100臺、53臺、50臺,如今有一個C類地址192.168.1.0
,咱們怎麼分割子網呢——要求是每一個部門有本身的子網?
若是咱們這樣192.168.1.0/25
,則只能分割2個子網,若是192.168.1.0/26
,可以分割4個子網,可是每一個子網的host數量=62,而有一個部門的PC有100臺,容納不了。那該怎麼辦呢?
這裏咱們要引入一個工具:變長子網掩碼VLSM(Variable Length Subnet Mask),它容許網管可使用長度不一樣的子網掩碼分割一個網絡。
回到上面的例子,咱們會這樣分割:
192.168.1.0 /26 192.168.1.64 /26 192.168.1.128 /25
使用VLSM須要不少技巧,本文就不在作詳述了。