网络优化

Posted by OOFTF Blog on July 28, 2021

1. DNS优化

DNS 解析,默认使用运行商的 LocalDNS 服务,DNS 完整的解析流程很长,会先从本地系统缓存取,若没有就到最近的 DNS 服务器取,若没有再到主域名服 务器取,每一层都有缓存,但为了域名解析的实时性,每一层缓存都有过期时间。

传统的DNS解析机制有几个缺点:

  • 缓存时间设置得长,域名更新不及时,设置得短,大量 DNS 解析请求影响请求速度;
  • 域名劫持,容易被中间人攻击,或被运营商劫持,把域名解析到第三方 IP 地址,据统计劫持率会达到7%;
  • DNS 解析过程不受控制,无法保证解析到最快的IP;
  • 一次请求只能解析一个域名。

现在比较简单也最成熟的优化方案是使用HTTPDNS:

HTTPDNS 是利用 HTTP 协议与 DNS 服务器的 80 端口进行交互。不走传统的 DNS 解析,从而绕过运营商的 LocalDNS 服务器,有效的防止了域名劫持,提高域名解析的效率。 这就意味着,开发者基于 HTTP 协议,自己实现了一套域名解析,自己去维护了一份域名与 IP 的地址簿,而不是使用统一的DNS服务器。 目前各大云服务商,阿里云和腾讯云等都提供了自己的 HTTPDNS 服务,对于我们普通开发者,只需要付出少量的费用,在手机端嵌入支持 HTTPDNS 的客户端 SDK,即可使用。

2. 连接优化

优化方式:

  • 启用keep-alive,okhttp中已默认打开,但需要服务器支持
  • 使用http2

keep-alive

  • okhttp 默认开启
  • 请求端 Request header 添加 Connection: Keep-Alive
  • 如果服务端支持,服务端响应 Response Header 也会添加 Connection: keep-alive

3. 传输数据优化

  • 开启 gzip 压缩,okhttp默认支持接收gzip压缩
  • 使用 protobuf 格式代替json,xml
  • 使用 webp 代替 png/jpg
  • 判断网络环境,下发不同图片
  • http 开启缓存/本地缓存

protobuf 相较于json和xml而言,序列化之后是二进制数据,更加紧凑体积要小很多,传输效率要快很多,且支持多种语言,缺点就是使用其他没有另外两种格式方便

webp在移动端数据传输中,图片的占比还是很大的,webp具有更优的图像数据压缩算法,在拥有肉眼无法识别差异的图像质量前提下,带来更小的图片体积,同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都非常优秀、稳定和统一

网络/本地缓存和gzip压缩比较常用,判断网络环境是指请求大量数据前可以先向服务器上报设备当前的网络环境,服务器根据设备的网络环境,下发不同质量的图片,或屏蔽一些非关键数据,以保证在网络不佳的情况下也能有较流畅的体验

gzip

  • okhttp 默认开启
  • Request Header 添加 Accept-Encoding: gzip
  • Response Header 添加 Content-Encoding: gzip