Android 弱网环境分析

在网路应用流行的今天,我们已经很难再找到哪些应用是不需要网路的了,那么网路质量的好坏极大关系的影响着一个app的体验。

弱网环境

当提到这个词的时候我们可能会疑惑?什么叫弱网环境?
现在大部分人的手机都是4G手机,当我们使用手机流量时在信号不好的地方可能会降级到3G,2G,那么这些意味着手机信号不好的时候手机会去调整到一个高延迟低带宽的网络环境。

网络环境 2.75G 3G 4G 5G
带宽(上行/下行) 484kb/384kb 2m/7m 56-128m >50m/>100m
延迟 600-700ms 150-400ms 40-50ms 10ms

可以看到不同制式的网络标准能够提供的网络环境是不一样的。
弱网环境下会有很多问题

  • 丢包率高
  • 误码率高
  • 不稳定的延迟
  • 不稳定的带宽

我们评测一个网络是否好通常通过以下几个参数去判定

  • 吞吐量:网络接口接受和传输的每秒字节数。
  • 延迟:系统调用发送/接受延迟,连接延迟,首包延迟,网络往返时间等。
  • 连接数:每秒的连接数
  • 错误:丢包计数,超时等。
分析工具

网络优化

什么事网络优化?网络优化在优化哪些内容?

  • 速度。在网络正常或者良好的时候,怎样更好地利用带宽,进一步提升网络请求速度。
  • 弱网络。移动端网络复杂多变,在出现网络连接不稳定的时候,怎样最大程度保证网络
    的连通性。
  • 安全。网络安全不容忽视,怎样有效防止被第三方劫持、窃听甚至篡改。
网络延时
  • DNS 解析。通过 DNS 服务器,拿到对应域名的 IP 地址。在这个步骤,我们比较关注 DNS 解析耗时情况、运营商 LocalDNS 的劫持、DNS 调度这些问题。
  • 创建连接。跟服务器建立连接,这里包括 TCP 三次握手、TLS 密钥协商等工作。多个 IP/ 端口该如何选择、是否要使用 HTTPS、能否可以减少甚至省下创建连接的时间,这 些问题都是我们优化的关键。
  • 发送 / 接收数据。在成功建立连接之后,就可以愉快地跟服务器交互,进行组装数据、 发送数据、接收数据、解析数据。我们关注的是,如何根据网络状况将带宽利用好,怎 么样快速地侦测到网络延时,在弱网络下如何调整包大小等问题。
  • 关闭连接。连接的关闭看起来非常简单,其实这里的水也很深。这里主要关注主动关闭 和被动关闭两种情况,一般我们都希望客户端可以主动关闭连接。

DNS解析

DNS 的解析是我们网络请求的第一项工作,默认我们使用运营商的 LocalDNS 服务。这 块耗时在 3G 网络下可能是 200~300ms,4G 网络也需要 100ms。

微信有自己部署的 NEWDNS,阿里云和腾讯云也有提供自己的 HTTPDNS 服务。对于大 网络平台来说,我们会有统一的 HTTPDNS 服务,并将它和运维系统打通。在传统的 DNS 基础上,还会增加精准的流量调度、网络拨测 / 灰度、网络容灾等功能。

dns

连接复用

tcp连接需要进行三次握手,tls连接需要进行秘钥协商然后建立连接,创建连接的代价是非常大的,可以通过复用连接来避免每次请求都进行重新建立连接。
在okhttp中当一次请求完成后,并不会立刻把连接释放,而是放到连接池中。这时如果 有另一个请求的域名和端口是一样的,就直接拿出连接池中的连接进行发送和接收数据, 少了建立连接的耗时。

这里我们利用 HTTP 协议里的 keep-alive,而 HTTP/2.0 的多路复用则可以进一步的提升 连接复用率。它复用的这条连接支持同时处理多条请求,所有请求都可以并发在这条连接 上进行。

压缩与加密

压缩

讲完连接,我们再来看看发送和接收的优化。我第一时间想到的还是减少传输的数据量, 也就是我们常说的数据压缩。首先对于 HTTP 请求来说,数据主要包括三个部分:请求 URL 请求 header 请求 body。

  • 对于 header 来说,如果使用 HTTP/2.0 连接本身的头部压缩技术,因此需要压缩的主要 是请求 URL 和请求 body。
  • 对于请求 URL 来说,一般会带很多的公共参数,这些参数大部分都是不变的。这样不变的 参数客户端只需要上传一次即可,其他请求我们可以在接入层中进行参数扩展。
  • 对于请求 body 来说,一方面是数据通信协议的选择,在网络传输中目前最流行的两种数 据序列化方式是 JSON 和 Protocol Buffers。正如我之前所说的一样,Protocol Buffers 使用起来更加复杂一些,但在数据压缩率、序列化与反序列化速度上面都有很大的优势。
    另外一方面是压缩算法的选择,通用的压缩算法主要是如 gzip,Google 的Brotli或者 Facebook 的Z-standard都是压缩率更高的算法。其中如果 Z-standard 通过业务数据样 本训练出适合的字典,是目前压缩率表现最好的算法。但是各个业务维护字典的成本比较 大,这个时候我们的大网络平台的统一接入层又可以大显神威了。
image.png

针对图片可以通过得知网络环境提供不同分辨率和质量的图片来节省网络带宽

你可能感兴趣的:(Android 弱网环境分析)