前言
随着移动网络的不断升级,客户端的网络传输由3G进化到Wifi、4G,且Wifi场景越来越多。虽然网络环境在变好,但也对网络的应用提出了更高的要求,会发现很多大厂都十分重视网络指标,如果技术人员不加以控制,在弱网、体验、包括服务器带宽、流浪方面都会造成不同程度的损失。
网络指标
流量
网络第一个影响的app指标当然是流量,在手机设置界面可以清楚查看到每个 app 耗费的流量,极端情况下会造成用户卸载。
电量
频繁的网络请求和网络时常是引发电量的主要原因,每次发送请求都会激活电信号,同样耗电也会对用户产生恶略的影响,甚至卸载。
用户体验
一些网络框架会优化处理内部线程池,但线程池毕竟有限,网络请求过多或请求数据包体大,就会造成网络阻塞,也就是一些用户所谓的卡顿,在弱网方面可能表现更差,所以网络框架的好坏直接影响着整个app的用户体验。
安全
网络安全同样是网络优化中十分重要的一部分,怎样防止被第三方窃听/篡改或冒充,防止运营商劫持,同时又不影响性能,没有安全体系的网络架构同样会对服务端或者客户端造成直接或间接的影响。
网络监控
Network Monitor
Network Monitor Android Studio自带的网络监测工具,可以看出时间段之内的网络请求数量及访问速率。
Charles 抓包工具
本人更习惯于使用 charles 进行网络监控,这可以查看更多的数据指标,查看请求request、response 更加直观。
网络优化
本人觉得网络优化主要从以下几个方面入手:
- 请求速度
- 链接成功率
- 流量消耗
- 安全策略
网络请求过程:
- DNS 解析,请求DNS服务器,获取IP地址
- 建立连接,包括 tcp 三次握手、安全协议
- 发送和接收数据,解码数据
优化DNS解析
DNS解析在网路错误中占比较高,使用IP直连方式替代DNS服务器解析,可以减少域名解析几百毫秒的时间消耗。
连接池复用
keep-alive HTTP 协议里有个 keep-alive,HTTP1.1默认开启,一定程度上缓解了每次请求都要进行TCP三次握手建立连接的耗时。原理是请求完成后不立即释放连接,而是放入连接池中,若这时有另一个请求要发出,请求的域名和端口是一样的,就直接拿出连接池中的连接进行发送和接收数据,少了建立连接的耗时。
数据压缩
目前比较成熟的方案未 GZIP 压缩,正常情况下压缩率均值能打包 30-50之间,可以极大的提升传输速度和节省流量,必要是可以使用 Protocol Buffer 替换 JSON 。
弱网优化
弱网优化,在弱网时要是制定合适的超时时间,控制网络并发,合并打包请求,调优TCP参数,使用TCP优化算法。
对服务端的TCP协议参数进行调优,以及开启各种优化算法,使得适合业务特性和移动端网络环境,包括RTO初始值,混合慢启动,TLP,F-RTO等。
针对弱网的这些细致优化暂未成为标准,开源网络库 mars 有实现可以借鉴,若有需要可以使用。
网络安全
- 采用 Https 双向认证
- 参数加密校验,防窃听/篡改或冒充
- 加密秘钥保护,采用 so 方式进行秘钥提取
结语
网络优化话题非常庞大,本文只是提供一些建议及处理方式,希望对大家能够有所帮助。