UNIX网络编程笔记(8)—IPv4和IPv6互操作

来源:互联网 发布:dnfdll源码 编辑:程序博客网 时间:2024/05/17 08:47

UNIX网络编程笔记(8)—IPv4和IPv6互操作

1.概述

本章说的互操作性,其实就是考虑四种情况的排列组合:

IPv4服务器 IPv6服务器 IPv4客户端 书中之前所有的例程 书中12.2节 IPv6客户端 书中12.3节 简单修改IPv4客户/服务程序

不过这里的客户端和服务器又牵涉了单栈和双栈,感觉都是概念性的东西,简单了解一蛤。


2.IPv4客户端和IPv6服务器

双协议栈,指的是在同一台设备上同时启用IPv4和IPv6协议,这样的话设备既能和IPv4通信又能和IPv6通信。一般情况,这事通过使用IPv4映射的IPv6地址实现的。

我们可以把允许一个IPv4的TCP客户和一个IPv6的TCP服务器进行通信的步骤总结如下:

(1)IPv6服务器启动后创建一个IPv6的监听套接字,并绑定通配地址。
(2)IPv4客户调用gethostbyname找到服务器的A记录(IPv4地址),当然服务器还有一个AAAA记录(IPv6地址),这里对于我们的IPv4地址来说只需要一个A记录。
(3)客户调用connect发起主动连接,这伴随着一个SYN分节发送到服务器主机。
(4)服务器接收到SYN分节,accept返回给服务器的地址就是IPv4映射的IPv6地址,并响应给客户端一个IPv4 SYN/ACK
(5)客户和服务器通信使用IPv4载送数据报。
(6)客户端不知道自己是与一个IPv6服务器通讯,服务器也不知道自己在与一个IPv4客户端通信。这些细节由双栈协议来处理。

大多数双栈主机在处理监听套接字时应该使用以下规则:

(1)IPv4监听套接字只能接收来自IPv4客户的外来连接。
(2)如果服务器有一个绑定了通配地址的Ipv6监听套接字,那么该套接字一般来说可以接收来自Ipv4客户的外来连接,又能接收来自Ipv6客户的外来连接。
在使用这些规则的时候,要注意一个重要的套接字选项IPv6_V6ONLY,顾名思义,这表明该套接字只能接收来自IPv6客户的外来连接。


3.IPv6客户端和IPv4服务器

运行在双栈下面的客户主机和只支持IPv4的服务器:

(1)服务器创建IPv4监听套接字
(2)客户查找IPv6地址,但IPv4服务器只有A记录,因此返回给客户一个IPv4映射的IPv6地址。
(3)客户使用返回的服务器映射的IPv6地址connect发起连接。内核检测到映射地址后将发送一个IPv4 SYN到服务器。
(4)服务器响应IPv4 SYC/ACK 并使用IPv4数据报建立连接。


4.小结

根据排列组合原理,给出了客户服务器各种组合,这里有一个重要的参考点:

不论调用connect还是调用sendto,IPv4客户不能指定一个IPv6地址,因为IPv6超出了IPv4的套接字结构的长度。

IPv4服务器单栈 IPv6服务器单栈 IPv4服务器双栈 IPv6服务器双栈 IPv4客户单栈 IPv4 (无) IPv4 IPv4 IPv6客户单栈 (无) IPv6 (无) IPv6 IPv4客户双栈 IPv4 (无) IPv4 IPv4 IPv6客户双栈 IPv4 IPv6 (无) IPv6

5.参考

1.http://blog.csdn.net/yusiguyuan/article/details/11856099
2.《UNP1 》

1 0