【TCP/IP】IP地址的劃分及其分類

Lpyexplore發表於2020-10-19

本文是參考【TCP/IP詳解卷一】的學習知識記錄

本文是該系列文章的第二篇,將瞭解Internet中使用的網路層地址,又稱IP地址。每個裝置都至少需要一個IP地址,其可以作為我們裝置的標識,就跟我們的電話號碼一樣,知道了電話號碼就能找到我們,所以每個IP地址都是唯一的,所以在給每臺裝置分配IP時,會根據一套編號方案進行,本篇文章我們就來詳細地瞭解一下它。

一、IP地址的表示

IP作用於OSI參考模型中的網路層,在終端通訊中作為唯一標識,便於確定資料的傳遞目標。

IP地址分為:IPv4IPv6

大多數使用者熟悉並且流行的IP地址是IPv4,其是用點分四組十進位制的表示方法展示的,例如 165.195.130.107197.101.0.0 等,每一組的數字都是非負的整數,範圍在 [0, 255] 之間。

IPv4還有種寫法是用二進位制表示的,例如:

十進位制表示二進位制表示
0.0.0.000000000 00000000 00000000 00000000
1.2.3.400000001 00000010 00000011 00000100
10.0.0.25500001010 00000000 00000000 11111111
165.195.130.10710100101 11000011 10000010 01101011
255.255.255.25511111111 11111111 11111111 11111111

因此稱IPv4是32位的。而IPv6的位數就比較大了,是128位的,長度是IPv4的4倍,並且其表示方式是分塊的八組四個十六進位制數,例如:5f05:2000:80ad:5800:0058:0800:2023:1d71,每個塊兒之間都是用 : 隔開的。

IPv6看著特別得長,所以它得簡化表示法已經有一套標準,規則如下:

  1. 每個塊兒中前導的零可省略。例如5f05:2000:80ad:5800:0058:0800:2023:1d71 按照此規則簡化後為 5f05:2000:80ad:5800:58:800:2023:1d71
  2. 整個塊兒都為零的可以省略不寫,並用 :: 代替其位置,但整個IPv6地址中只能出現一次 :: 符號。例如 0:0:0:0:0:0:0:1 按照此規則簡化後為 ::1

當然IPv6也是可以用二進位制表示的,表示結果如下:

十六進位制表示二進位制表示
5f05:2000:80ad:5800:0058:0800:2023:1d710101111100000101 0010000000000000 1000000010101101 0101100000000000 0000000001011000 0000100000000000 0010000000100011 0001110101110001
::10000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001

如果把IPv6和埠號一起使用的話,可能會出現這樣的情況:http://2001:0db8:85a3:08d3:1319:8a2e:0370:7344:443/,該URL中,最後一個 :443 其實表示的是埠號,但與IPv6一起使用時看起來好像也成為了一個塊兒部分,因此我們需要用 [] 符號將IPv6部分包裹起來,結果如下:http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443/

二、IP地址結構

上面提到,IP是作為終端的唯一表示,因此只有當保證每個IP都不同時,才能保證IP的唯一性。其中,IPv4地址的長度為32位,因此就有 2 32 2^{32} 232 種可能的地址,那麼同理,IPv6地址的長度為128位,因此就有 2 128 2^{128} 2128 種可能的地址。

這些地址就是作為資料包傳送的目的地址,當然每個地址都會有它們各自的含義,例如單播組播廣播等,當然還有一些地址是會被保留用於實驗的

  • 單播可以理解為一臺主機傳送單一的資料包給另一臺主機;
  • 組播可以理解為一臺主機傳送單一的資料包給多臺主機;
  • 廣播可以理解為一個節點向其它所有的節點傳送資料包;

IPv4種大多的數的地址都為單播

(1)分類定址

那麼IP地址既然是作為識別特定主機的唯一標識,那麼到底是如何被識別的呢?其實在長度為32位的IPv4地址中,有一段連續位稱為網路號,還有一段連續位稱為主機號

因為有時在同一個網路中,可能會有多臺主機,就例如一個電子計算機教室看成一個網路,教室中有60臺電腦,那麼這60臺電腦都屬於這一個教室所處的網路,而每臺電腦又需要在該網路下單獨分配一個唯一的標識

因此,在識別IP地址時,就是先通過識別IP地址中的網路號來確認目的地址處於哪個網路區域,然後再識別主機號,來確認這個網路中特定的主機。

我們將IPv4地址用二進位制表示,一段地址的網路號和主機號分類可以分為5類:A類B類C類D類E類,區別如下圖:

在這裡插入圖片描述

  • A類: 網路號共8位,首位固定為 0,接下來連續的7位可以自由設定;主機號為24位
  • B類: 網路號共16位,前兩位固定為 1 0,接下來連續的14位可以自由設定;主機號為16位
  • C類: 網路號共24位,前三位固定為 1 1 0,接下來連續的21位可以自由設定;主機號為8位
  • D類: 為組播地址,共32位,前四位固定為 1 1 1 0
  • E類: 為保留地址,共32位,前四位固定為 1 1 1 1

