IPv4和IPv6的互操作性

概述

在IPv4到IPv6发展的过度阶段,必然出现v4和v6主机之间互操作的问题,下面从机制层面讨论互操作的可能性,并假设主机之间网络路由已经打通。

IPv4客户端访问IPv6服务端

IPv4客户端访问IPv6服务端指的是服务端是双栈主机,客户端是纯v4主机。

假设服务端在v6地址上起了一个服务,客户端通过DNS获取服务器的A记录,通过v4地址访问服务端该端口的服务,服务端收到v4报文后,内核发现目的端口绑定本机的一个v6套接字,于是会把源v4地址转换成v4映射v6的地址(将v4地址往前补齐,变成v6地址)。

  • 在应用程序调用accept的时候,内核返回v4–>v6的映射地址给应用程序。
  • 应用程序往该地址发送数据的时候,内核将目的地址改成客户端v4地址,源地址使用服务器的v4地址。

客户端应用程序认为自己在和v4服务通信,服务端应用程序认为自己在和v6客户通信,中间的转换过程由服务端协议栈完成,对于客户端和服务端是透明无感知的。

IPv4客户端访问IPv6服务端的步骤总结如下:

  1. 服务端创建v6监听套接字
  2. 客户端通过DNS获取服务端的A记录
  3. 客户端向服务端的v4地址发起请求
  4. 服务端协议栈通过v4地址和客户端完成三次握手,并将v4到v6的映射地址返回给服务端应用程序
  5. 服务端向客户端发送数据时,服务端协议栈将源目地址都转为v4地址
  6. 整个转换过程均由服务端的IP协议栈完成,客户端和服务端均无感知
  7. v4客户端能访问v6服务端的前提是v6客户端是双栈主机

上面是TCP的过程,UDP类似,当v4客户端访问v6服务时,recvfrom会返回v4映射v6地址,sendto的时候,协议栈也会把目的地址改成v4。

IPv6客户端访问IPv4服务端

IPv6客户端访问IPv4服务端指的是客户端是双栈主机,服务端是纯v4主机。

当IPv4服务端在指定端口启动服务后,一个双栈主机的客户端通过IPv6访问该服务时,首先通过DNS获取服务端v4地址的映射v6地址,然后用该地址作为参数调用connect,然后客户端协议栈识别出目的地址是映射的v6地址,将本机v4地址作为源地址,客户端的v4地址作为目的地址,发送v4的数据包给服务端。

客户端调用getaddrinfo获取服务端的AAAA记录时,hints必须设置AI_V4MAPPED,用以获取服务端v4映射v6地址。

双栈主机之间的互访

双栈主机之间互访场景包括:

  • v4客户端访问v4服务端:直接能通
  • v6客户端访问v6服务端:直接能通
  • v4客户端访问v6服务端:v4客户端访问服务端主机的v4地址,由服务端主机协议栈进行v4到v6的转换
  • v6客户端访问v4服务端:v4客户端通过getaddrinfo获取到服务端的AAAA记录,如果使用服务端的v6地址,那么通不了;如果使用服务端的v4地址的v6映射,那么可以通

v4、v6客户端分别指双栈客户端通过v4或v6套接字去访问;

v4、v6服务端分别指双栈服务端的服务在v4或v6套接字上监听。

总结

IPv4和IPv6主机之间互访的总结如下:

  1. 纯v4客户端访问双栈服务端的v6服务时,通过v4网络传输,到服务端后由服务端协议栈将v4映射成v6进行通讯。
  2. 双栈客户端v6访问纯v4服务端的v4服务时,客户端需获取服务端v4映射v6地址,客户端程序访问该v6地址,客户端协议栈将源地址转成本机v4地址,目的地址转成服务端v4地址,通过v4网络传输,完成和服务端的通讯。
  3. 双栈客户端访问双栈服务端的服务时,可以选择不同的协议进行通讯。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值