对于安卓来说,APN协议设置是支持编辑的,并且安卓5.0以后默认缺省设置为双栈模式。其他场景下,可以在移动网络访问网络时,通过修改接入点(APN)中“APN协议/APN漫游协议”属性设置为“IPV4/IPV6”双栈网络使设备支持双栈。
IPV6改造主要包括:
- 检测移动设备是否支持IPV4/IPV6双协议栈
- DNS服务能正确返回IPV4/IPV6地址
- 建立v6链接,与服务器通信
由于Linux内核的TCP/IP协议栈在2.2版本已经支持IPV6,Android是基于2.6以后的,所以默认能够使用IPV6地址与后台交互。
IPV6地址获取流程: 当客户端是双栈环境时,客户端在向DNS服务器请求地址解析时,会发起域名A记录和AAAA记录的解析请求,如果后台支持双栈,就拿到对应的两条解析地址结果。
A记录:一个域名指向IPV4地址的解析结果。
AAAA记录:一个域名指向IPV6地址的解析结果,如果想要一个域名解析到IPV6地址,则需要设置此种类型的解析结果。
DNS服务器:进行域名和与之相对应的IP地址转换的服务器。将域名解析为ip
HappyEyeball算法:
HappyEeyball分两版,Cisco与2012年提出的RFC6555版和Apple与2017年提出的RFC8035版。
RFC8035 v2版本介绍:
- 从DNS服务器同时获取AAAA和A记录解析地址
- 如果v6地址先返回就直接开始握手建链,如果v4地址先返回,则有25ms解析时延,在收到v6地址后会做地址选择
- 如果是有v4和v6地址列表,会通过算法对地址排序,排序依据历史RTT数据
- 排序完成后,会依次有序的取地址发送握手建链请求,并启动定时任务,该任务在250ms后检查若未完成连接建立,则触发第二个地址开始连接尝试
- 只有一个握手确认成功(建立了连接),就会取消所有其他的连接尝试