面向程序員的網絡基本知識 - 子網分割

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編址

給一個有類型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不太好算,下表總結了一個計算方式:將綠色鏈接的兩個數字相加就可以獲得紅色箭頭所指格子裏的數字:

圖片描述

C類地址的子網分割

如今咱們來計算一下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
  • 每一個子網block size=256 / subnets=256 / 2=128
  • host數量=block size - 2=128 - 2=126

那麼每一個子網的network id和 broadcast addr是什麼呢?其實能夠根據block size來計算:

  • 第一個子網的network id確定是0,所以是192.168.1.0,由於block size=128,因此下一個子網network id就是0+128=128=192.168.1.128
  • 由於每一個子網的broadcast addr是其block中的最後一個,所以第一個子網的 broadcast addr是後下一個子網的network id-1=192.168.1.127,因下一個子網是最後一個子網,因此它的 broadcast addr確定是255=192.168.1.255。下面是詳細表格:
  • 去掉每一個子網的network id和 broadcast addr,剩下的就是host的範圍了
subnet 0 128
first host 1 129
last host 126 254
broadcast addr 127 255

A/B類地址的子網分割

前面講的是如何分割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須要不少技巧,本文就不在作詳述了。

參考資料

相關文章
相關標籤/搜索