其中A 、B 、C類地址大多都是單播地址,因此它們可用於介面分配。舉個例子,A類地址網路號共8位,其中首位固定為 0,那麼還有7位可以自由設定,那麼就共有 2 7 2^{7} 27 個網路數;主機號共24位,那麼就共有 2 24 2^{24} 224 個主機數。(同樣的,我們可以推出其它類別的地址的網路數和主機數)因此我們可以理解為,用A類地址一共可以為 2 7 2^{7} 27 個電子計算機教室分配使用,每個教室可以容納 2 24 2^{24} 224 臺主機

IPv4地址的範圍在 0.0.0.0 ~ 255.255.255.255 之間,那麼我們來看看這五類地址各自的地址範圍時如何的吧~

A類地址首位固定為 0,因此A類地址用二進位制表示為 0XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX,因此A類地址用十進位制表示時,第一組最小為0,其餘三組最小也為0,即 0.0.0.0

B類地址前兩位固定為 1 0,因此B類地址用二進位制表示為 10XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX,因此B類地址為十進位制表示時,第一組最小為128,其餘三組最小為0,即 128.0.0.0,那麼A類地址的範圍就可以確定為 0.0.0.0 ~ 127.255.255.255

C類地址前兩位固定為 1 1 0,因此B類地址用二進位制表示為 110XXXXXX XXXXXXXX XXXXXXXX XXXXXXXX,因此C類地址為十進位制表示時,第一組最小為192,其餘三組最小為0,即 192.0.0.0,那麼B類地址的範圍就可以確定為 128.0.0.0 ~ 191.255.255.255

以此類推,即可推出D 、E類的地址範圍

我們將IPv4地址的空間劃分情況總結在了下表中:

地址範圍網路數主機數
A0.0.0.0 ~ 127.255.255.255 2 7 2^7 27 2 24 2^{24} 224
B128.0.0.0 ~ 191.255.255.255 2 14 2^{14} 214 2 16 2^{16} 216
C192.0.0.0 ~ 223.255.255.255 2 21 2^{21} 221 2 8 2^{8} 28
D224.0.0.0 ~ 239.255.255.255//
E240.0.0.0 ~ 255.255.255//

上面有提到,A、B、C類地址中大多都是單播,那麼也有幾個地址不作為單播地址使用,一般都是地址塊兒中的第一個地址和最後一個地址不使用,所以假設分配得到的地址塊兒為 127.0.0.0,那麼實際能分配的單播地址數就為 2 24 − 2 2^{24} - 2 2242

(2)子網定址

檢視上述的A類地址,它可使用的主機數有 2 24 2^{24} 224 個,那麼當分配了A類IP地址後,卻發現並沒有那麼多的主機,這樣就造成了剩餘可用主機數的浪費;或者說被分配了C類地址後,卻發現有上萬臺主機,而C類地址可用的主機數只有 2 8 2^8 28 個,因此只能給其多分配幾個C類地址,那麼C類地址就很容易被消耗完

為了解決上述辦法,又採用了一種叫做子網定址的方法,即假設當一個站點被分配了B類地址,那麼該站點的管理員可以將B類地址的主機號部分繼續分成兩部分,分別為 子網號主機號,這兩者所佔的位數可以根據實際需求自由分配,例如分配給子網號8位,分配給主機號8位,即平分,結果如下圖:

在這裡插入圖片描述
此時的站點可以支援 2 8 = 256 2^8=256 28=256 個子網,每個子網中最多可支援 2 8 − 2 = 254 2^8-2=254 282=254 臺主機(每個子網的第一個地址和最後一個地址不會被使用)

這樣在站點內,路由器就可以根據子網號和主機號監測到不同子網的流量了,如下圖所示:

在這裡插入圖片描述
上圖中,該站點被分配了一個B類地址 128.32.x.x,而管理員此時選擇將其繼續劃分為多個子網,如圖中的子網1和子網2,它們分別是開始於 128.32.1128.32.2,並且左右兩臺主機都分別屬於各自的子網。

那麼路由器是如何在地址中尋找子網號的呢?這就要設定一個名為子網掩碼的引數了

(3)子網掩碼

子網掩碼是由一臺主機或路由器使用的分配位,用以確定如何從一臺主機對應的IP地址中獲得網路和子網資訊,更通俗點說,通過它可以確定一個IP地址的網路/子網部分的結束和主機部分的開始。

子網掩碼跟IP地址的長度相等(IPv4位32位,IPv6為128位),對於IPv4來說,子網掩碼也是用點分四組十進位制來表示的。當子網掩碼用二進位制表示時,結構非常簡單且容易記憶,從左邊開始由一段連續的1組成,緊接著又一段連續的0組成直到最後。其中連續的1的長度稱為字首長度,用 /長度 來表示

