關(guān)于IPv6技術(shù)相關(guān)知識詳解
1. 前戲
IPv6的普及已經(jīng)喊了很多年了,但是事與愿違啊,由于NAT技術(shù)的出現(xiàn),硬是將當(dāng)時岌岌可危的IPv4拖了二十年,所謂的普及IPv6還是遙遙無期,不可否認(rèn)NAT技術(shù)真的很偉大,但是IPv6肯定是未來的趨勢,作為網(wǎng)絡(luò)編程的開發(fā)人員,系統(tǒng)的詳細的了解IPv6還是很有必要的。我相信IPv6的普及很快就會到來,身懷此絕技的讀者你們,肯定是香饃饃了。所以開始看文章吧。
其實我們用的比較多的主流操作系統(tǒng)都已經(jīng)支持了IPv6協(xié)議棧,Windows7,Linux2.6之后的版本等等。
2. IPV6的基本概念
周所周知,IPv6采用128位的地址長度擁有更大的地址空間。首先我們先來認(rèn)識一下IPv6到底長成什么樣子。
IPv6數(shù)據(jù)報文和IPv4有很大的差別:
- 數(shù)據(jù)鏈路層(L2)的type字段標(biāo)識為 0x86dd,表示承載的上層協(xié)議是IPv6(IPv4對比:type字段為0x0800);
- IPv6的頭部字段,和IPv4差別巨大(可以猜測到,IPv6和IPv4無法兼容)。
我們來看下ipv6的報文頭部格式:
Ipv6報文頭部
ipv6的頭部更加的簡單,少了很多的字段,對比ipv4,有這幾個地方需要注意:
- IPv6報文頭部是定長(固定為40字節(jié)),IPv4報文頭部是變長的。這個意味著,寫代碼處理IPv6數(shù)據(jù)報文的效率會提高很多:);
- IPv6中Hop Limit字段含義類似IPv4的TTL;
- IPv6中的Traffic Class字段含義類似IPv4中的TOS(Type Of Service);
- IPv6的報文頭部取消了校驗和字段:取消這個字段也是對IPv4協(xié)議的一個改進。當(dāng)IPv4報文在網(wǎng)路間傳輸,每經(jīng)過一個路由器轉(zhuǎn)發(fā)就是修改TTL字段,就需要重新計算校驗和,而由于數(shù)據(jù)鏈路層L2和傳輸層L4的校驗已經(jīng)足夠強壯,因此IPv6取消這個字段會提高路由器的轉(zhuǎn)發(fā)效率。值得一提的是,在IPv6協(xié)議下,傳輸層L4協(xié)議UDP、TCP是強制需要進行校驗和的(IPv4是可選的);
- IPv6報文頭部中的Next Header字段表示“承載上一層的協(xié)議類型”或者“擴展頭部類型”。
這里的含義與IPv4有很大的差別,需要加以解釋:
- 當(dāng)IPv6數(shù)據(jù)報文承載的是上層協(xié)議ICMPv6、TCP、UDP等的時候,Next Header的值分別為58、6、17,這個時候和IPv4報文頭部中的Protocol字段很類似;
- 當(dāng)不是以上3種協(xié)議類型的時候,IPv6報文頭部緊接的是擴展頭部。擴展頭部是IPv6引入的一個新的概念,每個IPv6的數(shù)據(jù)報文可以承載0個或多個擴展頭部,擴展頭部通過鏈表的形式組織起來。當(dāng)IPv6數(shù)據(jù)報文承載著擴展頭部的時候,Next Header的數(shù)值為擴展頭部的類型值。
為什么要引入擴展頭部這個概念,這里也是IPv6對IPv4改進的一個方面,用擴展頭部取代了IPv4的可選項信息,精簡了IPv6的頭部,增強了IPv6的擴展性。有同學(xué)會不會有疑問,IPv6的分片數(shù)據(jù)報文怎么處理?其實就是使用了IPv6擴展頭部。
當(dāng)發(fā)送一個分片IPv6數(shù)據(jù)報文的時候,IPv6使用的是擴展頭部的形式組織各個分片的信息,IPv6報文頭部Next Header字段值為44表示存在擴展頭部,擴展頭部是IPv6分片數(shù)據(jù)信息。
對比IPv4,分片信息是記錄在IPv4報文頭部的分片字段中。
IPv6的擴展頭部類型有很多種,除了上述的分片頭部,還有路由頭部、逐跳可選頭部等,具體的可以參考RFC2460。
本章主要介紹了IPv6的一些很直觀的認(rèn)識,下面逐漸介紹IPv6上的基本知識和概念。
3. ipv6的地址語法
一個IPv6的地址使用冒號十六進制表示方法:128位的地址每16位分成一段,每個16位的段用十六進制表示并用冒號分隔開,例如:
一個普通公網(wǎng)IPv6地址:
- 2001:0D12:0000:0000:02AA:0987:FE29:9871
IPv6地址支持壓縮前導(dǎo)零的表示方法,例如上面的地址可以壓縮表示為:
- 200112:0:0:2AA:987:FE29:9871
為了進一步精簡IPv6地址,當(dāng)冒號十六進制格式中出現(xiàn)連續(xù)幾段數(shù)值0的位段時,這些段可以壓縮為雙冒號的表示,例如上面的地址還可以進一步精簡表示為:
- [pquote]200112::2AA:987:FE29:9871
又例如IPv6的地址FF80:0:0:0:FF:3BA:891:67C2可以進一步精簡表示為:
- FE80::FF:3BA:891:67C2
這里值得注意的是:雙冒號只能出現(xiàn)一次。
4. IPv6地址的號段劃分和前綴表示法
IPv6擁有128位巨大的地址空間,對于那么大的空間,也不是隨意的劃分,而是使用按照bit位進行號段劃分(與鵝廠內(nèi)部一些的64位uin改造放號的zone劃分算法)。
IPv6的地址結(jié)構(gòu)如下圖:
例如RFC4291中定義了n=48, m=16,也就是子網(wǎng)和接口ID與各占64位。
IPv6支持子網(wǎng)前綴標(biāo)識方法,類似于IPv4的無分類域間路由CIDR機制(注意:IPv6沒有子網(wǎng)掩碼mask的概念)。
使用“IPv6地址/前綴長度”表示方法,例如:
- 2001:C3:0:2C6A::/64表示一個子網(wǎng);
- 而2001:C3:0:2C6A:C9B4:FF12:48BC:1A22/64表示該子網(wǎng)下的一個節(jié)點地址。
可以看到,一個IPv6的地址有子網(wǎng)前綴+接口ID構(gòu)成,子網(wǎng)前綴由地址分配和管理機構(gòu)定義和分配,而接口ID可以由各操作系統(tǒng)實現(xiàn)生成,生成算法后面的章節(jié)會介紹。
5. IPv6的地址類型
IPv6地址分三種類型:
- 單播,對應(yīng)于IPv4的普通公網(wǎng)和私網(wǎng)地址;
- 組播,對應(yīng)于IPv4的組播(多播)地址;
- 任播,IPv6新增的地址概念類型。
IPv6沒有廣播地址,用組播地址實現(xiàn)廣播的功能。實際上我們工作和生活最可能最多接觸的就是單播地址,接下來本文重點會講解單播地址的種類。組播和任播地址有興趣的同學(xué)自行查閱相關(guān)RFC和文獻。