先贴一篇我们经常能搜索到的解决方案:
Android 在 4G 下访问 IPV6 慢的解决方案
文章很有参考意义,但也并不是所有请求慢的的原因!
本文是另一种原因,有兴趣就继续往下看一看.
使用的okhttp框架,模式支持ipv6和ipv4协议,但两种协议同时存在时会优先ipv6,当ipv6超时时就会使用ipv4协议.
带着这个原理我们首先定位一下原因吧:
首先dns解析域名,明确请求时ipv4还是ipv6,Android网络请求必须在子线程,所以开了线程
new Thread(() -> {
try {
InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : allByName) {
System.out.println("ip=>" + inetAddress.getHostAddress());
}
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}).start();
首轮测试结果: 公司wifi仅支持ipv4;移动4G流量支持ipv4及ipv6.这个跟网络供应商以及路由器支持有关.
题外话,如何区分ipv4还是ipv6呢?
简单点就是ipv4就是点分十进制32位组成,如192.168.1.123
ipv6就是冒分十六进制128位组成,如2418:400e:1511:b996:2c56:7996:c520:92a4
我们现在的问题是在解析到ipv6的ip时会出现请求巨慢.使用控制变量法,分别测试了仅ipv4协议及仅ipv6协议,怎么做?
华为手机,设置->移动网络->移动数据->接入点名称(APN)->新建一个APN,配置中的APN协议及APN漫游协议设置为仅ipv4或ipv6.
再次访问接口,仅ipv4的配置打印的只有ipv4的ip,访问速度正常!
仅ipv6的配置打印的只有ipv6的ip,SocketTimeoutException访问超时!
这就印证了上面的原因,由于ipv6超时,从而重新选择了ipv4,所以请求巨慢!
最后排查运维申请了ipv6的地址,但没有申请ipv6的网关,运维在测试的时候只验证了服务器的ipv6访问通畅,却没有测试外部网络访问是否通畅