您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于IPv6技术的网络通信的实现
基于IPv6技术的网络通信的实现[日期:2006-05-23]来源:作者:[字体:大中小]钟华汪治国摘要本文阐述了IPv6技术之发展现状和技术原理,并给出了基于WindowsXP操作平台下VC实现IPv6网络通信的实例。关键词IPv6、IPv4、SOCKET、UDP1引言与互联网发展进程中涌现出的其他技术概念相比,IPv6遇到的争议可以说是最少的,人们早已形成共识,那就是IPv6最终取代IPv4是大势所趋。几乎无限的地址容量当然是接纳IPv6最根本的理由。IPv4的32位地址方案最多可以容纳43亿潜在的网络地址,早期的地址分配又非常浪费,导致地址使用效率低下。而随着互联网应用类型日趋复杂,终端形式特别是移动终端更加多样化,全球独立IP地址的提供必将面临沉重的压力。根据IETF的估计,基于IPv4的地址资源将会在2005年枯竭,而IPv6的128位地址格式可以支持的IP地址数量为10亿的平方,这足以为地球上的每粒沙子都分配一个地址,从而彻底解决地址枯竭的问题。2IPv6的基本原理2.1IPv6数据报如表1所示。一个IPv6数据报开始于一个基本头部(baseheader),后跟零个或多个扩展头部,后跟数据。表1IPv6数据报2.2IPv6基本头部格式表2IPv6基本头部格式2.3IPv6与IPv4的比较(1)版本字段标识符仍被保留,在IPv6中,该字段的值为6。(2)IPv4报头长度字段被取消,IPv4中的总长度字段被IPv6中的有效负荷长度字段代替。有效负荷长度字段定义的只是数据(而不是报头)字段的长度。(3)IPv4中的服务类型(TOS)字段在IPv6中被删去,TOS字段中的部分内容和功能放在了IPv6中的优先级字段和流标号字段中。(4)IPv4中的标识符、标志、分段偏移量字段被删占,类似的功能被放入IPv6中的可选择的扩展报头中。(5)IP协议字段被删去,它的功能保留在另一个扩展报头中。(6)IPv4中的生存时间(TTL)字段在IPv6中命名为站点限制字段。在IPv6中该字段的名字更加准确.因为IPv6用它累计IP数据报传输经过的地点数。(7)报头校验和字段在IPv6中被删去。这一举动表明当今正在使用的大量通信系统在更低层执行差错检查,这就意味着被封装的IP数据报本来就会被执行差错检测。(8)IPv4中的选项字段没有太大的用处,而实现起来却很可怕,在一些情况下,因为该字段要求执行IP软件中的一些特殊的例程而使选项字段内容的处理产生了相当大的开销。它被IPv6的扩展报头所代替。3IPv6网络环境的配置目前我们所用的IP协议是v4版本的,比如192.168.0.1。它是在1981年由RFC791标准化的。而ipv6是IP协议的新版本,标准化工作始于1991年,主要部分在1996年完成。它的地址长度为128位。比如fe80::20a:ebff:fe24:39c1。要进行IPv6编程,我们首先要自己搭建一个IPv6的实验环境。在这里我将简单介绍windows平台的配置方法。由于只是讲解一下实验环境的搭建,所以其他的细节将不做详细说明。3.1在window2K下安装MicrosoftIPv6TechnologyPreviewforWindows2000(1)下载tpipv6-001205-SP3-IE6。可以从下载,也可从微软官方下载。(2)在tpipv6-001205-SP3-IE6\setup目录下双击hotfix.exe。(3)重启后在控制面板-网络和拨号连接-本地连接-右键打开属性对话框-安装-协议-添加ipv6协议。3.2在windowsXP下安装ipv6XP本身已经自带IPv6的功能了,所以不需要另外安装。只不过默认是不启用的。如果要启用Xp下的ipv6只要在命令行方式下输入ipv6install就行了。同win2k一样启用/关闭IPv6功能是netstarttcpip6和netstoptcpip6。4IPv6通信实现4.1IPv6下的API函数IPv4使用32bits的地址表示,并有sockaddr_in和in_addr等结构应用于API中,而IPv6使用128bits地址,也定义了本身的地址结构sockaddr_in6和in6_addr。IPv4专用函数在IPv6环境下已经不能使用,他们一般有一个对应的IPv4/v6通用函数,但是在使用通用函数的时候需要一个协议类型参数(AF_INET/AF_INET6)。另外还增加了两个功能强大的函数getaddrinfo()和getnameinfo(),几乎可以完成所有的地址和名字转化的功能。4.2WindowsXP平台下的IPv6程序本程序在WindowsXP操作平台,VisualC++6.0编译环境下调试通过1)要待加入的头文件#includewinsock2.h#includews2tcpip.h#includetpipv6.h//可以从tpipv6-001205-SP3-IE6安装后所在目录里找到#pragmacomment(lib,ws2_32)//引入库函数2)建立IPv6SOCKETvoidCIPv6Dlg::OnCreateSocket(){intret;UpdateData(TRUE);memset(&addrinfo_hints,0,sizeof(addrinfo_hints));addrinfo_hints.ai_family=AF_INET6;addrinfo_hints.ai_socktype=SOCK_DGRAM;addrinfo_hints.ai_protocol=IPPROTO_UDP;addrinfo_hints.ai_flags=AI_NUMERICHOST;ret=getaddrinfo(m_strLocalAddr,2000,&addrinfo_addrinfo_hints,&addrinfo_res);//解析本机IPv6地址if(ret!=0){AfxMessageBox(解析本机IPv6地址失败);return;}//建立基于IPv6的UDP套接字s=socket(AF_INET6,SOCK_DGRAM,IPPROTO_UDP);if(s==INVALID_SOCKET){AfxMessageBox(建立SOCKET失败);return;}else{AfxMessageBox(建立SOCKET成功);ret=bind(s,addrinfo_res-ai_addr,addrinfo_res-ai_addrlen);//绑定监听端口if(ret==SOCKET_ERROR){AfxMessageBox(绑定SOCKET失败);return;}else{AfxMessageBox(绑定SOCKET成功);m_ctlCreateSocket.EnableWindow(FALSE);m_ctlCloseSocket.EnableWindow(TRUE);m_ctlSendMessage.EnableWindow(TRUE);}}DWORDThreadID;Flag=true;//监听线程启动标记//创建监听通信端口的线程CreateThread(NULL,0,RecvProc,this,0,&ThreadID);}3)多线程监听通信端口DWORDCALLBACKRecvProc(void*pWnd){CIPv6Dlg&dlg=*(CIPv6Dlg*)pWnd;intRecvLen;//接受字节数charRecvBuff[BuffSize+1];//接受缓冲区sockaddr_in6sa;//IPv6地址结构intAddrLen;//地址长度CStringstrMessage;AddrLen=sizeof(sa);ZeroMemory(&sa,sizeof(sa));while(Flag){RecvLen=recv(s,RecvBuff,BuffSize,0);//由于recvfrom不正常,这里改recvif(RecvLen0)//接受到数据{RecvBuff[RecvLen]='\0';strMessage.Format(Received:%s,RecvBuff);dlg.m_ctlMessageList.SendMessage(LB_INSERTSTRING,-1,WPARAM((LPCTSTR)strMessage));}}return1;}4)发送信息voidCIPv6Dlg::OnSendMessage(){intret;UpdateData(TRUE);memset(&addrinfo_addrinfo_hints,0,sizeof(addrinfo_addrinfo_hints));addrinfo_addrinfo_hints.ai_family=AF_INET6;addrinfo_addrinfo_hints.ai_socktype=SOCK_DGRAM;addrinfo_addrinfo_hints.ai_protocol=IPPROTO_UDP;addrinfo_addrinfo_hints.ai_flags=AI_NUMERICHOST;//解析远程接受主机IPv6地址ret=getaddrinfo(m_strRemoteAddr,2000,&addrinfo_hints,&addrinfo_res);if(ret!=0){AfxMessageBox(解析远程IPv6地址失败);return;}else{sendto(s,m_strMessage,m_strMessage.GetLength(),0,addrinfo_res-ai_addr,addrinfo_res-ai_addrlen);//发送信息}}注:由于这只是在一台电脑上进行的实验,故发送接受方的地址均为本机回环地址(::1),此外,发送接受方的地址栏还可填为计算机名。例如,本人电脑名为stanley,故两个地址栏可写为stanley。如果有多台支持IPv6协议的电脑连接在IPv6网络,则可以接受其他IPv6地址。套接字的端口号默认为2000,也可以由用户自行设置。实际的运行效果图如图1:图1IPv6测试对话框5总结IPv6是当今互联网络出现的一项新技术,其取代现在大行其道的IPv4技术是一种必然趋势。由于本文提供的IPv6程序还是处于实验环境,离实际应用还有段距离。【参考文献】[1]PeteLdshinIPv6ClearlyExplained2000-4-1[2]W.RichardStevensTCP/IP详解卷2:实现机械工业出版社,2000[3]UylessBlackTCP/IP及相关协议机械工业出版社
本文标题:基于IPv6技术的网络通信的实现
链接地址:https://www.777doc.com/doc-2570045 .html