android适配ipv6,请求慢?

  • Post author:
  • Post category:其他


先贴一篇我们经常能搜索到的解决方案:


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访问通畅,却没有测试外部网络访问是否通畅



版权声明:本文为u014711665原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。