您的位置:首页 > 其它

IPv4与IPv6的互操作性

2016-12-11 17:16 239 查看
IPv4与IPv6的互操作性

ipv4客户与ipv6服务器

IPv6客户和IPv4服务器

IPv6地址测试宏

IPv4与IPv6的互操作性

双栈主机的一个基本特性是其上的IPv6服务器既能处理IPV4客户,也能处理IPV6客户,这是通过IPV4映射IPV6地址实现的

ipv4客户与ipv6服务器

>IPV6服务器创建一个ipv6监听套接字,IPV4客户端通过gethostbyname找到服务器的一个A记录,(虽然IPV6服务器有A记录和AAAA记录),IPv4客户端只使用A记录,客户端通过connect,导致客户端向服务器主机发送一个IPV4 SYN到服务器,  服务器(IPV6)接收这个IPV4 SYN,设置一个标志指示本链接使用IPV4映射IPV6地址,然后响应一个IPV4 SYN/ACK, 建立链接后,ACCEPT返回给服务器的地址就是个IPV4映射的IPV6地址
当服务器往这个ipv4映射的ipv6地址发送TCP分节时,,其IP栈产生的目的地址为所映射IPV4地址的ipv4载送数据包


IPV4监听套接字只能接受来自IPV4客户的连接

如果一个服务器绑定了一个IPV6监听套接字,而且该套接字未设置IPV6_V6ONLY套接字选项,那么该监听套接字既能接收来自IPV4客户端的请求,也能接受来自IPV6客户端的请求

IPv6客户和IPv4服务器

那么IPvc6的客户端会调用getaddrinfo() 查找IPv4的地址,,既然服务器值支持Ipv4,那么服务器主机只有A记录, getaddrinfo()返回给客户的是一个IPv4地址到ipv6地址的映射

IPv6地址测试宏

int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *aptr);

int IN6_IS_ADDR_LOOPBACK(const struct in6_addr *aptr);

int IN6_IS_ADDR_MULTICAST(const struct in6_addr *aptr);

int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr *aptr);

int IN6_IS_ADDR_SITELOCAL(const struct in6_addr *aptr);

int IN6_IS_ADDR_V4MAPPED(const struct in6_addr *aptr);

int IN6_IS_ADDR_V4COMPAT(const struct in6_addr *aptr);

nt IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr *aptr);

int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr *aptr);

int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr *aptr);

int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr *aptr);

int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr *aptr);

前7个测 试IPV6地址的基本类型, 后5个测试IPV6多播地址的范围
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: