移动网络性能优化要点

这里记录一些非协议的常见优化要点,网络协议的相关优化以后有空再写。

1. DNS

问题:

  • 解析问题
    • 运营商劫持、域名失效
    • 解析慢、失败
  • 单个 CDN 节点故障

方案:

  • 解析问题

    • HttpDNS
    • 启动时下发服务器 IP 列表,类似 HttpDNS 的轮子
  • 单点故障

    • 根据权重选择合适的节点访问,即客户端应该获得服务端 IP 列表而不是单个 IP,部分现成的 HttpDNS 不支持 (比如 D+)

2. 网络链路优化

问题:

  • 移动网络链路冗长,延迟高
  • 网络切换后原 IP 可能无法联通或慢

方案:

  • CDN
  • 网络环境切换时及时刷新 DNS (HttpDNS) 缓存

3. 网络质量检测

问题:

  • 2G/3G/4G/Wi-Fi 网络环境下延迟时间不一
  • 同一网络环境中也可能有较大波动,比如在运行的地铁中
  • 网络环境切换导致连接超时

方案:

  • 根据用户的网络环境设置不同的超时参数(超时时间太短可能导致低速网络下无法建立连接,超时太长可能导致长时间等待)(携程)
  • 根据请求状况动态调整请求策略 (Facebook)
  • 客户端网络库检测网络环境切换状态,重新请求

4. 网络请求优先级和依赖机制

问题:

  • 不同的网络环境下并发 TCP 连接的数量有限制 (待进一步确认,没找到可靠的消息来源)
  • 短连接握手时间太长,都用短连接不合算

方案:

  • 允许客户端在低速网络状况下一直保持长连接,减少 TCP 握手的时间
  • 设定请求的优先级,重要的请求使用长连接,低优先级的用短连接,防止不重要的请求阻塞长连接队列
  • 请求有依赖机制,当主请求失败后不再处理后续依赖的请求

5. 重试机制

问题:

  • 快速失败给用户的体验不好

方案:

  • 在幂等的请求(客户端决定)中可以启用重试策略

6. 减少数据传输量

问题:

  • 数据包多传输时间长

解决方案:

  • 启用 Gzip
  • 采用更好的的序列化/反序列化方案
  • 采用 WebP 图片格式

参考:

  1. iOS应用架构谈 网络层设计方案 http://casatwy.com/iosying-yong-jia-gou-tan-wang-luo-ceng-she-ji-fang-an.html
  2. R U Ok–客户端网络优化实践 http://2014.54chen.com/blog/2015/06/03/are-u-ok/
  3. App的移动网络优化 http://www.xexplorer.net/index.php/archives/60/
  4. 携程App的网络性能优化实践 http://www.infoq.com/cn/articles/how-ctrip-improves-app-networking-performance