网络编程之IPv4与IPv6相互操作

  由于互联网终端不断增加,IPv4 地址长度(32位)已不能够满足要求,所以出现了IPv6地址(128位),但是现有应用程序大部分还是采用 IPv4 地址形式,所以必须解决IPv4IPv6之间的相互操作,使现有基于 IPv4 的应用程序能够与基于 IPv6 的应用程序相互通信。那么我们怎么实现 IPv4 客户端与 IPv6服务器、IPv6 客户端与 IPv4 服务器之间的通信。

  假设我们主机是运行双栈,即存在 IPv4 协议栈和IPv6 协议栈,双栈主机上的 IPv6 服务器既能处理 IPv4 客户端,也能处理 IPv6 客户端,因为 IPv4 可以映射成 IPv6 地址。下图是 IPv4 客户端与 IPv6 服务器之间的通信过程:

  IPv6 服务器程序创建的套接字绑定到 IPv6 通配地址和 TCP 端口号 9999。假设客户端和服务器主机都处于同一个以太网,当左侧两个客户端都发送 SYN 报文段请求与服务器建立连接时,IPv4 客户端主机在一个 IPv4数据报中载送 SYN,IPv6 客户端主机在一个 IPv6 数据报中载送 SYN。在以太网线上包含以太网首部、IP 首部、TCP 首部以及 TCP 数据,根据以太网首部中包含的类型字段区分 IP 类型是为 IPv4 还是 IPv6,因此 IP 首部中的目的 IP 地址格式根据以太网类型字段分为 IPv4 地址和 IPv6 地址。两者的 TCP 首部是一样的,TCP 首部中包含目的端口号(即 IPv6 服务器的端口号 9999)。

  服务器的接收数据链路通过查看以太网类型字段把每帧传递给相应的 IP模块。IPv4 模块结合其上的 TCP 模块检测到 IPv4 数据报的目的端口对应的是一个 IPv6 套接字,于是把该数据报 IPv4 首部中的源 IPv4 地址转换成一个等价的 IPv4 映射的 IPv6 地址。当 accept 系统调用把这个已经接受的 IPv4 客户端连接返回给服务器进程时,这个映射后的地址将作为客户的 IPv6 地址返回给服务器的 IPv6 套接字(也就是说服务器根本不知道自己是在跟 IPv4 客户端通信,客户端也不知道自己和 IPv6 的服务器通信),该连接上其余的数据报都是 IPv4 数据报。对于 IPv6 客户端,当 accept 系统调用把接受的 IPv6 客户端连接返回给服务器进程时,该客户的 IPv6 地址就是原来 IPv6 首部中的源地址,不需要进行映射,该连接上其余的数据报都是 IPv6 数据报。

  首先启动 IPv6 服务器,创建一个 IPv6 的监听套接字,并且该服务器把通配地址和端口号 9999 绑定到该套接字上;

  IPv4 客户端调用 gethostbyname 函数找到服务器主机的一个 A 记录,服务器同时包含 A 记录和 AAAA 记录,即同时支持 IPv4 和 IPv6,对于 IPv4 客户端来说只需要 A 记录即可;

  IPv4 客户端调用 connect 函数向服务器发出连接请求,即客户端主机向服务器主机发送一个 IPv4 的 SYN 数据报(该 IPv4 的 SYN 中的目的地是 IPv6 套接字);

  服务器主机接收到来自客户端的 IPv4 的 SYN 数据报后,设置一个标志指示本连接应使用 IPv4 映射的 IPv6 地址,并响应一个 IPv4 的SYN 和 ACK 数据报。当该链接建立后,由 accept 函数把这个 IPv4 映射的 IPv6 地址返回给服务器;

  当服务器主机往这个 IPv4 映射的 IPv6 地址发送 TCP 报文段时,其 IP 栈产生目的地址为所映射 IPv4 地址的 IPv4 载送数据报。即客户端和服务器之间所有通信都使用 IPv4 的载送数据报;

  IPv6 客户端在作为函数参数的 IPv6 套接字地址结构中设置这个 IPv4 映射的 IPv6 地址后调用 connect 函数向服务器发出连接请求,内核检测到这个映射地址后,自动向服务器主机发送一个 IPv4 的 SYN 数据报;

  服务器主机接收到来自客户端的 IPv4 的 SYN 数据报后,响应一个 IPv4 的SYN 和 ACK 数据报。连接通过使用 IPv4 数据报建立;

  双栈主机上的 IPv6 服务器既能服务于 IPv4 客户,又能服务于 IPv6 客户。IPv4 客户发送给这种服务器的仍然是 IPv4 数据报,不过服务器的协议栈会把客户主机的地址转换成一个 IPv4 映射的 IPv6 地址。类似地,双栈主机上的 IPv6 客户能够与 IPv4 服务器通信,客户的解析器会把服务器主机所有的 A 记录作为 IPv4 映射的 IPv6 地址返回给客户,而客户指定这些地址之一调用 connect 将会使双栈发送一个 IPv4 的 SYN 数据报。为了使套接字编程具有可移植性,在编程实现过程中,尽量避免使用 gethostbyname 和 gethostbyaddr 函数,而应该使用 getaddrinfo 和 getnameinfo 函数。

  比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。

  比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!

  比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。

  比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。

  比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。

  比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。

  新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。

  比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。

  比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。

  IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。

  X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。

您可能还会对下面的文章感兴趣: