浅谈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 1111IPv6:
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報文,則認為該地址在鏈路上具有唯一性,配置生效。
總結
- 上一篇: 服务器被攻击了怎么办?海外服务器有什么有
- 下一篇: 计算机网络——网络抓包实战(Tcpdum