Android 在 4G 下访问 IPV6 慢的解决方案

Android4G ipv6

起因

今天,用户反馈 Android 端加载数据较慢,经 Android 开发人员排查后,发现在公司 wifi 下接口响应时间在 50ms 左右,而在 4G 网络下,接口响应时间在 600ms 左右,甚至于 1s 以上,Android 端认为是服务端问题,遂反馈到服务端

排查

  1. 首先检查 nginx 日志,发现不管是 wifi 网络下还是 4G 网络下,服务端的响应时间均在 30ms 左右,所以排除掉了代码的问题

  2. 向运维同学咨询了一下服务端的网络架构,原来为了 IOS 的 appstore 审核,服务端增加了 ipv6 支持,而 ipv6 的服务入口在美国,如下图:


网络架构

所以怀疑 Android 端解析域名时解析到两个 IP 后,优先使用 IPV6 连接的后端服务

验证

使用如下代码,验证 DNS 解析的 IP 地址


try {
InetAddress[] inetAddresses = InetAddress.getAllByName("server.xxxx.cn");
for(InetAddress inetAddress : inetAddresses){
System.out.println(inetAddress.getHostAddress());
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
  1. 连接公司 wifi ,执行代码,只解析到 ipv4 地址
  2. 使用 4G 网络,执行代码,解析到 ipv6 和 ipv4 两个 ip 地址,且 ipv6 一直是首个 ip 地址

解决

通过上面的验证,基本断定为 4G 网络下,Android 端通过 ipv6 连接的服务地址。

端的 http client 库为 okhttp , 查看 javadoc 后,提供了 DNS 接口,代码如下:


DNS

我们通过实现此接口,将解析到的 ip 顺序调整一下,如果是 ipv4 则将其放到数据的第一个,其它保持不变,如下图:


自定义DNS

修改 okhttp 的 dns 解析类,如下:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.dns(new MyDns());
OkHttpClient client = builder.build();

再次测试,发现 Android 端的接口响应时间回归正常

备注

  1. 在测试过程中,发现中国移动和中国电信的 4G 网络 DNS 解析都会解析到两个 IP 地址,而中国联通的 4G 网络只能解析到 ipv4 的址,手机型号是小米 note3
  2. 网上很多的方案都是将 ipv6 关掉,或者在 appstore 审核时打开,审核完成后再关掉,这种不能解决根本问题的方法实在不可取,大家一定要仔细分析,擦亮眼睛

最新文章

  1. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调
  2. 7 static关键字
  3. MVC基础知识 – 2.新语法
  4. 将Python脚本封装成exe可执行文件 转
  5. Ajax基础详解2
  6. C# 使用 AutoResetEvent 或 ManualResetEvent 同步两个线程
  7. SharePoint 2013 中使用 JavaScript Like 和Unlike list item/page/document
  8. 蜗牛历险记(二) Web框架(上)
  9. Comet学习资料
  10. Ubuntu下Eclipse搭建ARM开发环境
  11. NSIS脚本:更改壁纸
  12. TypeScript入门-枚举、类型推论
  13. 打通MySQL的操作权限
  14. 《构建之法》教学笔记——Python中的效能分析与几个问题
  15. 【cpp】chap 8
  16. 使用bitsadmin.exe 下载文件,配合bcn.bat玩出更多的花样~~
  17. win 10安装Linux虚拟机教程
  18. 解决Oracle登录极慢的问题
  19. 系统重启后DNS地址默认修改修改引起的一次事故(Tomcat报错:java.net.UnknownHostException)
  20. Unity 3D Shader流水线

热门文章

  1. office 安装破解
  2. Linux常用命令:修改文件权限chmod 754/744
  3. 如何利用Nginx的缓冲、缓存优化提升性能
  4. Java学习之==>泛型
  5. Service Mesh体验
  6. Postman接口测试动态传参——动态获取token值
  7. Vmware ESXI 安装Windows
  8. Python流程控制与while 循环(day01)
  9. import和from.…import…
  10. 认识react, 并简单与vue对比