IPv6的全稱是Internet Protocol Version 6(互聯(lián)網(wǎng)協(xié)議第6版)的縮寫,是互聯(lián)網(wǎng)工程任務(wù)組(IETF)設(shè)計(jì)的用于替代IPv4的下一代IP協(xié)議,其地址數(shù)量號(hào)稱可以為全世界的每一粒沙子編上一個(gè)地址 。

由于IPv4最大的問題在于網(wǎng)絡(luò)地址(公網(wǎng)IP)資源不足,無論是PC電腦,還是移動(dòng)端的手機(jī)和PAD都需要占用IP地址,IPv4面臨著即將被用盡的窘境,嚴(yán)重制約了互聯(lián)網(wǎng)的應(yīng)用和發(fā)展。IPv6的使用,不僅能解決網(wǎng)絡(luò)地址資源數(shù)量的問題,而且也解決了多種接入設(shè)備連入互聯(lián)網(wǎng)的障礙 。
IPv6地址和規(guī)范將會(huì)逐漸普及。2020年3月23日,工業(yè)和信息化部發(fā)布《關(guān)于開展2020年IPv6端到端貫通能力提升專項(xiàng)行動(dòng)的通知》,要求到2020年末,IPv6活躍連接數(shù)達(dá)到11.5 億,較2019年8億連接數(shù)的目標(biāo)提高了43%。隨著IPv6的發(fā)展與逐步普及,我們的軟件也要添加對(duì)IPv6地址的支持,不再是僅僅支持IPv4了。
本文簡(jiǎn)單的梳理一下IPv6的IP地址結(jié)構(gòu)和分配方式,同時(shí)也介紹一下基本使用方法,在此分享給大家。
一、IPv6的地址結(jié)構(gòu)定義
節(jié)點(diǎn)、鏈路、站點(diǎn)、接口在IPv6里面的概念如下:
節(jié)點(diǎn):具有IPv6地址且接口配置為支持IPV6的任何系統(tǒng),可以理解為主機(jī)和路由器。每個(gè)節(jié)點(diǎn)上至少要有一個(gè)鏈路本地單播地址,另外還可分配任何類型(單播、泛播和多播)或范圍的IPv6地址。
鏈路:?jiǎn)我磺疫B續(xù)的網(wǎng)絡(luò)介質(zhì),其兩端均連接有路由器。節(jié)點(diǎn)所在的網(wǎng)絡(luò)就是鏈路本地的范圍,通常是不能跨越路由器的,也就是在一條鏈路上。以太網(wǎng)就是一個(gè)交換機(jī)下的所有設(shè)備都在一個(gè)鏈路上。
站點(diǎn):就是一個(gè)企業(yè)內(nèi)部的網(wǎng)絡(luò),可以有多個(gè)網(wǎng)段,類似IPv4的私網(wǎng)范圍。但目前已經(jīng)被RFC廢除了,IPv6一般也不需要私網(wǎng)的存在意義。
接口:比如一個(gè)網(wǎng)卡的網(wǎng)口、上網(wǎng)的電話線口,一個(gè)節(jié)點(diǎn)可以被分配多個(gè)接口,而每個(gè)接口可以有多個(gè)ipv6地址。所有類型的IPv6地址都是屬于接口(Interface)而不是節(jié)點(diǎn)(node),在單播地址中,IPv6 地址的最后 64 位是對(duì)于 IPv6 地址的 64 位前綴而言唯一的接口標(biāo)識(shí)(由mac地址自動(dòng)生成,或者根據(jù)EUI-64規(guī)范手動(dòng)生成)。一個(gè)接口在一個(gè)子網(wǎng)前綴中唯一。
1、IPv6地址表示
1)冒分十六進(jìn)制表示法:IPv6地址包括128比特,以16位為一分組,每個(gè)16位分組寫成4個(gè)十六進(jìn)制數(shù),中間用冒號(hào)分隔。如
21DA:00D3:0000:0000:02AA:00FF:FE28:9C5A
2)表示方法對(duì)大小寫不敏感:16比特的十六進(jìn)制數(shù)對(duì)大小寫不敏感,如:
21DA:00D3:0000:0000:02aa:00ff:fe28:9C5A 。
3)每組的前導(dǎo)0可簡(jiǎn)化表示:IPv6地址中每個(gè)16位分組中的前導(dǎo)零位可以去除做簡(jiǎn)化表示,如:
21DA:D3:0:0:2AA:FF:FE28:9C5A
4)中間比特連續(xù)為0的情況:可以把連續(xù)出現(xiàn)的0省略掉,用::代替(注意::只能出現(xiàn)一次,否則不能確定到底有多少省略的0),該符號(hào)也能用來壓縮地址中前部和尾部的相鄰的連續(xù)零位,如下所示:
21DA:D3:0:0:2AA:FF:FE28:9C5A 等價(jià)于 21DA:D3::2AA:FF:FE28:9C5A
FF01:0:0:0:0:0:0:101 等價(jià)于 FF01::101
0:0:0:0:0:0:0:1 等價(jià)于 ::1
0:0:0:0:0:0:0:0 等價(jià)于 ::
5)在IPv4和IPv6混合環(huán)境:x:x:x:x:x:x:d.d.d.d,其中x是地址中6個(gè)高階16位分組的十六進(jìn)制值,d是地址中4個(gè)低階8位分組的十進(jìn)制值(標(biāo)準(zhǔn)IPv4表示)。例如地址0:0:0:0:0:0:13.1.68.3,
0:0:0:0:0:FFFF:129.144.52.38 寫成壓縮形式為::13.1.68.3,::FFFF.129.144.52.38。
6)URL中使用文本IPv6地址:文本地址應(yīng)該用符號(hào)‘[’和‘]’來封閉。例如文本IPv6地址
FEDC:BA98:7654:3210:FEDC:BA98:7654:3210寫作URL示例為http://[
FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html。
7)前綴表示方法:
ipv6-address/prefix-length 其中,ipv6-address為16進(jìn)制表示的128比特地址;prefix-length為10進(jìn)制表示的地址前綴長度。和IPv4類似,IPv6的子網(wǎng)前綴和鏈路關(guān)聯(lián),多個(gè)子網(wǎng)前綴可分配給同一鏈路。
例如,2001:0DB8:0:CD30::/60
當(dāng)書寫節(jié)點(diǎn)地址和該節(jié)點(diǎn)地址的前綴(例如,節(jié)點(diǎn)的子網(wǎng)前綴)時(shí),二者合并寫法如下:
節(jié)點(diǎn)地址
2001:0DB8:0:CD30:123:4567:89AB:CDEF
和它的子網(wǎng)號(hào) 2001:0DB8:0:CD30::/60
二者能夠縮寫為
2001:0DB8:0:CD30:123:4567:89AB:CDEF/60
2、EUI-64格式
EUI-64格式:擴(kuò)展惟一標(biāo)識(shí)符
在IPV6中,無狀態(tài)自動(dòng)配置機(jī)制使用EUI-64格式來自動(dòng)配置IPV6地址。所謂無狀態(tài)自動(dòng)配置是指在網(wǎng)絡(luò)中沒有DHCP服務(wù)器的情況下,允許節(jié)點(diǎn)自行配置IPV6地址的機(jī)制。
EUI-64的構(gòu)造規(guī)則:根據(jù)接口的MAC地址再加上固定的前綴來生成一個(gè)IPV6的地址。
工作原理:自動(dòng)將48bit的以太網(wǎng)MAC地址擴(kuò)展成64bit,再掛在一個(gè)64bit的前綴后面,組成一個(gè)IPV6地址
步驟一、將48位的MAC地址從中間分開,插入一個(gè)固定數(shù)值FFFE
0050:3EE4:4C00-->0050:3EFF:FEE4:4C00
步驟二、將第7個(gè)比特位反轉(zhuǎn),如果原來是0,就變?yōu)?,如果原來是1,就變?yōu)?
0050:3EFF:FEE4:4C00-->0250:3EFF:FEE4:4C00
步驟三、加上前綴:比如加上鏈路本地地址前綴FE80,F(xiàn)E80::0250:3EFF:FEE4:4C00 這就是一個(gè)完整的IPV6地址。
反轉(zhuǎn)的原因:在MAC地址中,第7比特為1表示本地管理,為0表示全球管理;在EUI-64格式中,第7位為1表示全球惟一,為0表示本地惟一
3、 IPv6地址分類

