IPv4与IPv6编程.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IPv4与IPv6编程

第7章 IPv4和IPv6编程 知识点: IPv4和IPv6服务器的工作原理 IPv6如何为IPv4客户端服务 IPv6地址测试宏与IPv6套接口选项 IPv4客户与IPv6服务器 拥有双重协议栈的主机的一个基本持性是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射的IPv6地址实现的。 IPv4 TCP客户与一个IPv6服务器之间讲行通信的步骤。 (1)启动IPv6服务器,创建一个IPv6的监听套接口,我们假定该套接口绑定了通配地址。 (2)IPv4客户调用gethostbyname找到一个与该服务器对应的A记录。因为这台服务器主机同时支持IPv4和IPv6,所以它应该既有一个A记录,又有一个AAAA记录,但IPv4的客户只需要一个A记录。 (3)客户进程调用connect,客户主机向服务器发送一个IPv4的SYN。 (4)服务器主机收到这个发往IPv6监听套接口的IPv4 SYN,置一个标志,表明这个连接使用IPv4映射的IPv6地址,然后响应一个IPv4的SYN/ACK。当这个连接建立后,accept返回给服务器的地址就是这个IPv4映射的IPv6地址。 (5)在客户和服务器之间的所有通信使用IPv4数据报。 (6)除非服务器明确地去检查这个IPv6地址是不是一个IPv4映射的IPv6地址(使用IN6_IS_ADDR_V4MAPPKD宏),它将不会知道通信的对方是一个IPv4客户。双重协议栈屏蔽了这个细节。同样,IPv4的客户也不知道与之通信的是一个IPv6的服务器。 对于一个IPv6的UDP服务器来说,情形是类似的,只需将每个数据报改变一次地址格式。例如一个IPv6服务器收到从IPv4客户发来的数据报,于是由recvfrom返回的地址将是该客户对IPv4映射的IPv6地址。同时服务器用这个映射的地址调用sendto对客户的请求作出响应。若是IPv6客户,则地址为IPv6地址,而不是映射后的地址。在此UDP服务器问题得到解决。 下面来看当一个双重协议栈主机接收到数据时的处理,根据接收套接口的类型(TCP或UDP)对一个收到的IPv4或IPv6 数据报进行如图7-2所示的处理。 IPv6客户与IPv4服务器 (1)如果IPv4的TCP客户调用connect时或IPv4的UDP客户调用sendto时指定的是一个IPv4地址,不需要作任何特殊处理。 (2)如果IPv6的TCP客户调用connect时或IPv6的UDP客户调用sendto时指定的是一个IPv6地址,不需要作任何特殊处理。 (3)如果IPv6的TCP客户调用connect时或IPv6的UDP客户调用sendto时指定的是一个IPv4映射的IPv6地址,内核会检测到这个映射地址,并发送一个IPv4数据报,而不是IPv6数据报。 (4)IPv4客户不能在调用connect或sendto时指定一个IPv6地址,因为在IPv4的sockaddr_in结构里的4字节的in_addr结构中放不下一个16字节的IPv6地址。 通过以上处理,也可以使IPv6客户与IPv4服务器通信,这就达到了从IPv4过渡到IPv6的目的。 IPv6_ADDRFORM套接口选项 为什么要学习IPv6_ADDRFORM套接口选项呢?这得从它的功能说起,IPv6_ADDRFORM套接口选项能把一个套接口从一种类型转变成另一种类型。那为什么要转变地址格式呢?目的是在UNIX上文件描述字可以在进程之间进行传递,而最通常传递的方式就是通过fork来实现。 假设进程创建了一个IPv4的监听套接口,然后接收到一个来自IPv4客户的连接。该服务器调用fork和exec,启动一个新程序处理客户请求。这个过程同以前介绍的并发服务器的唯一不同是将已连接套接口复制到事先约定的描述字,然后调用exec。但被加载的新程序期望一个这是IPv6套接口,而不是IPv4套接口,因此可以用IPv6_ADDBFORM套接口选项来转换该套接口的地址格式,如下: 1. int af; 2. socklen_t clilen; 3. struct sockaddr_in6 cli; /*IPv6 struct*/ 4. struct hostent *ptr; 5. af = AF_INET6; 6. Setsockopt(STDIN_FILENO,IPPROTO_IPV6,IPV6_ADDRFORM,af,sizeof(af)); ? 7. clilen = sizeof(cli); 8. Getpeername(0,cli,clilen); 如果用IPv6_ADDRFORM作参数来调用getsockopt,返回值依赖于套接口地址的格式,将为AF_INET或AF_IN

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档