IPV4与IPV6的互操作

概述

未来数年内,因特网肯定会从IPV4过渡到IPV6,在这个过渡阶段,基于IPV4的现有应用程序应该能够和基于IPV6的全新应用程序协同工作。也就是说,使用IPV6/IPV4的客户端可以和使用IPV4/IPV6的服务器通信。这也就意味着这些主机都运行着双栈,即一个IPV4协议栈和一个IPV6协议栈。

IPV4客户与IPV6服务器

双栈主机的一个特性是其上的服务器既可以处理IPV4客户,也可以处理IPV6客户。基本技术是通过使用IPV4映射的IPV6地址实现

现假设客户与服务器处于同一个以太网上。IPV4客户主机在一个IPV4数据报中载送SYN,IPV6客户主机在一个IPV6数据报中载送SYN。接收数据链路通过查看以太网类型字段把每个帧传送给相应的IP模块。IPV4模块结合其上的TCP模块检测到IPV4数据报的目的端口对应一个IPV6套接字,于是把数据报IPV4首部中的源IPV4地址转换为等价的IPV4映射的IPV6地址。当accept系统调用把这个已经接受的IPV4客户连接返回给服务器进程时,这个映射后的地址将作为客户的IPV6地址返回到服务器的IPV6套接字。该连接上其余的数据报同样都是IPV4数据报。
对于IPV6数据报不需要做任何改动直接返回给应用进程。

总结下IPv4客户与IPv6服务器通信的步骤:

  1. IPv6服务器启动后创建一个IPv6的监听套接字,假定服务器把捆绑地址绑定到该套接字。
  2. IPv4客户调用gethostbyname找到服务器主机的一个A记录。(服务器主机既有一个A记录,也有一个AAAA记录,因为它同时支持IPv4和IPv6)。
  3. 客户调用connect发送一个IPv4 SYN到服务器主机。
  4. 服务器主机接收这个目的地为IPv6监听套接字的IPv4 SYN/ACK,设置一个标志指示本连接应使用IPv4映射的IPv6地址,然后响应一个IPv4 SYN/ACK。该连接建立后,由accept返回给服务器的地址就是这个IPv4映射的IPv6地址。
  5. 当服务器主机往这个IPv4映射的IPv6地址发送TCP分节时,其IP栈产生目的地址为所映射IPv4地址的IPv4载送数据报。因此,客户和服务器之间的所有通信都使用IPv4载送数据报。
  6. 除非服务器显式的检查这个IPv6地址是不是一个IPv4映射的IPv6地址,否则它永远不知道在和一个IPv4客户通信。同样客户也不知道它在和一个IPv6服务器通信。


一般来说,任何一个IPv4地址都可以表示成一个IPv6地址,但是一个IPv6地址不可以表示成一个IPv4地址。

大多数双栈协议的主机都使用以下规则:

  1. IPv4监听套接字只能接受来自IPv4客户的外来连接
  2. 如果服务器绑定了通配地址的IPv6监听套接字,而且套接字未设置IPV6_V6ONLY选项,那么该套接字即可以接受来自IPv4的客户的外来连接,也能接受来自IPv6的客户的外来连接 。
  3. 如果服务器有一个IPv6监听套接字,而且绑定在其上的是除IPv4映射的IPv6地址之外的某个非通配IPv6地址,或者绑定在其上的是通配地址,不过设置了IPV6_V6ONLY套接字选项,那么该套接字只能接受来自IPv6的客户的外来连接。

IPv6客户与IPv4服务器

  1. 一个IPv4服务器在只支持IPv4的一个主机上启动后创建一个IPv4的监听套接字 。
  2. IPv6客户启动后调用getaddrinfo单纯的查找IPv6地址。既然只支持IPv4的那个服务器主机只有A记录,则客户收到的是IPv4映射的IPv6地址。
  3. IPv6客户在作为函数参数的IPv6套接字地址结构中设置这个IPv4映射的IPv6地址后调用connect,内核检测到这个映射地址后自动发送一个IPv4 SYN到服务器 。
  4. 服务器响应一个IPv4 SYN/ACK,于是通过使用IPv4数据报建立连接 。



总结下:
IPv4客户与IPv6服务器通信
IPv4客户通过找到服务器的一个A记录,调用connect发送一个IPv4的SYN到服务器主机,服务器主机接受这个IPv4的SYN,设置标志指示本连接应使用IPv4映射的IPv6地址,然后响应一个IPv4的ACK,由accept返回给服务器应用进程的是这个IPv4映射的IPv6地址。服务器向这个IPv4映射的IPv6地址发送TCP分节时,其IP栈产生目的地址为所映射IPv4地址的IPv4载送数据报 。于是通过IPv4数据报建立连接。

IPv6客户与IPv4服务器通信
IPv6客户通过查找服务器主机的IPv6地址,返回的是服务器主机IPv4映射的IPv6地址,客户将该映射的IPv6地址填入connect发起连接,内核检测到该映射地址后自动发送一个IPv4 SYN到服务器 。服务器响应IPv4的 SYN和ACK。连接于是通过IPv4数据报建立。


参考资料:
《UNIX网络编程 3th 卷一》(UNP)