Zach的博客

IPv4与IPv6的户操作性

IPv4映射的IPv6地址

IPv4映射的IPv6地址允许在因特网向IPv6过度时期让运行在双栈主机上的IPv6应用进程能够与只支持IPv4的主机通信。这些地址是IPv6应用进程查询某个只有IPv4地址的主机的IPv6地址时,DNS解析器按需自动创建的且不存在于任何DNS
数据文件中。在IPv6套接字上使用这种类型的地址导致往目的地IPv4主机发送IPv4数据报。

下图展示了一个IPv4映射的IPv6地址的格式:

mapped.png

IPv4客户与IPv6服务器

双栈主机的一个特性就是其上的IPv6服务器既可以处理IPv4客户,也可以处理IPv6客户。这是通过IPv4映射的IPv6地址实现的。下图是一个例子:

ipv4to6.png

IPv4客户发送一个IPv4的SYN分节以期和服务器建立连接。来自IPv4客户的SYN分节在以太网中表现为一个以太网首部、一个IPv4首部、一个TCP部以及TCP数据。以太网首部中包含的类型字段为0x0800,表示它是一个IPv4帧数据。

接收数据链路通过查看以太网类型字段把每个帧数据发送给对应的IP模块。IPv4模块结合其上的TCP模块检测到IPv4数据报的目的段端口对应一个IPv4套接字,于是该数据报Ipv4首部中的源IPv4地址被转换成IPv4映射的IPv6地址,当
accept系统调用把这个已经接收的IPv4客户连接返回被服务器进程的时候,这个映射后的地址作为客户的IPv6地址返回到服务器的IPv6套接字。该连接上的其余数据同样都是IPv4数据报。服务器进程完全不知道它是在与一个IPv4客户机通信。

IPv6客户与IPv4服务器

在一个双栈主机上运行一个IPv6客户程序,其于一个IPv4服务器程序交互的流程如下:

  1. 一个IPv4服务器在只支持IPv4的一个主机上启动后创建一个IPv4监听套接字。
  2. IPv6客户启动后调用getaddrinfo单纯查找IPv6地址(请求AF_INET6地址,hints结构中设置了AI_V4MAPPED标志),最后只有得到只支持IPv4的服务器主机的A记录,那么返回给客户的就是IPv4映射之后的IPv6地址。
  3. IPv6客户设置这个IPv4映射后的IPv6地址,调用connect,内核检测到这个映射的地址后自动发送一个IPv4的SYN分节到服务器。
  4. 服务器响应一个IPv4 SYN/ACK分节,连接于是用IPv4数据报建立。

以后在以太网上传递的是IPv4数据报。