**
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...