淺談IPv6地址

前言

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報文,則認爲該地址在鏈路上具有唯一性,配置生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章