1) IPv6地址分為單播地址、任播地址、多播地址。和IPv4相比,取消了廣播地址類型,以更豐富的多播地址代替,同時(shí)增加了任播地址類型。任播地址取自(具有任何范圍的)單播地址空間,在句法上任播地址與單播地址難以區(qū)分。
2)“未指定的地址”(全0)、環(huán)回地址(::1)和嵌入IPv4地址的IPv6地址從0000 0000格式前綴中分配。
3) 除多播地址(格式前綴1111 1111)外,格式前綴從001到111的地址都必須有64比特的EUI-64格式的接口標(biāo)識(shí)符。
4) 所有格式前綴不是多播格式前綴(1111 1111)的IPv6地址都是IPv6單播格式(任播和IPv6單播格式相同)。IPv6單播地址和IPv4單播地址一樣可聚合。
4、IPv6單播地址
單一接口的標(biāo)識(shí)符,用于一對(duì)一的連接。

IPv6單播地址由子網(wǎng)前綴和接口ID兩部分組成。子網(wǎng)前綴由IANA、ISP和各組織分配。接口標(biāo)識(shí)符目前定義為64比特,可以由本地鏈路標(biāo)識(shí)MAC生成或采用EUI-64格式隨機(jī)算法生成以保證唯一性。
有以下六種類型:
1)可聚合全球單播地址

目前已分配的地址前綴:2001::/3, 2000::
~3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
目前實(shí)際用于IPV6 因特網(wǎng)運(yùn)作的前綴:2001::/16;
2002::/16為使用6to4過渡機(jī)制節(jié)點(diǎn)保留;
3ffe::/16由于6bone測(cè)試目的前綴。
2)本地鏈路地址

節(jié)點(diǎn)啟用ipv6,每個(gè)接口自動(dòng)會(huì)生成一個(gè)本地鏈路地址。其前綴64bit是固定的,其后64bit的接口ID根據(jù)EUI-64格式來構(gòu)造。
鏈路本地地址只能在本地鏈路通信,不能過路由。
3)站點(diǎn)本地地址
IPV6私網(wǎng)地址,就像IPV4的私網(wǎng)地址一樣。只能在站點(diǎn)內(nèi)使用,不能用于公網(wǎng)。

最初設(shè)計(jì)站點(diǎn)本地地址是用于不需要全球前綴的站點(diǎn)內(nèi)部尋址。現(xiàn)在,站點(diǎn)本地地址已經(jīng)過時(shí)了,在新的實(shí)現(xiàn)中,必須不再支持由[RFC3513]定義的這個(gè)前綴的特殊性質(zhì)(即,新的實(shí)現(xiàn)必須將此前綴看作是全球單播)。
已有的實(shí)現(xiàn)和部署可以繼續(xù)使用這個(gè)前綴。
4)不確定地址
單播地址0:0:0:0:0:0:0:0稱為不確定地址。它不能分配給任何節(jié)點(diǎn)。它的一個(gè)應(yīng)用示例是初始化主機(jī)時(shí),在主機(jī)未取得自己的地址以前,可在它發(fā)送的任何IPv6包的源地址字段放上不確定地址。不確定地址不能在IPv6包中用作目的地址,也不能用在IPv6路由頭中;
5)回環(huán)地址
單播地址0:0:0:0:0:0:0:1稱為回環(huán)地址。節(jié)點(diǎn)用它來向自身發(fā)送IPv6包。它不能分配給任何物理接口。
6)帶有嵌入ipv4地址的ipv6地址
分兩類:Ipv4兼容的ipv6地址 和 Ipv4映射的ipv6地址。

