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数据建立。


猜你喜欢

转载自blog.csdn.net/TT_love9527/article/details/80335261