移动网络优化

网络不可用的情况

  • GFW(Great Firewall)的拦截
  • DNS劫持,端口意外被封
  • 偏远地区网络基建问题

网络加载时间长

  • 移动设备基于省电的目的,发出网络请求之前,需要先预热通信芯片
  • 网络请求需要跨网络运营商,物理路径长
  • HTTP请求基于Socket设计,请求发起之前会经历三次握手,断开时会进行四次挥手

HTTP协议数据安全问题

  • HTTP协议的数据容易被抓包。Post包体数据经过加密能够避免泄漏,单协议中的URL和header部分还是会暴露给抓包软件。HTTPS也有这个问题。

其他

  • 运营商数据恶意篡改严重

解决方案

基于HTTP短连接的优化

  • 域名合并
    在实际开发中,经过对不同业务申请不同的二级域名/三级域名。域名多了之后,有以下问题:

    • HTTP请求需要与不同服务器建立连接。增加了网络的并发连接数。
    • 每条域名都需要经过DNS服务来解析服务器IP

    这种方案在实施上比较难推动,对后台业务的影响太大了

  • 域名合并改进版
    保持客户端业务层的网络请求代码和服务端后台业务服务收到的请求保持一致。在客户端发送前,在客户端网络层对域名进行统一收编,请求送到后端,在负载均衡环节对域名进行还原.(客户端将二级域名的前缀,转化到URL的Path中;服务端在负载均衡处,重新转化为二级域名)
    优势:

    • 域名收敛,减少了DNS调用次数,降低了DNS劫持的风险。
    • 针对同一域名,可以利用Keep-Alive来复用Http连接。
  • IP直连
    在域名收敛之后,可以进一步优化。可以在客户端搭建自己的DNS服务。

    • 实现方案:
      在App启动的时候,拉取主域名对应的IP列表。对所有IP测速,找到速度最快的Ip。后面所有的请求都将主域名改成最快的IP。
      优势:

      • 不用系统的DNS,避免DNS劫持
      • 自建的DNS机制,DNS更新时机可以控制
      • IP列表可随时替换

      issues:

      • HTTPS证书问题

HTTP长连接通道

  • HTTP 2

    • 优点:
      异步连接多路复用、头部压缩、请求响应管线化。
    • 缺点:
      请求基于DNS,仍面临DNS劫持风险;不同域名的请求需要建立多条连接;网络通道难以优化,客户端与服务器之间是公网,在多地部署服务器,成本大;业务改造成本大,部署HTTP2,需要对业务服务器进行改造。
  • 长连接代理
    在客户端与业务服务器之间架设代理长连接服务器,客户端与服务器建立TCP长连通道,客户端的HTTP请求被转换为TCP通道上的二进制数据包。代理服务器与业务服务器进行HTTP请求,请求的结果通过长连接通道回传给客户端。
    优势:

    • 对DNS没有依赖,客户端与代理服务器之间的长连接通道是通过IP建立的;客户端的HTTP请求被转换为二进制数据流送到代理服务器。代理服务器转发请求到业务服务器,由于处于同一内网,因此可以搭建自己的DNS,减少对公网DNS的依赖。
    • 不同域名的请求可以服用同一条长连接通道。
    • 通道易优化。与部署业务服务器相比,部署代理服务器代价小很多。可以在多地区部署代理长连接服务器,客户端通过IP跑马的方式找出最快的服务器IP;另一方面,代理服务器与业务服务器之间的网络通道也可以优化,通过架设专线等方式提高服务质量。
    • 业务代码不关心是长连接通道/短连接通道。
  • 自建长连接开发周期规划

    • 中转服务的开发、部署
      在开发的初期,搭建代理中转服务器, 并假设完整链路结构。
    • 加密通道的建设
      为了保护TCP通道上数据的安全,客户端与代理长连接服务器之间的二进制通道数据需要利用加密来保障数据安全。
    • 建设专线
      在代理服务器和后台业务服务器之间建立专线,使用专线,降低公网环境的干扰,保障服务的稳定性。
    • 自动降级
      由于客户端的请求都在TCP通道上,当长连接服务器故障时,将会导致客户端的整体网络服务不可用。为了解决这个问题,可做降级设置。当TCP通道无法建立或者发生故障时,可以绕过代理长连接服务器发起公网HTTP请求。
    • 多地部署接入点
      可以选择最快的服务器接入,提升通信质量。

实践经验

  • 长连接通道建立越早,成功率越高,越多的请求能在长连接通道上。特别是当APP打开时,数量众多的请求同时需要发出。在这种情况下,可以首先建立长连接通道,将众多请求放入等待队列中,待长连接建立之后再将队列中的请求依次发出。
  • TCP数据包越大,传输时间越长,如果长连接通道未采用类似HTTP2中的数据切片的技术,大的数据包非常容易导致长连接通道堵塞。
  • ios android的系统网络库存在很多默认行为,例如系统网络库会在内部处理网络重定向,请求头没有填写Accept_Encoding或Content-Type等字段,系统网络库会自动填写默认值。
  • HTTP的请求头键值对是允许相同和重复的。在长连接通信中,如果对header中的键值对用不加处理的字典方式保存和传输,会导致数据丢失。

本文参考

  • 2018美团点评技术年货
    原文作者:三十二蝉
    原文地址: https://www.jianshu.com/p/79509d1f4d0c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