前言
2019年11月25日,全球五大區域互聯網註冊管理機構之一的歐洲網絡協調中心(RIPE NCC)宣佈 IPv4 地址已全部用完,該機構在其聲明中寫道:我們從可用池中僅剩的地址裏分配了最後的 /22 IPv4。
IPv4地址空間已經消耗殆盡, 能夠一直使用還在與NAT技術的發明。
隨着IPv4地址空間的消耗, 近乎無限地址空間的IPv6"閃亮登場"。
IPv4與IPv6區別
兩者在本質上以及數量上的區別:
版本 | 長度 | 地址數量 |
IPv4 | 32 bit | 4,294,967,296 |
IPv6 | 128 bit | 340,282,366,920,938,463,463,374,607,431,768,211,456 |
兩者的報頭對比如下
IPv4 Header:
IPv6 Header:
(圖來自51CTO.com)
IPv6是在IPv4的基礎上進行改進的, 增加了流標籤域, 去除了一些冗餘的字段, 使得報文頭的處理更加簡單高效。
- IPv4
可用地址有限; (十進制數)
安全性差;
無法實現端到端的控制
- IPv6
近乎無限的地址; (十六進制數)
內嵌AH和ESP;
可有效與QOS結合使用
IPv6地址分類
IPv6地址分爲單播地址、任播地址、組播地址三種類型
地址範圍 | 描述 |
2000::/3 | 全球單播地址 |
FEC0::/10 | 本地站點地址 |
FE80::/10 | 鏈路本地地址 |
FF00::/8 | 組播地址 |
::/0 | 缺省地址 |
::1/128 | 環回地址 |
本地站點地址以 FEC0 開頭, 相當於IPv4裏的192.168.*.*的192 (可以這麼理解);
鏈路本地地址以 FE80 開頭, 通信只能在局域網內進行, 不同的網段不能通信, 只能在同一局域網內使用, 這裏是和IPv4不同的;
組播地址可以理解爲網關, 作爲整個網段的一個終端;
缺省地址相當於IPv4裏的0.0.0.0;
環回地址相當於本地環回地址127.0.0.1
與IPv4不同的是, IPv6不存在廣播地址, 增加了任播地址。
IPv6地址格式
IPv6地址長度爲128比特(bit), 每16bit劃分爲一段, 每段由4個十六進制數表示, 並用冒號隔開;
IPv6地址包括網絡前綴和接口標識兩部分
有如下一個IPv6地址:
FEC0:0000:0000:0001:0000:0000:0000:0001/64
這種寫法其實相當於IPv4裏的192.168.1.1/24
IPv6網絡前綴由公共拓撲&站點拓撲兩大部分組成, 其中公共拓撲總共佔48位, 站點拓撲佔16位; 從運營商得到的是前48位固定, 即FEC0:0000:0000, 相當於192.168; 後16位子網用戶自行劃分, 即0001, 相當於192.168.1.* 或者 192.168.2.*; 剩下的就是主機位了, 一共可以有2^64個主機 (已經很多了)
前綴長度的作用類似與IPv4中的子網掩碼, 用於區分的部分是接口標識。
接口標識與IPv4中的主機部分類似, 用於標誌網絡中的主機身份。
如何區分網絡前綴和主機標識
將網絡前綴與IPv6地址進行&運算即可
- 舉個栗子
在IPv4中, 192.168.1.0/24 與 192.168.2.0/24 是否能通信?
首先來看 192.168.1.0/24
網絡前綴 (子網掩碼) 中可知, 前24位都是1:
11111111 11111111 11111111 00000000
那麼IPv4地址爲 192.168.1.0:
11000000 10101000 00000001 00000000
兩者進行&運算:
11111111 11111111 11111111 00000000
11000000 10101000 00000001 00000000
&
---------------------------------------
11000000 10101000 00000001 00000000
得到的結果爲: 11000000 10101000 00000001 00000000
在來看 192.168.2.0/24, 將網絡前綴與IPv4地址進行&運算之後得到:
11111111 11111111 11111111 00000000
11000000 10101000 00000010 00000000
&
---------------------------------------
11000000 10101000 00000010 00000000
得到的結果爲: 11000000 10101000 00000010 00000000
兩者不相等, 故192.168.1.0/24與192.168.2.0/24不在同一局域網內, 不能通信。
但是 192.168.1.0/16與192.168.2.0/16 就在同一局域網內, 感興趣的讀者可以自行嘗試計算。
- 在IPv6中
與IPv4同樣的原理, 假設有: FEC0:0000:0000:0001:0000:0000:0000:0001/64
網絡前綴 (相當於子網掩碼):
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
IPv6:
1111 1110 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
IPv6地址壓縮格式
IPv6地址很長, 所以產生了壓縮省略的寫法:
- 每一組中的前導 '0' 都可以省略;
- 地址中包含連續全爲0的組, 可以用雙冒號 '::' 來代替
值得注意的是, 形如fec0中的0不能省略, 舉個很簡單的例子, 010可以省略爲10, 但不能記爲01
還有一種情況
假設有IPv6:
fec0:0:0:1:0:0:0:1
若省略記爲:
fec0::1::1
那麼就不知道兩個 '::' 處那個是有兩個0, 哪個是有三個0的了, 造成一種混淆模糊的寫法。
只能記爲:
fec0:0:0:1::1
或者
fec0::1:0:0:0:1
IPv6單播地址
全球單播地址帶有固定前綴, 類似與IPv4中的公網地址。
IPv6鏈路本地單播地址
鏈路本地單播地址前綴爲FE80::/10
IPv6組播地址
這裏介紹下組播地址, (沒有IPv4的廣播了)
- 所有組播地址都以FF開頭;
- IPv6爲需要使用組播發送數據的協議預留了一些組播租
地址範圍 | 描述 |
FF02::1 | 鏈路本地範圍的所有節點 (終端設備) |
FF02::2 | 鏈路本地範圍的所有路由器 (網絡設備) |
IPv6任播地址
任播地址用來標識一組網絡接口, 在給多個主機或者節點提供相同服務的時候, 會提供冗餘和負載分擔。
假設有任播地址 2001:0DB8::84C2, 有多個區域訪問該地址, 那麼任播地址就會根據客戶端的距離來分別相同的服務器給其訪問, 從而減少負載。
EUI-64規範
IPv6地址配置起來實在太麻煩了, 所以產生了EUI-64規範來自動配置IPv6地址。
EUI-64規範是生成後64位的主機位的, 它是根據48位以太網的MAC地址來生成對應的IPv6地址, 方法如下:
將FFFE插入MAC地址的前24位與後24位之間, 並將第7位的0改爲1即可生成接口ID
舉個例子:
假設有一臺主機的MAC地址爲:
4c1f-cc4d-2cd5
將 fffe 插入MAC地址的前24位與後24位之間:
4c1f-ccfffe4d-2cd5
並將第7位的0改爲1
4 c 1 f ...
0100 1100 0001 1111 ...
第7爲的0改爲1:
4 e 1 f ...
0100 1110 0001 1111 ...
最後生成的後64位主機位爲:
4e1f:ccff:fe4d:2cd5
配合前64位固定的鏈路本地地址 fe80::, 組合得到:
fe80::4e1f:ccff:fe4d:2cd5
IPv6無狀態地址DAD檢查
在IPv4中, 爲防止ip配置衝突, 採用了 ARP 緩存對應表來判斷ip是否被使用。
在IPv6中,
- 用DAD (Duplicate Address Detection) 來檢測在本地鏈路範圍內將要使用的IPv6地址是否唯一;
- 目的地址(多播地址) = ff02::1ff00::/104 + 該接口本地鏈路地址的後24位。
假設主機A要使用目的地址: 2000::1
那麼A就會向本地鏈路範圍內發送數據包:
ICMP TYPE = 135 // 代表發送一個請求
Source = :: // 代表未知源
Destination = ff02::1:ff00:1 // 目的地址 (多播地址) = ff02::1ff00::/104 + 該接口本地鏈路地址的後24位
Data = 2000::1 // 要使用的目的地址
Query = is this address in use ?
假設有主機B整在使用 2000::1, 且收到了剛剛的數據包, 那麼它會回覆以下數據包:
ICMP TYPE = 136 // 代表發送一個報文
Source = 2000::1 // 代表主機B
Destination = ff02::1 // 鏈路本地範圍的所有節點, 主機A在其中(終端設備)
Data = 2000::1 // 正在使用的目的地址
Query = i am using this address
表示 2000::1 已經在使用了, 主機A配置失敗;
反之, 一段時間內,若鏈路上沒有誰回覆,或者收到同樣結構的NS報文,則認爲該地址在鏈路上具有唯一性,配置生效。