1.前言
- 在移动互联网的快速发展环境下,手机用户日益对网络的使用或体验有着更深度的诉求,因此应用中的网络体验已经显得由此重要,而背后对开发者在网络性能有更高的要求。
- 网络影响:
1.最直观的就是用户交互体验;
2.流量的流失;
3.电量的消耗; - 本文从连接、传输、监控 三个维度提出相关的优化。
- 文章中实例 linhaojian的Github
2.HTTP请求过程
http请求流程.png- 通过上图可以很清楚的理解HTTP协议的请求过程:
1.客户端输入域名,通过浏览器请求发送;
2.通过DNS解析域名,得到真正需要请求的服务器IP地址;
3.服务端接收到请求内容之后,做出响应;
(HTTP使用Socket构建基于TCP/IP协议的通讯) - 因此我们就可以针对上述流程总结可优化2个方向:连接、传输。
3.连接
3.1 网络状态
- 可以根据不同的网络状态(2G、3G、4G、Wifi)针对性的提供处理策略。
3.2 弱网处理
- 弱网的影响:存在较多的丢包、误码、超时、连接中断以及难以接入网络等情况;
- 针对弱网情况,可做一下优化:
1.失败重试: 可在Retrofit等网络框架添加拦截器,实现失败重试;
3.3 IP直连
- 优点:能减少DNS的域名解析过程,从而提升连接或请求的速度。
- 缺点:IP暴露,不安全。
3.4 HttpDns
- 出自:是阿里研发的产品HttpDns。
- 作用:使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到阿里云的HTTPDNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题;
3.5 Http1.0、Http1.1、Http2.0
- 影响HTTP网络请求主要是 带宽 和 延迟 ;
-
Http1.0
:每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接,每次请求连接都需要3次握手,连接成本较高,性能较差。 -
Http1.1
* 持久连接: 即TCP连接默认不关闭,可以被多个请求复用(对于同一个域名,大多数浏览器允许同时建立6个持久连接);
* 管道机制: 即在同一个TCP连接里面,客户端可以同时发送多个请求,举例:需要发送2个请求,以前HTTP1.0的做法是请求一次需要等等响应,再请求第二次类似于一问一答,而HTTP1.1就支持同时请求,之后按序响应;
* 缺点:队头阻塞,上述已说明HTTP1.1的TCP连接复用与响应按序的,那么在多个请求使用同一个TCP连接的时候,一个响应的特别慢的时候,会影响后续的响应速度。 -
Http2.0
* 降低延迟: 路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
* 请求优先级: 多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。
* header压缩: 前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
* 数据传输: HTTP/2采用二进制格式而非文本格式。
3.6 连接复用
- 根据相同的HOST请求,可以设计连接的缓存,实现连接池进行复用。例如:OkHttp中的Dispatcher;
4.传输
4.1 Protocol Buffers
- 定义:Protocol Buffers 和 XML、JSON一样都是结构数据序列化的工具。
- 作用:通过将结构化的数据(拥有多种属性)进行序列化,从而实现**数据存储和交换的功能 **。
- 优点:在传输数据量较大的需求场景下,Protocol Buffer 比 XML、JSON
更小(3到10倍)、更快(20到100倍)
、使用 & 维护更简单;而且 Protocol Buffer 可以跨平台、跨语音使用。
4.2 Gzip
- 定义:在 http/1.0 协议中关于服务端发送的数据可以配置一个
Content-Encoding
字段,这个字段用于说明数据的压缩方法。(Content-Encoding:gizp、Accept-Encoding: gzip)
4.3 网络缓存
-
网络缓存
:提供一种将数据存储到本地的思想,实现减少服务器的请求负荷、加快请求速度、无网也能显示内容。例如:OkHttp的缓存机制(强制缓存
与对比缓存
)。
强制缓存
:在缓存数据未失效的情况下,可以直接使用缓存数据,由两个字段Expires和Cache-Control用于标明失效规则。
对比缓存
:表示需要和服务端进行相关信息的对比,由服务器决定是使用缓存还是最新内容,如果服务器判定使用缓存,返回响应吗304,判定使用最新内容,则返回响应码200和最新数据(ETag和If-None-Match)。
4.4 图片传输
1.可通过Webp的图片格式传输。
2.可实现图片缓存机制(`二级缓存:Lrucache;DisLrucache等`)。
4.5 预加载
- 在设计业务请求时,可合理的设计
数据提前加载
的方式,提升用户的体验。
5.监控
5.1 Android Profiler
Android Profile.png- Receiving:表示下行流量, 即下载接收;
- Sending:表示上行流量, 即上传发送;
5.2 Stetho
-
Stetho
是Facebook开源的Andorid调试工具。当你的应用集成Stetho时,开发者可以访问Chrome,在Chrome Developer Tools中查看应用布局,网络请求,sqlite,preference等等,可视化一切应用操作(更重要的是不用root)。
stetho.png
stetho1.png
5.总结
- 到此,
网络优化
介绍完毕。 - 如果喜欢我的分享,可以点击 关注 或者 赞,你们支持是我分享的最大动力 。
- linhaojian的Github
欢迎关注linhaojian_CSDN博客或者linhaojian_简书!
不定期分享关于安卓开发的干货。
写技术文章初心
- 技术知识积累
- 技术知识巩固
- 技术知识分享
- 技术知识交流
网友评论