Ipv4兼容的ipv6地址:ipv4地址必須全球唯一。像::13.1.68.3這種前96比特全0的地址,主要用在一種自動(dòng)隧道技術(shù),目的地址為這種地址的報(bào)文會(huì)被自動(dòng)IPv4隧道封裝,由于這種技術(shù)不能解決地址耗盡問題,已經(jīng)逐漸被廢棄。

Ipv4映射的ipv6地址:像::FFFF.129.144.52.38這種最前80比特為全0,中間16比特為全1,最后32比特為IPv4地址,這種地址用來把只支持IPv4的節(jié)點(diǎn)用IPv6地址表示。在支持雙棧的IPv6節(jié)點(diǎn)上,IPv6應(yīng)用發(fā)送目的報(bào)文是這種地址時(shí),實(shí)際上發(fā)出的報(bào)文為IPv4報(bào)文(目的地址是“IPv4映射的IPv6地址”中的IPv4地址)。
5、IPv6任播地址
一到近模式,多個(gè)設(shè)備共享一個(gè)地址。
IPv6任播地址是分配給一套屬于不同節(jié)點(diǎn)的接口的全球地址,地址格式和IPv6單播地址相同,用來標(biāo)識(shí)一組接口的地址,一般這些接口屬于不同的節(jié)點(diǎn)。
分配相同的ipv6地址給擁有相同功能的設(shè)備,發(fā)送方發(fā)送一個(gè)以任播地址為目標(biāo)的包,路由器接收到這個(gè)包后,就轉(zhuǎn)發(fā)給具有這個(gè)地址的離它最近的設(shè)備。當(dāng)一個(gè)單播地址被分配給多個(gè)接口時(shí),單播地址自動(dòng)變成任播地址。
如下邊兩個(gè)圖所示,第一個(gè)配置沒有沖突的地址,第二個(gè)配置了另外一臺(tái)主機(jī)一樣的地址。同一鏈路的兩個(gè)主機(jī)配置了相同的ipv6地址后,后邊的地址標(biāo)注就是“復(fù)制”。


用途:
IPv6任播地址的用途之一是用來標(biāo)識(shí)屬于同一提供因特網(wǎng)服務(wù)的組織的一組路由器。這些地址可在IPv6路由頭中作為中間轉(zhuǎn)發(fā)路由器,以使報(bào)文能夠通過特定一組路由器進(jìn)行轉(zhuǎn)發(fā)。
另一個(gè)用途就是標(biāo)識(shí)特定子網(wǎng)的一組路由器,報(bào)文只要被其中一個(gè)路由器接收即可。
其中有些任播地址是已經(jīng)定義好的,如子網(wǎng)路由器任播地址,格式如下。

任播地址中“子網(wǎng)前綴”用來標(biāo)識(shí)一個(gè)特定鏈路。此任播地址在句法上,與該鏈路上接口標(biāo)識(shí)符設(shè)置為0的接口的單播地址相同。發(fā)送到子網(wǎng)路由器任播地址的報(bào)文會(huì)被送到子網(wǎng)中的一個(gè)路由器。所有路由器都必須支持子網(wǎng)任播地址。
子網(wǎng)路由器任播地址用于節(jié)點(diǎn)需要和遠(yuǎn)端子網(wǎng)上所有路由器中的一個(gè)(不關(guān)心具體是哪一個(gè))通信時(shí)使用。例如,一個(gè)移動(dòng)節(jié)點(diǎn)需要和它的“家鄉(xiāng)”子網(wǎng)上的所有移動(dòng)代理中的一個(gè)進(jìn)行通信。
任播地址具有以下限制:
任播地址不得用作IPv6 數(shù)據(jù)包的源地址;
任播地址不得分配給IPv6 主機(jī),但是可以分配給IPv6 路由器。
6、IPv6多播地址
一對(duì)多模式。
IPv6多播地址用來標(biāo)識(shí)一組接口,一般這些接口屬于不同的節(jié)點(diǎn)。一個(gè)節(jié)點(diǎn)可能屬于0到多個(gè)多播組。發(fā)往多播地址的報(bào)文被多播地址標(biāo)識(shí)的所有接口接收。
1)IPv6多播地址格式定義:
FF00::/8

