UNP卷一chapter12 IPv4与IPv6的互操作性
以下知识点来均来自steven先生所著UNP卷一(version3),刚开始学习网络编程,如有不正确之处请大家多多指正。
1、双栈主机
既存在着IPv4协议栈,又存在着IPv6协议栈,此处只针对客户和服务器使用不同协议的两种情况讨论。
2、IPv4客户和IPv6服务器
其通信过程如下:
(1)IPv6服务器启动后创建一个IPv6的监听套接字,假定服务器把通配地址捆绑到该套接字;
(2)IPv4客户调用gethostbyname找到服务器主机的一个A记录;
(3)客户调用connect,导致客户主机发送一个IPv4 SYN到服务器主机;
(4)服务器主机接收这个目的地为IPv6监听套接字的IPv4 SYN,设置一个标志指示本连接应使用IPv4映射的IPv6地址,然后响应以一个IPv4 SYN/ACK。该连接建立后,由accept返回给服务器的地址就是这个IPv4映射的IPv6地址;(理解的关键)
(5)当服务器主机往这个IPv4映射的IPv6地址发送TCP分节时,其IP栈产生目的地址为所映射IPv6地址的IPv4载送数据报;(此过程由主机的内核完成转换)
(6)(后话)除非服务器显式检查这个IPv6地址是不是一个IPv4映射的IPv6地址(使用IN6_IS_ADDR_V4MAPPED宏),否则它永远不知道自己是在与一个IPv4客户通信。此细节由双协议栈处理。同样,IPv4客户也不知道自己是在与一个IPv6服务器通信。
3、IPv6客户和IPv4服务器
(1)一个IPv4服务器在只支持IPv4的一个主机上启动后创建一个IPv4的监听套接字;
(2)IPv6客户启动后调用getaddrinfo单纯查找IPv6地址(因为它请求的是AF_INET6地址族,而在hints结构中设置了AI_V4MAPPED标志)。由于只支持IPv4的那个服务器主机只有A记录,所以返回给客户的是一个IPv4映射的IPv6地址。(理解是关解)
(3)IPv6客户在作为函数参数的IPv6套接字地址结构中设置这个IPv4映射的IPv6地址后调用connect。(内核检测到这个映射地址后自动发送一个IPv4 SYN到服务器,感叹一下,内核太智能啦!)
(4)服务器响应以一个IPv4 SYN/ACK,连接于是通过使用IPv4数据建立。