题目:IPv6下WinSock网络编程的研究和实现郭静盈2008年1月9内容提要研究意义海内外的研究现状及分析IPv6相对于IPv4WinSock的改变IPv6下Daytime协议的研究与实现IPV4的现状目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中的网络层协议,是TCP/IP协议族的核心协议。目前IP协议的版本号是4(简称为IPv4)。IPV4技术,核心技术属于美国。它的最大问题是网络地址资源有限,从理论上讲,IPv4中规定IP地址长度为32,即有2^32-1个地址,有43亿个,其中北美占有3/4,约30亿个,而人口最多的亚洲只有不到4亿个,中国只有3千多万个,只相当于美国麻省理工学院的数量。近年来,随着Internet呈指数级的飞速发展,网民数量越来越多,导致IP地址变得越来越珍稀,IPv4地址空间几近耗竭。另外,随着Internet主干网路由器维护大型路由表能力的增强,地址配置趋向于更简单化的要求,IP层安全需求的增长,更好的实时QoS支持等需求,IPv4也越来越不能满足这些要求了。IPv4的不足地址空间问题。路由选择问题。Qos问题。地址分配不便,网络管理变得越来越复杂问题。安全性问题。移动支持问题。二、IPv6的出现为了解决上述问题,Internet工程任务组(IETF)开发了IPv6,即第六版网间协议。这一新版本,也曾被称为下一代IP。IPv6采用了长度为128位的IP地址,其网络地址可以达到2的128次方个,彻底解决了IPv4地址不足的难题。IPv6的地址格式与IPv4不同。目前的IPV4地址表现形式采用的是点分十进制形式。IPv6地址的基本表达方式是X:X:X:X:X:X:X:X,由8个地址节组成,其中每个地址节X是一个4位十六进制整数,每个整数包含4个数字,每一个数字包含4个地址位,所以每个地址节X共包含16个地址位,8个地址节X组成,所以共计128位(4×4×8=128)。例如,下面是一些合法的IPv6地址:CDCD:901A:2222:5498:8475:1111:3900:20201030:0:0:0:C9B4:FF12:48AA:1A2B2000:0:0:0:0:0:0:1IPv6地址用冒号分隔字(每个字用4位十六进制数表示)法表示,特殊情况下,还有用符号“::”简化连续0法表示和与IPv4混合法表示形式。例如:2008:0:0:0:0:88:0:0:417A、2008::88:0:0:417A、2008::FF:211.70.251.169等都是IPv6地址的合法表示。注意:每个地址中只能出现一次“::”符号,故又称一次简化表示法。IPV6不同和改进地址空间数据报头的格式对Qos(服务质量)的支持安全性特征邻居发现和即插即用对移动的支持三、IPv6特性新包头格式更大的地址空间高效的层次寻址及路由结构全状态和无状态地址配置内置安全设施更好的QoS支持用于邻节点交互的新协议可扩展性四、IPv6的应用1.3G业务2.个人智能终端3.家庭网络4.在线游戏向IPv6的过渡技术双栈模式隧道技术IPv6封装在IPv4内IPv6报头传输层报头数据IPv6报头传输层报头数据IPv4报头五、IPv4向IPv6的过渡尽管IPv6比IPv4具有明显的先进性,但是IETF认识到,要想在短时间内将Internet和各个企业网络中的所有系统全部从IPv4升级到IPv6是不可能的,换言之,IPv6与IPv4系统在Internet中长期共存是不可避免的现实。为此,做为IPv6研究工作的一个部分,IETF制定了推动IPv4向IPv6过渡的方案,其中包括三个机制:1、兼容IPv4的IPv6地址2、双IP协议栈3、基于IPv4隧道的IPv6。六、IPv6的前景据预测,到2005年中国的互联网用户将达到2亿人,在数量上将达到世界第一位。就算全部互联网用户不都是永远在线,IP地址的不足在三四年后也将被耗尽。IPv4地址枯竭后,才进行IPv6地址的分配和IPv6的网络构建是来不及的,应该在IPv4地址枯竭前逐步引进IPv6,经过IPv6与IPv4的共存时代,最终全面过渡到IPv6。美国拥有全世界约70%的IP地址(大约每人10个IP地址),他们几乎感觉不到地址空间少带来的压力,因此,在IPv6推出之后的几年中,他们对新标准的态度不是很积极。但是最近美国人对IPv6的态度发生了一些细微的变化,美国国防部也在积极测试IPv6,并宣布替换现有的IPv4网络。在欧洲,由于IPv4地址相对匮乏,政府和各大公司对IPv6的态度都比较积极。同时由于欧洲在IPv4的网络经济中落后于美国,而欧洲移动通信事业相对发达,他们希望在移动通信领域中掌握先机,并通过3G的部署来实现他们在未来的网络经济中与美国并驾齐驱的愿望。为了抓住这一发展的契机,欧洲的各大厂商和运营商都对IPv6寄予了厚望并竭尽全力对它进行推广和研究,如诺基亚、爱立信、英国电信等公司一直都是IPv6研究方向的主要引导者。亚太的地址空间更加匮乏,包括中国在内的很多国家对IPv6保有积极的态度。所以无论从地址耗尽的角度考虑还是从全球发展的角度考虑,IPv6在中国具备很大的发展空间。可以说,IPv6已经成为数据通信产业一个璀璨的技术亮点。SOCKET开发(1)建立的SOCKET类型不同:对于IPv4创建SOCKET套接字调用为socket(AF_INET,SOCK_XX,0);对于IPv6调用为SOCKET(AF_INET6,SOCK_XX,0);这里的XX指TCP或UDP等。(2)网络API函数中的地址结构不同:对于IPv4的sockaddr_in,socketaddr_in.sin_family=AF_INET,sockaddr_in.sin_port=port。socketaddr_in.sin_addr为32位地址;对于IPv6的sockaddr6_in,socketaddr6_in.sin_family=AF_INET,sockaddr6_in.sin_port=port。Socketaddr6_in.sin_addr为128位地址。1IPv4和IPv6编程接口的区别Ipv4Sockets与IPv6Sockets编程接口的差异根据RFC2553和RFC3494,编程接口的差异主要体现在地址结构、地址转换函数、域名解析函数等方面。2.1IPV6中新增加的常量为了支持IPv6,需要定义一个新的地址族名,以正确地识别和解析IPv6的地址结构。同样,还需要定义一个新的协议族名(与地址族名具有相同的值),这样就可以使用合适的协议来创建一个套接字。新定义的IPv6地址族名和协议族名常量为:AF_INET6和PF_INET61.1网络地址结构不同套接字(socket)定义了一个协议专用的数据结构,这一数据结构用于保存一个套接字地址的各个组成部分。对于IPv协议,此结构为sockaddr_in。IPv4地址用一个32位整数来表示,应用程序通过sockaddr_in结构来指定IPv4地址和端口信息.sockaddr_in结构的定义:structsockaddr_in{shortsin_family;/*IP地址族,必须设为AF_INET*/unsignedshortsin_port;/*通信端口*/structin_addrsin_addr;/*以网络字节排序的4字节IPv4地址*/charsin_zero[8];/*填充项*/};IPv6和IPv4的最显著的区别是IPv6的地址是128位的,其大小是IPv4地址的4倍.指定IPv6地址和端口信息时使用sockaddr_in6结构:structsockaddr_in6{shortsin6_family;/*IP地址族,必须为AF_INET6*/u_shortsin6_port;/*端口号,和IPv4中意义相同*/u_longsin6_flowinfo;/*标记连接通信量*/structin6_addrsin6_addr;/*IPv6地址的16字节结构*/u_longsin6_scope_id;/*地址所在的接口索引(范围ID)*/}编程接口中主要的IPv6地址解析函数解析函数功能getipnodebyname()由名字获取IP地址structhostent*getipnodebyaddr()由IP地址获取名字getaddrinfo()解析获取全部地址信息getnameinfo()解析获取全部名字信息2.3.1编程接口中的IPv6地址结构#definePF_INET6AF_INET6structin6_addr{u_int8_ts6_addr[16];//128位的IPv6网络地址,网络字节顺序}structsockaddr_in6{u_charsin6_len;//地址长度u_charsin6_family;//地址域,Windows系统中仅为AF_INET6u_int16_tsin6_port;//端口号u_int32_tsin6_flowinfo;//地址流信息structin6_addrsin6_addr;//128位的IPv6网络地址u_int32_tsin6_scope_id;//地址接口识别号}2.2地址转换函数的差异IPv4通过下列函数完成文本表示的十进制点分地址和32bits的网络字节序地址之间的相互转换:intinet_aton(constchar*strptr,structin_addr*ad-drptr);in_addr_tinet_addr(constchar*strptr);char*inet_ntoa(structin_addrinaddr);IPv6通过下列函数完成文本表示的IPv6地址和128bits的网络字节序地址之间的相互转换:intinet_pton(intfamily,constchar*strptr,void*ad-drptr);constchar*inet_ntop(intfamily,constvoid*addrp-tr,char*strptr,size_tlen)在作程序移植或编制基于IPv6的程序时,函数inet_aton()或inet_addr()需要用函数inet_pton()来替换;函数inet_ntoa()需要用函数来inet_ntop()替换。2.3域名解析函数的差异IPv4通过下列函数完成主机名或域名到IPv4地址的解析:structhostent*gethostbyname(constchar*host-name);其中入口参数hostname为主机名或域名,函数返回的结果存放在structhostent中。IPv6特有的独立于协议之上的函数有两个:getad-drinfo()(由名字获得IP地址)和getnameinfo(()由IP地址获得名字),使用他们几乎可以得到所有有关主机的信息。getaddrinfo()的函数原型为:intgetaddrinfo(constchar*hostname,constchar*service,conststructaddition*hints,structaddrinfo**res)其中hostname可以是主机名地址或实际Ipv4或者IPv6地址,service可以是服务器名或十进制端口号,hints相当于一个过滤器,只有符合hints机构的内容才会返回到res指针中,当hints为空时,函数假定ai_flag,、ai_socktype和ai_protocol的值为零,ai_familly1.2创建socket时传入的参数不同IPv4调用socket函数创建套接字时,传入的参数是AF_INET.SOCKETs=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);/*TCP协议为例*/.IPv6创建套接字时,传入的参数是AF_INET6.SOCKETs=socket(AF_INET6,SOCK_STREAM,IPPRO