其中:
① 11111111:8比特。標(biāo)識(shí)此地址為多播地址
② Flags:4比特。flag域中定義如下:

最高的3比特標(biāo)記為保留域,必須為0
T = 0表示為永久分配(“公認(rèn)”)多播地址(由IANA分配);
T = 1表示為多播,表示用戶可使用的臨時(shí)多播地址
③ Scope:4比特。用來標(biāo)記此多播組的應(yīng)用范圍。

④ group ID
標(biāo)識(shí)多播組(可能是永久的,也可能是臨時(shí)的,范圍由scope定義)
2) IPv6永久分配的多播地址
目前的永久分配(“周知”)多播組如下:
保留的多播地址:
FF00::---FF0F::(共16個(gè)地址)
所有節(jié)點(diǎn)的地址:
FF01:0:0:0:0:0:0:1 (節(jié)點(diǎn)本地)
FF02:0:0:0:0:0:0:1 (鏈路本地,在本地鏈路范圍內(nèi)的所有節(jié)點(diǎn))
所有路由器地址:
FF01:0:0:0:0:0:0:2 (節(jié)點(diǎn)本地)
FF02:0:0:0:0:0:0:2 (鏈路本地,在本地鏈路范圍內(nèi)的所有路由器)
FF05:0:0:0:0:0:0:2 (站點(diǎn)本地)
被請(qǐng)求節(jié)點(diǎn)的地址:
FF02:0:0:0:0:1:FFXX:XXXX/104
上述地址由被請(qǐng)求節(jié)點(diǎn)的單播或任播地址形成:取被請(qǐng)求節(jié)點(diǎn)單播或泛播地址的低24比特,在前面增加前綴FF02:0:0:0:0:1:FF00::/104構(gòu)成。
對(duì)于節(jié)點(diǎn)或路由器的接口上配置的每個(gè)單播地址或者任播地址,都會(huì)自動(dòng)生成一個(gè)對(duì)應(yīng)的被請(qǐng)求節(jié)點(diǎn)的組播地址。只在本地鏈路范圍有效。
特點(diǎn):
① 在本地鏈路上,被請(qǐng)求的節(jié)點(diǎn)的組播地址通常只包含一個(gè)用戶
② 只要知道一個(gè)節(jié)點(diǎn)的IPV6地址,就能計(jì)算出它的被請(qǐng)求節(jié)點(diǎn)的組播地址,例如,和IPv6地址4037::01:800:200E:8C6C對(duì)應(yīng)的被請(qǐng)求節(jié)點(diǎn)多播地址是FF02::1:FF0E:8C6C。
作用:
① 在IPV6中沒有ARP,ICMP替代了ARP的功能,被請(qǐng)求節(jié)點(diǎn)的組播地址用IPv6鄰居發(fā)現(xiàn)協(xié)議中,用在鄰居請(qǐng)求報(bào)文中,由于只有后24比特單播地址相同的節(jié)點(diǎn)才會(huì)接收目的地址為此地址的報(bào)文,因此減少了通信流量(和IPv4 ARP相比)。
② 用于重復(fù)地址檢測(cè)(DAD:Duplicate address Detection),無狀態(tài)配置時(shí),節(jié)點(diǎn)利用DAD驗(yàn)證在其本地鏈路此地址是否被使用。

7、必須支持的Ipv6地址
1) 節(jié)點(diǎn)必須支持的IPv6地址
• 每個(gè)主機(jī)必須把下列地址作為自身的地址
• 自身接口的鏈路本地地址
• 分配的單播地址
• 環(huán)回地址
• 所有節(jié)點(diǎn)多播地址
• 每個(gè)分配的單播或多播地址對(duì)應(yīng)的被請(qǐng)求節(jié)點(diǎn)多播地址
• 此主機(jī)所屬的其它多播組地址
2) 路由器必須支持的IPv6地址
• 接口配置為路由器接口的子網(wǎng)路由器泛播地址
• 任何其它路由器配置的泛播地址
• 所有路由器多播地址
• 此路由器所屬的其它多播組地址
二、IPv6地址分配
1、地址配置
IPv6支持無狀態(tài)地址自動(dòng)配置和狀態(tài)地址自動(dòng)配置兩種地址自動(dòng)配置方式。
無狀態(tài)地址自動(dòng)配置:
無狀態(tài)自動(dòng)配置不需要手動(dòng)配置主機(jī),只需對(duì)路由器進(jìn)行很少的配置(如果需要的話),而且不需要其他服務(wù)器。無狀態(tài)機(jī)制允許主機(jī)生成其本身的地址。無狀態(tài)機(jī)制使用本地信息以及由路由器通告的非本地信息來生成地址。
需要配置地址的網(wǎng)絡(luò)接口先使用鄰居發(fā)現(xiàn)機(jī)制獲得一個(gè)鏈路本地地址。網(wǎng)絡(luò)接口得到這個(gè)鏈路本地地址之后,再接收路由器宣告的地址前綴,結(jié)合接口標(biāo)識(shí)得到一個(gè)全球地址。IPv6節(jié)點(diǎn)通過地址自動(dòng)配置得到IPv6地址和網(wǎng)關(guān)地址。
在自動(dòng)配置過程中,主機(jī)將執(zhí)行以下操作:
① 為每個(gè)接口創(chuàng)建鏈路本地地址,該操作不要求鏈路上有路由器。
② 檢驗(yàn)地址在鏈路上是否唯一,該操作不要求鏈路上有路由器。
③ 確定全局地址是應(yīng)通過無狀態(tài)機(jī)制、有狀態(tài)機(jī)制還是這兩種機(jī)制來獲取。(要求鏈路上有路由器。)
狀態(tài)地址自動(dòng)配置:如動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP),需要一個(gè)DHCP服務(wù)器,通過客戶機(jī)/服務(wù)器模式從DHCP服務(wù)器處得到地址配置的信息。
2、地址分配
① 全球單播地址空間分配
因特網(wǎng)分配地址權(quán)威機(jī)構(gòu)(IANA)負(fù)責(zé)IPv6地址空間的分配。目前IANA從整個(gè)可聚合全球單播地址空間(格式前綴為001)中取2001::/16進(jìn)行分配。
② IPv6實(shí)驗(yàn)網(wǎng)絡(luò)地址分配(6BONE)
6BONE網(wǎng)絡(luò)是全球范圍的IPv6實(shí)驗(yàn)網(wǎng)絡(luò),使用網(wǎng)絡(luò)前綴3ffe:0000::/16。每個(gè)偽頂級(jí)聚合分配3ffe:0800::/28范圍內(nèi)的/28前綴,最多支持2048個(gè)偽頂級(jí)聚合。處于末端的站點(diǎn)從上游提供者得到/48前綴,每個(gè)站點(diǎn)內(nèi)還可細(xì)分為多個(gè)/64前綴。
6BONE網(wǎng)絡(luò)按層次化結(jié)構(gòu)分配地址,地址空間由IANA定義配,分配策略在RFC2921(6BONE偽頂級(jí)聚合和網(wǎng)絡(luò)層聚合格式)中定義。
三、IPv6的使用
1) 首先啟用ipv6,方法如下:
本地測(cè)試使用windows環(huán)境。

或者命令行形式:ipv6 install
XP系統(tǒng)下可以使用netsh-->interface-->ipv6-->install來安裝ipv6協(xié)議。
也可以如下圖所示,協(xié)議部分添加,后邊會(huì)有ipv6的安裝。