舉例各種型別的子網掩碼:

十進位制表示字首長度二進位制表示
128.0.0.0/110000000 00000000 00000000 00000000
255.0.0.0/811111111 00000000 00000000 00000000
255.129.0.0/1011111111 11000000 00000000 00000000
255.255.0.0/1611111111 11111111 00000000 00000000
255.255.254.0/2311111111 11111111 11111110 00000000
255.255.255.192/2711111111 11111111 11111111 11100000
255.255.255.255/3211111111 11111111 11111111 11111111

接下來說說子網掩碼是如何使用的,其二進位制位1對應IP地址的網路/子網部分;相反,0對應IP地址的主機號部分。換個說法就是子網掩碼第一個0所對應IP地址的位為主機號的第一位;也可以借用字首長度來判斷,即字首長度後一位對應的也是IP地址主機號的第一位。

例如剛才舉的例子,站點管理員將B類地址 128.32.x.x 的主機位劃分位8位的子網號和8位的主機號,那麼他就會提前設定好一個長度為 16 + 8 = 24 16+8=24 16+8=24 的子網掩碼,即 255.255.255.0,表示前24位是網路/子網部分,那麼路由器在處理圖中的IPv4地址 128.32.1.14時,會先檢視一下子網掩碼,此時將IP地址和子網掩碼對應的位進行與運算即可獲得該IP所處的是哪個子網,運算過程如下圖:

在這裡插入圖片描述
結果中的 128.32.1.0 就是IP地址 128.32.1.14 所屬的子網

但此時有沒有發現一個問題?雖然給地址劃分了子網號和主機號,但是每個子網號所對應子網的主機數就固定死了,而且每個子網所支援的主機數都是一樣的,這一定是不合理的,因為實際應用中,可能這個區域只需要支援10臺主機,而另一個區域需要支援100臺主機,那麼我們此時在劃分子網號和主機號的時候,至少要讓每個子網支援的主機數大於100臺,那隻需要支援10臺主機的區域分配到了一個子網,豈不是至少浪費了其中的90個空間麼?面對這樣的問題,我們又該如何解決呢?

(4)可變長度的子網掩碼

上個部分剛說過,路由器在尋找子網號時,是通過我們設定的子網掩碼來查詢的,那麼我們不妨根據不同的需求設定多個子網掩碼,來達到子網號和主機號分配比例不唯一的需求,這就是VLSM(Variable Length Subnet Mask,可變長度的子網掩碼)的實現

比如,我們上面舉得例子,當前站點被分配到了一個B類地址,該站點的某個區域需要支援100臺主機,那麼我們可以給這個區域分配一個子網號,同時設定其子網掩碼為 255.255.255.128,其字首長度為 25,因此留給主機位的位數還有 32 − 25 = 7 32 - 25 =7 3225=7 位,則該子網支援主機數為 2 7 − 2 = 126 2^7-2=126 272=126 臺,可以滿足該區域的需求;再來看另一個區域,它們需要支援的主機臺數為10,那麼我們可以給該區域分配另一個子網號,同時設定子網掩碼為 255.255.255.240,其字首長度為 28,因此留給主機的位數還有 32 − 28 = 4 32-28=4 3228=4位,則該子網支援的主機數為 2 4 − 2 = 14 2^4-2=14 242=14 臺,同樣可以滿足該區域的需求。

(5)廣播地址

在每個IPv4的子網中,都會有一個特殊的地址被保留作為子網的廣播地址,那如何獲取它呢?我們只需要將子網掩碼的所有位都取反,即0變1,1變0,然後將取反後的子網掩碼與子網內的IP地址進行或運算即可得到廣播地址

仍然延用上面的例子,子網內的IP地址為 128.32.1.14,子網掩碼為 255.255.255.0,則比較過程如下圖:

在這裡插入圖片描述
圖中獲得的結果 128.32.1.255 即為子網 128.32.1.0 中的廣播地址,前面說過,每個子網中的頭尾兩個地址一般是不被使用的,所以該子網中可用的單播地址範圍就是 128.32.1.1 ~ 128.32.1.254

(6)總結

簡單總結一下子網掩碼的作用:

  1. 面對不同需求設定不同的子網掩碼可以做到不同子網支援不同數量的主機
  2. 通過子網掩碼可以獲取子網IP
  3. 通過子網掩碼可以獲取廣播地址
  4. 通過子網掩碼可以獲取該子網內的可用單播地址
  5. 通過子網掩碼可以獲取子網內支援的主機數

三、結束語

第二章對IP的作用以及劃分和用法有了一個深刻的印象,總體感覺還是挺複雜的,光看書、查閱資料、寫部落格總結就花了兩天的事件,另外說明一下,本文主要講解的時IPv4

歡迎關注公眾號:前端印象 , 不定時更新前端面試題,與我一起學習前端,早日斬獲大廠Offer

相關文章