前面提到DS-lite对于双栈用户的DNS request是启用DNS-proxy,即将用户的IPv4 DNS终结在家庭网关B4上,再有B4发起DNS request,之所以采用这种方式是因为DS-lite默认B4和AFTR之间的网络是IPv6单栈的,因此将DNS request采用IPv6方式承载。
在NAT64中,双栈用户的IPv4网络和IPv6网络有可能都能访问服务器,用户采用哪种报文格式进行DNS请求和业务转发呢?
典型的双栈系统DNS访问行为如下图所示。首先,双栈主机会同时发起AAAA和A的请求,在部署了DNS44和DNS64的情况下,可以获得AAAA的响应,也可以获得A的响应;然后,主机优先选择IPv6网络进行业务访问,在IPv6网络失败的情况下,再选择IPv4网络进行访问,网络层设备根据主机发起的数据包类型采用相应的协议进行承载。
上述流程,用户是先发起IPv6访问,再IPv6网络不可用时,再选择采用IPv4网络访问,增加了用户业务等待时间,降低了业务体验。为了解决这个问题,将典型的双栈系统进行了优化,即双栈终端同时发起TCP SYN IPv6和TCP SYN IPv4过程。
当IPv6网络不可用时,优化后的流程如下图所示:当用户在规定时间内仅收到IPv4网络相应,则发起IPv4承载。
当IPv4和IPv6网络不可用时,优化后的流程如下图所示:用户在获得IPv4和IPv6同时相应是,将发起IPv6承载,并通知IPv4中断TCP服务。
以上流程来源于RFC6555(Happy Eyeballs : Success with Dual-Stack Hosts)的描述。从上述描述也可以看出,标准规定在IPv6网络可用状态时,优先选择IPv6网络承载,仅当IPv6网络不通时,才会选择IPv4网络承载。因此对于双栈用户访问IPv4资源的情况,且同时获得AAAA和A响应时,优先选择采用IPv6网络尝试业务访问,所以不会直接采用IPv4承载访问业务。
这样设计的初衷是为了促进IPv6网络的发展,另外,对于双栈用户,假如要采用IPv4承载,还需要分配IPv4地址,仍然会加大对IPv4的地址压力,若采用的IPv4地址为私网IPv4,还将会引入NAT444部署来解决地址转换,业务体验跟直接采用IPv6承载再经过NAT64访问IPv4服务器是一致的。因此推荐用户优先采用IPv6承载方式进行服务而不是优先选择IPv4承载方式。
原文链接:http://blog.csdn.net/hanlijin/article/details/17076067