Linux網路程式設計之IPv6

2021-06-23 04:21:33 字數 4046 閱讀 5779

**

1.ipv6特點

我們已經學習過了流式套接字(sock_stream),資料報套接字(sock_dgram)和原始套接字(sock_rawm),其中原始套接字的功能十分強大,能夠傳送自定義的資料報,偵聽網路上的資料,拒絕服務攻擊,傳送icmp包等等。但這些協議都是基於ipv4,接下來,我們學習一下ipv6下的套接字程式設計. 下面介紹乙個ipv6協議。相對於ipv4,ipv6有如下一些顯著的優勢:

(1)位址容量大大擴充套件,由原來的32位擴充到128位,徹底解決ipv4位址不足的問題;支援分層位址結構,從而更易於定址;擴充套件支援組播和任意播位址,這使得資料報可以傳送給任何乙個或一組節點;

(2)大容量的位址空間能夠真正的實現無狀態位址自動配置,使ipv6終端能夠快速連線到網路上,無需人工配置,實現了真正的即插即用;

(3)報頭格式大大簡化,從而有效減少路由器或交換機對報頭的處理開銷,這對設計硬體報頭處理的路由器或交換機十分有利;

(4)加強了對擴充套件報頭和選項部分的支援,這除了讓**更為有效外,還對將來網路載入新的應用提供了充分的支援;

(5)流標籤的使用讓我們可以為資料報所屬型別提供個性化的網路服務,並有效保障相關業務的服務質量;

(6)認證與私密性:ipv6把ipsec作為必備協議,保證了網路層端到端通訊的完整性和機密性;

(7)ipv6在流動網路和實時通訊方面有很多改進。特別地,不像ipv4,ipv6具備強大的自動配置能力從而簡化了移動主機和區域網的系統管理。

2. ipv6位址型別

在rfc1884中指出了三種型別的ipv6位址,他們分別占用不同的位址空間:

* 單點傳送:這種型別的位址是單個介面的位址。傳送到乙個單點傳送位址的資訊包只會送到位址為這個位址的介面。

* 任意點傳送:這種型別的位址是一組介面的位址,傳送到乙個任意點傳送位址的資訊包只會傳送到這組位址中的乙個(根據路由距離的遠近來選擇)

* 多點傳送:這種型別的位址是一組介面的位址,傳送到乙個多點傳送位址的資訊包會傳送到屬於這個組的全部介面。

其中單播位址又包括:全域性可聚集的單播位址,站點本地位址和鏈路本地位址。

3  ipv6位址表示:

對於128位的ipv6位址,考慮到ipv6位址的長度是原來的四倍,rfc1884規定的標準語法建議把ipv6位址的128位(16個位元組)寫成8個16位的無符號整數,每個整數用四個十六進製制位表示,這些數之間用冒號(:)分開,例如:3ffe:3201:1401:1:280:c8ff:fe4d:db39

希望手工管理ipv6位址的難度太大了,dhcp和dns的必要性在這裡顯得更加明顯。為了簡化ipv6的位址表示,只要保證數值不變,就可以將前面的0省略。

比如:1080:0000:0000:0000:0008:0800:200c:417a

可以簡寫為:1080:0:0:0:8:800:200c:417a

另外,還規定可以用符號::表示一系列的0。那麼上面的位址又可以簡化為:1080::8:800:200c:417a

ipv6位址的字首(fp, format prefix)的表示和ipv4位址字首在cidr中的表示方法類似。比如 0020:0250:f002::/48表示乙個字首為48位的網路位址空間。 

注意: 0:0:0:0:0:0:0:1 稱為本地回環位址

ipv6沒有廣播,它的功能正在被多播代替.

4. ipv6位址分配

rfc1881規定,ipv6位址空間的管理必須符合internet團體的利益,必須是通過乙個中心權威機構來分配。目前這個權威機構就是iana(internet assigned numbersauthority,internet分配號碼權威機構)。 iana會根據iab(internet architectureboard)和iegs的建議來進行ipv6位址的分配。

目前iana已經委派以下三個地方組織來執行ipv6位址分配的任務:

* 歐洲的ripe-ncc(www.ripe.net)

* 北美的internic(www.internic.net)

* 亞太平洋地區的apnic(www.apnic.net)

5. ipv6位址結構

struct sockaddr_in6

struct in6_addr

in6addr_any表示本地任意位址.

6. ipv6客戶端與伺服器程式

伺服器:

#include

#include

#include

#include

#include

#include

#include

/**ipv6伺服器端與客戶端設計

ipv6的位址結構

struct sockaddr_in6

struct in6_addr

**/#define port 8888

#define backlog 10

int main(int argc,char*argv)

//繫結

bzero(&server_addr,sizeof(server_addr));

server_addr.sin6_family=af_inet6;

server_addr.sin6_port=htons(port);

server_addr.sin6_addr=in6addr_any;//ipv6任意位址

ret=bind(s,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(ret==-1)

//監聽

ret=listen(s,backlog);

if(ret==-1)

char buffer[1024];

//迴圈伺服器

while(1)

memset(buffer,0,1024);

inet_ntop(af_inet6,&client_addr.sin6_addr,buffer,sizeof(buffer));

printf("a client from ip:%s,port %d,socket %d\n",buffer,client_addr.sin6_port,sc);

memset(buffer,0,sizeof(buffer));

size=recv(sc,buffer,1024,0);

if(size>0&&!strncmp(buffer,"time",4))

close(sc);

}close(s);

}客戶端:

#include

#include

#include

#include

#include

#include

#include

#define port 8888

#define buffersize 1024

int main(int argc,char*argv)

//將位址結構繫結到套接字

bzero(&server_addr,sizeof(server_addr));

server_addr.sin6_family=af_inet6;

server_addr.sin6_port=htons(port);

server_addr.sin6_addr=in6addr_any;//任意位址

//連線

ret=connect(s,(struct sockaddr*)&server_addr,sizeof(server_addr));

//傳送請求

memset(buffer,0,sizeof(buffer));

strcpy(buffer,"time");

size=send(s,buffer,strlen(buffer),0);

if(size<=0)

bzero(buffer,sizeof(buffer));

size=recv(s,buffer,buffersize,0);

if(size>0)

close(s);//關閉套接字描述符

}執行結果:

./ipv6c

sun feb 19 20:21:31 2012

總結:本文主要介紹了ipv6特點以及與ipv4的不同點,最後給出了ipv6伺服器與客戶端的例項.

IPv6技術 什麼是IPv6

ipv6技術 1 引言 ipv4位址即將耗盡,因此需要移轉至ipv6的討論,過去數年來一直不曾中斷。ipv4和ipv6在報文結構 報文字段意義以及位址配置諸多方面都有顯著的不同,這給從ipv4到ipv6過渡時期internet的運作帶來了極大的困難。當前接入網技術上幾乎所有的應用都是構建在ipv4上...

ipv6高階網路配置

一 將desktop上的所有網絡卡刪除 nmcli connection add con name eth0 ifname westos type ethernet ip6 2017 20 48 vim etc sysconfig network scripts ifcfg westos syste...

Linux系統IPv6配置

1 自動獲取ipv6位址,修改 etc sysconfig network檔案,加入下列配置文字 networking ipv6 yes 然後,執行命令service network restart 用命令ifconfig a 檢視ipv6位址資訊 2 靜態ipv6位址裝置,修改 etc sysco...