网络优化

网络连接流程

DNS解析->IP->Socket(TCP/IP)->服务端

网络连接提速

DNS解析域名流程

  1. 先从本地缓存中查找域名;
  2. 查不到会从就近的其他DNS服务器查询;
  3. 再查不到会去主域名服务器查询;

这个查询过程是相当漫长的,而且每一级都有缓存,缓存有过期限制,一旦过期就要重新去查。

DNS的缺点

HTTPDNS

就是自己在服务器上做域名解析,通过HTTP请求后台拿到域名对应的IP地址。

HTTPDNS的优势

连接优化

keep-alive

http协议中存在keep-alive(就在请求头里),在HTTP1.1开始默认开启,一定程度上缓解了每次请求都要三次握手建立连接的耗时。

原理是请求完成之后不释放连接,而且放到连接池中缓存。

但是,开启keep-alive的连接一次性只能发送一个请求,在上一个请求处理完成之前,无法接受新的请求。若同时发起多个请求,会发生:

问题解决

http2提出了多路复用来解决并行请求的问题。

http2中,也是复用连接,但是一条连接支持同时处理多条请求,所有请求都可以并发在这条连接上进行。

原理是把连接传输的数据都打包成一个个的stream,每个stream都具有标识,stream的发送和接受可以是乱序的,也不存在阻塞的问题,接收端根据标识来区分请求,再进行数据拼接,得到最终数据。

OkHttp默认会开启keep-alive,并且在Okhttp3以上也支持了Http2。

数据压缩

选择序列化方式

请求体压缩

采用gzip对body进行压缩。

OkHttp的BridgeInterceptor这个拦截器会默认开启gzip解压支持:

1
2
3
4
5
boolean transparentGzip = false;
if (userRequest.header("Accept-Encoding") == null && userRequest.header("Range") == null) {
  transparentGzip = true;
  requestBuilder.header("Accept-Encoding", "gzip");
}

压缩之后会在Header中添加Content-Encodin:gzip

其他