Http1.0 到Http2.0 的升级
场景: 浏览器访问网页,网页内有 5张图片。五个图片资源存在同一台服务器上。按照HTTP1.0的做法,这需要建立五个TCP连接,每个连接负责一个资源请求。创建一个TCP连接需要3次握手,而释放连接则需要4次挥手手。重复的创建和释放连接极大地影响了网络效率。
Http1.1 升级:
HTTP/1.1提出了Keep-Alive机制:当一个HTTP请求的数据传输结束后,TCP连接不立即释放,如果此时有新的HTTP请求,且其请求的Host通上次请求相同,则可以直接复用为释放的TCP连接,从而省去了TCP的释放和再次创建的开销,减少了网络延时。
Http1.x 到Http 2.0 升级
- 报头压缩:HTTP/2使用HPACK压缩格式压缩请求和响应报头数据,减少不必要流量开销
- 请求与响应复用:HTTP/2通过引入新的二进制分帧层实现了完整的请求和响应复用,客户端和服务器可以将HTTP消息分解为互不依赖的帧,然后交错发送,最后再在另一端将其重新组装
- 数据流的优先级 。与流控制。
HTTP/2引入了三个新的概念
数据流:基于TCP连接之上的逻辑双向字节流,对应一个请求及其响应。客户端每发起一个请求就建立一个数据流,后续该请求及其响应的所有数据都通过该数据流传输
消息:一个请求或响应对应的一系列数据帧
帧:HTTP/2的最小数据切片单位
Http2 的多路复用机制
- TCP 连接复用
- 帧复用 ,相于一个对象池。
OkHttp 连接池
OKHttp 通过连接池来实现,KeepAlive 与 多路复用。
OkHttp内部通过ConnectionPool来管理连接池。
- 连接实现,java.net.Socket
- 重用机制
- 清除机制使用 线程池,线程的工厂方法设置为 Daemon 线程
- 清除机制使用的是 计数法加弱引用 。 空闲socket连接超过5个且 keepalive时间大于5分钟。就会清理掉idle 连接。