本文旨在提出一种提高移动端网络性能的可行方案。我们知道目前移动端使用的网络请求协议基本上都是http。用的最多的是http/1.1,http/2.0正在逐渐壮大,实际上http/2.0是基于google提出的SPDY协议改进而来。废话不多说,马上进入正题。
关于SPDY协议的详细介绍,请参看 OkHttp完全解析(七)SPDY协议详细介绍 。
关于OkHttp的使用及源码分析网上相关的资料很多,推荐OkHttp完全解析(八)源码解析一 系列文章。写的很不错。
从速度上来讲,Http/1.1用明文传输,无需加密验证,速度快;SPDY加入了SSL加密握手,但是SPDY协议允许一个TCP连接复用,可以一个域名只提供一个TCP连接即可完成通信,虽然由于TCP连接复用,但是SSL加密握手协商过程又耗费了一定的时间;Http/2.0是Http的加密版本,也是SPDY的升级版本,如果追求高安全性,可以选用Http/2.0,速度上Http/2.0比Http/1.1稍慢。实验证明单纯的将Http/1.1升级到SPDY,速度提升并不明显,原因在于SSL加密层的添加,一定程度上拖慢了SPDY协议的效率。本文在基于OkHttp开源库的基础上,使用SPDY协议,但是强制忽略了SSL握手验证过程,强制使用SPDY/3.1协议,这样就将SPDY的速度优势发挥出来了。Okhttp的源码量比较大,逻辑比较复杂,我费了不少时间,看懂了大致的思路。请在阅读本文之前阅读前面的OkHttp源码系列文章。
针对某个公司的产品,服务器端可以针对域名进行配置SPDY协议的使用。针对自家产品完全可以免去SSL协商过程,直接默认使用SPDY协议。关于服务器怎么配置,在此不过多赘述,自行查阅相关文章。
客户端具体实现过程:
下载okHttp源码并进行修改,只需修改一处即可完成。直接上代码:
Connection.java中的connect()函数:
//当新建连接或者可用连接无效的时候进入此函数
void connect(int connectTimeout, int readTimeout, int writeTimeout,Request request, List<ConnectionSpec> connectionSpecs,boolean connectionRetryEnabled) throws RouteException {
if (connected)
throw new IllegalStateException("already connected");
SocketConnector socketConnector = new SocketConnector(this, pool);
SocketConnector.ConnectedSocket connectedSocket;
if (route.address.getSslSocketFactory() != null) {
// https:// communication
connectedSocket = socketConnector.connectTls(connectTimeout, readTimeout, writeTimeou