IPv4地址表示法詳解
阿新 • • 發佈:2020-03-21
在TCP/IP協議中,IP地址是一個最基本的概念,本文就來參考《計算機網路》謝希仁 這本書,總結一下IPv4地址表示法的發展階段,做個讀書筆記。
IP地址的編址方法共經過了三個歷史階段:
1. **分類的IP地址**,這是最基本的編址方法,在1981年就通過了相應的標準協議。
2. **子網的劃分**,這是對最基本的編址方法的改進,其標準RFC 950在1985年通過。
3. **無分類編址**,這是比較新的無分類編址方法,1993年提出後很快就得到推廣應用。
## 傳統分類的IP地址
### 概念
傳統分類的IP地址就是將IP地址劃分為若干個固定類,每一類地址都由兩個固定長度的欄位組成,其中第一個欄位是網路號,它標誌主機所連線到的網路。第二個欄位是主機號,它標誌著該主機。
一個網路號在整個網際網路範圍內必須是唯一的。
一個主機號在它前面的網路號所指明的網路範圍內必須是唯一的。
![ipv4分類](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155145985-983007169.png)
> 這裡要指出,由於近年來已經廣泛使用無分類IP地址進行路由選擇,A類、B類和C類地址的區分已成為歷史[RFC 1812]
其實還有D類(廣播地址)和E類(保留地址)本文暫不考慮。
### 表示
![ipv4-點分十進位制](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155220398-2072866768.png)
### 幾種特殊IP
- 網路號全為0(00000000)
IP地址中的全0表示“這個(this)”。網路號欄位為全0的IP地址是個保留地址,意思是“本網路”。
- 網路號為127(01111111)
保留作為本地環回地址,作為本主機的程序之間通訊之用。
- 主機號全為0
代表整個網路本身,即本網段
- 主機號為255(11111111)
為廣播地址,代表本網路中的所有地址
> 0.0.0.0 和 127.0.0.1 的通俗解釋:
>
> 假設你有一臺伺服器,IP地址為49.233.87.25,在這臺伺服器上你要配置一個nginx網站。
>
> 將nginx監聽為0.0.0.0.0:80,那麼網際網路上的任何人都可以在瀏覽器中訪問49.233.87.25:80,來訪問你的站點。
>
> 將nginx監聽為127.0.0.1:80,你只能在你的伺服器上,用curl 127.0.0.1:80來訪問你的站點。
> localhost 和 127.0.0.1
>
> localhost 是 127.0.0.1 的域名,它倆是一個東西。
### 地址的指派範圍
| 網路類別 | 最大網路數 | 第一個網路號 | 最後一個網路號 | 網路中的最大主機數 |
| :------: | :-------------: | :----------: | :------------: | :----------------: |
| A類 | 126(2^7-2) | 1 | 126 | 16777214 |
| B類 | 16383(2^14-1) | 128.1 | 191.255 | 65534 |
| C類 | 2097151(2^21-1) | 192.0.1 | 223.225.225 | 254 |
### 問題
- IP地址空間的利用率有時很低
每一個A類地址網路可連線的主機數超過1000萬臺,而每一個B類地址網路可連線的主機數也超過6萬臺。然而有些網路對連線在網路上的計算機數目有限制,根本達不到這樣大的數值。
有的單位申請到了一個B類地址網路,但所連線的主機數並不多,可是又不願意申請一個足夠使用的C類地址,理由是考慮到今後可能的發展
- 給每一個物理網路分配一個網路號會使路由表變得太大因而使網路效能變壞
每一個路由器都應當能夠從路由表查出應怎樣到達其他網路的下一跳路由器。因此,網際網路中的網路數越多,路由器的路由表的專案數也就越多
- 兩級IP地址不夠靈活
有時情況緊急,一個單位需要在新的地點馬上開通一個新的網路。但是在申請到一個新的IP地址之前,新增加的網路是不可能連線到因特網上工作的。
## 子網的劃分
為解決上述問題,從1985年起在IP地址中又增加了一個“子網號欄位”,使兩級IP地址變成為三級IP地址,它能夠較好地解決上述問題,並且使用起來也很靈活。這種做法叫作劃分子網
### 基本思路
- 內部可見,外部不變
一個擁有許多物理網路的單位,可將所屬的物理網路劃分為若干個子網。劃分子網純屬一個單位內部的事情。本單位以外的網路看不見這個網路是由多少個子網組成,因為這個單位對外仍然表現為一個網路。
- IP地址 = 網路號 + 子網號 + 主機號
劃分子網的方法是,從該網路的主機號中借用幾位作為子網號,當然主機號也就相應的減少幾位。
- 先找網路號,再找子網號
凡是從其他網路傳送給本單位某個主機的IP資料報,仍然是根據IP資料報的目的網路號找到連線在本單位網路上的路由器。但此路由器在收到IP資料報後,再按子網號找到目的子網,把IP資料報交付目的主機。
### 示例
假設某單位有一個B類地址,網路地址為145.13.0.0,即表示凡目的地址為145.13.x.x的資料報都被送到這個網路上的路由器R1
這裡假定子網號佔用8位,即主機號還剩餘8位可用。將網路劃分為三個子網,145.13.3.0,145.13.7.0,145.13.21.0
![子網劃分外部圖](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155305627-2008725938.png)
![子網劃分內部圖](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155331146-1262071515.png)
### 子網掩碼
現在有一個問題就是,假設有一個目的地址為145.13.3.10的資料報轉發到了路由器R1,哪R1如何將其轉發到子網145.13.3.0呢?
由於32位的IP地址本身以及資料報的首部都沒有包含任何有關子網劃分的資訊,所以為了解決上述問題,必須引入額外資訊,這就是子網掩碼。
![子網掩碼](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155353565-268998464.png)
IP地址和子網掩碼按位與(AND),即可得到網路號。
> 現在因特網的標準規定:所有的網路都必須使用子網掩碼,同時在路由器的路由表中也必須有子網掩碼這一欄。
>
> 如果一個網路不劃分子網,那麼該網路的子網掩碼就使用預設子網掩碼。預設子網掩碼中1的位置和IP地址中的網路號欄位正好相對應。
A類地址,預設子網掩碼 255.0.0.0
B類地址,預設子網掩碼 255.255.0.0
C類地址,預設子網掩碼 255.255.255.0
### 路由轉發
要注意,使用子網劃分後,路由表必須包含以下三項:**目的網路地址**,**子網掩碼**,和**下一跳地址**。
![路由轉發](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155416230-1822361665.png)
源主機H1(128.30.33.13)向目的主機H2(128.30.33.138)傳送資料時的過程如下:
1. 目的IP地址與網路1的子網掩碼按位與得到128.30.33.128,不等於網路1的地址128.30.33.0,即H1和H2不在同一個子網內,所以資料轉發給路由器R1
2. R1收到資料報後,逐行檢查路由表,最終發現128.30.33.138和255.255.255.128按位與,得到128.30.33.128,匹配第二行,所以R1將資料報從介面1直接交付給目的主機H2
### 問題
劃分子網在一定程度上緩解了因特網在發展中遇到的困難。但是在1992年因特網依舊遇到如下問題:
1. B類地址在1992年已分配了近一半,眼看很快就將全部分配完畢!
2. 因特網主幹網上的路由表中的專案數急劇增長(從幾千個增長到幾萬個)。
## 無分類編址CIDR
### 概念
CIDR**消除了傳統的A類、B類和C類地址以及劃分子網的概念**,把32位的IP地址劃分為兩個部分,前面是**網路字首**,用來指明網路,後面的部分用來指明主機。CIDR是**無分類**的兩級編址,IP地址 = 網路字首 + 主機號
CIDR計法在IP地址後面加上斜線“/”,然後寫上網路字首所佔的位數
### 地址塊
CIDR把網路字首都相同的連續的IP地址組成一個“CIDR地址塊”,我們只要知道地址塊中的任何一個地址,就可以知道這個地址塊的起始地址和最大地址,以及地址塊中的地址數。
舉例:
已知128.14.35.7/20是某CIDR地址塊中的一個地址
128.14.35.7/20 = **10000000000011100010**001100000111
可知:
最小地址:128.14.32.0 = **10000000000011100010**000000000000
最大地址:128.14.47.255 = **10000000000011100010**111111111111
地址數:2^12個
### 地址掩碼
為了更方便地進行路由選擇,CIDR使用32位的地址掩碼,地址掩碼由一串1和一串0組成,而1的個數就是網路字首的長度。
例如,/20地址塊的地址掩碼是:11111111 11111111 11110000 00000000(20個連續的1)
注意:雖然CIDR不再使用子網,但是由於目前一些網路還使用子網劃分和子網掩碼,因此CIDR使用的地址掩碼也可以繼續稱為子網掩碼。
> “CIDR不使用子網”是指CIDR並沒有在32位地址中指明若干位作為子網欄位。但分配到一個CIDR地址塊的單位,仍然可以在本單位內根據需要劃分出一些子網。
>
> 這些子網也都只有一個網路字首和一個主機號欄位,但子網的網路字首比整個單位的網路字首要長些。
>
> 例如,某單位分配到地址塊/20,就可以再繼續劃分為8個子網(即需要從主機號中借用3位來劃分子網)。這時每一個子網的網路字首就變成23位(原來的20位加上從主機號借來的3位),比該單位的網路字首多了3位。
### 地址聚合
![構成超網](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155533954-55930909.png)
![超網劃分](https://img2020.cnblogs.com/blog/1459179/202003/1459179-20200321155541471-1417825340.png)
如上圖所示,假定某ISP擁有地址塊206.0.64.0/18(相當於有64個C類網路)
ISP可以給該大學分配一個地址塊206.0.68.0/22(相當於有4個C類網路)
這個大學然後可自由地對本校的各系分配地址塊
而各系還可再劃分本系的地址塊
> CIDR的地址塊分配有時不易看清,這是因為網路字首和主機號的界限不是恰好出現在整數字節處,只要寫出二進位制表示形式,就清晰了
從上圖就可以清楚地看出**地址聚合**的概念。這個ISP共擁有64個C類網路。如果不採用CIDR技術,則在與該ISP的路由器交換路由資訊的每一個路由器的路由表中,就需要有64個專案。(如第二節中的R1路由器,路由表中就有三個子網的資訊)
但採用地址聚合後,就只需用路由聚合後的一個專案206.0.64.0/18就能找到該ISP。(即構成超網)
### 最長字首匹配
在CIDR中,由於採用了網路字首這種記法,IP地址由網路字首和主機號這兩部分組成。因此路由表的每條記錄由**網路字首**和**下一跳**組成。
但是,在查詢路由表的時候,可能有多條記錄匹配,應當從匹配結果中選擇具有最長網路字首的路由,即最長字首匹配。
## 參考資料
《計算機網路》謝希仁 編著
[B類地址第一個可分派的網路號為什麼不是128.0?](https://www.zhihu.com/question/37927675)
[ Special-Use IPv4 Addresses](https://tools.ietf.org/html/rfc3330)