网络优化
网络连接流程
DNS解析->IP->Socket(TCP/IP)->服务端
网络连接提速
- 直接使用IP地址,省掉DNS解析过程;
- 复用连接或者使用同一条长连接;
- 压缩数据,减小数据传输量。
DNS解析域名流程
- 先从本地缓存中查找域名;
- 查不到会从就近的其他DNS服务器查询;
- 再查不到会去主域名服务器查询;
这个查询过程是相当漫长的,而且每一级都有缓存,缓存有过期限制,一旦过期就要重新去查。
DNS的缺点
- 解析流程漫长,耗时多;
- 由于缓存时限过长,域名不能即时更新;
- 由于缓存时限过短影响请求速度;
- 解析过程不受控制,不能保证解析到最快的IP(最近的不一定最快);
- 一次请求只能解析一个域名;
- 容易遭到中间人攻击或被运营商劫持。
HTTPDNS
就是自己在服务器上做域名解析,通过HTTP请求后台拿到域名对应的IP地址。
HTTPDNS的优势
- 直接通过IP地址请求,不存在domain解析,避免被劫持;
- 解析过程由自己控制,可以确保解析到最快的IP地址;
- 一次请求可解析多个域名。
连接优化
keep-alive
http协议中存在keep-alive(就在请求头里),在HTTP1.1开始默认开启,一定程度上缓解了每次请求都要三次握手建立连接的耗时。
原理是请求完成之后不释放连接,而且放到连接池中缓存。
但是,开启keep-alive的连接一次性只能发送一个请求,在上一个请求处理完成之前,无法接受新的请求。若同时发起多个请求,会发生:
- 若串行发送请求,可以以阻塞队列的方式复用同一个连接,但是速度很慢;
- 若并行发送请求,每个请求都要进程三次握手建立新连接的过程。
问题解决
http2提出了多路复用来解决并行请求的问题。
http2中,也是复用连接,但是一条连接支持同时处理多条请求,所有请求都可以并发在这条连接上进行。
原理是把连接传输的数据都打包成一个个的stream,每个stream都具有标识,stream的发送和接受可以是乱序的,也不存在阻塞的问题,接收端根据标识来区分请求,再进行数据拼接,得到最终数据。
OkHttp默认会开启keep-alive,并且在Okhttp3以上也支持了Http2。
数据压缩
选择序列化方式
- json
- protobuf
请求体压缩
采用gzip对body进行压缩。
OkHttp的BridgeInterceptor这个拦截器会默认开启gzip解压支持:
|
|
压缩之后会在Header中添加Content-Encodin:gzip
。
其他
- webp代替png和jpg;
- 2/3G网络下让服务器下发低清图片;
- 缓存。