啟用ipv6后,主機(jī)就會(huì)自動(dòng)生成一個(gè)ipv6鏈路本地地址。
2) 也可以手動(dòng)配置ipv6地址
可以使用界面配置:

也可以命令行配置:
cmd
netsh
i ipv6
show i 記住 本地連接 中的索引值
add address int=索引值 ipv6地址
show address int=索引值
3) ipv6地址查看
ipconfig

查看時(shí)會(huì)發(fā)現(xiàn)有隧道地址如下:

Ipv6和ipv4通過隧道通訊,是要有特別的協(xié)議和設(shè)備來支持,比如上圖的teredo,這個(gè)有機(jī)會(huì)下一篇案例再介紹。
啟用teredo就會(huì)有teredo的隧道地址,一般用來和外部主機(jī)對(duì)通。本地測(cè)試使用本地鏈路地址或者手動(dòng)配置的地址就可以了。
注:一般鏈路本地自動(dòng)生成是根據(jù)MAC地址使用EUI-64格式作為接口ID,但是我電腦上的卻不是,查看其他幾個(gè)電腦的就是根據(jù)MAC生成的,像是使用隨機(jī)碼生成方式,只要地址在鏈路內(nèi)唯一就可以。
4) 關(guān)于ipv6的幾個(gè)點(diǎn)簡(jiǎn)介
① PfcNtop 和 PfcPton
PFC模塊提供的PfcNtop、 PfcPton封裝了inet_ntop和 inet_pton的功能,主要用來做ip地址和其字符串表示形式的轉(zhuǎn)換。
② 結(jié)構(gòu)體PFC_IPADDR
typedef struct PROTO_API tagPFC_IPADDR
{
PFC_TRANSPORT_TYPE m_emType; ///< transport type
PFC_IPADDR_UNION m_tAddr; ///< IP address
u16 m_wPort; ///< port number, host format
PFC_DISTRIBUTION_TYPE m_emDistribution;
}
協(xié)議組件提供的用來表示ipv4 or ipv6的結(jié)構(gòu)體。
m_emType指示是ipv4還是ipv6,默認(rèn)值是無效值none。
m_tAddr是union類型,表示ipv4 oripv6的具體ip地址。其中ipv6的具體表示如下:
/// PFC IPv6 address
typedef struct
{
u8 m_abyIP[PFC_IPV6_ADDR_SIZE]; ///< 16 byte IP address
u16 m_wScopeId; ///< scope
} PFC_IPADDRv6;
PFC_IPV6_ADDR_SIZE 為16個(gè)字節(jié)的宏。所以ipv6地址使用16個(gè)字節(jié)的u8數(shù)組表示。m_wScopeId主要是給鏈路本地地址使用,因?yàn)殒溌繁镜氐刂吩谝粋€(gè)鏈路上唯一,而一個(gè)主機(jī)可以使用相同的鏈路本地地址接入兩個(gè)不同的鏈路,那么就要用scopeid來區(qū)分。此字段對(duì)應(yīng)sockaddr_in6結(jié)構(gòu)體里的uint32_t sin6_scope_id。經(jīng)測(cè)試,如果系統(tǒng)只有一個(gè)鏈路本地地址,win7、win10不用填此字段對(duì)通鏈路上的機(jī)器也沒有問題,但是和xp系統(tǒng)的對(duì)通就有問題。
③ getaddrinfo函數(shù)
獲取ip地址,gethostbyname和gethostbyaddr這兩個(gè)函數(shù)僅僅支持IPv4,getaddrinfo可以支持ipv4和ipv6,返回的是一個(gè)sockaddr結(jié)構(gòu)的鏈表而不是一個(gè)地址清單。這個(gè)方法,協(xié)議組件暫未提供封裝,有需求自己歡快使用吧。
最后
IPv6涉及的東西特別多,有些概念上的東西有時(shí)很不容易理解,必須查資料啊查資料然后理解它們。本篇只根據(jù)rfc4291 介紹了IPv6的部分內(nèi)容,以后還需要查閱更多的資料IPv6的其他方面的內(nèi)容。