一、有关http协议
http协议是无状态的协议,即每一次请求都是互相独立的。因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接。
http协议使用的全双工的协议(串行连接):
建立连接与断开连接需要经过三次握手和四次挥手。在这种设计中,每次交互都会消耗额外资源:连接的建立和销毁。
发展为持续连接:
第一次交互会打开连接,交互结束后连接并不关闭,下次交互就省去了建立连接的过程。持久连接的实现有两种:HTTP/1.0+的keep-alive与HTTP/1.1的持久连接
二、HttpClient中的http持久连接
2.1 HttpClient连接池的原理:
当有连接第一次使用的时候建立连接;结束时对应连接不关闭,归还到池中;下次同个目的的连接可从池中获取一个可用连接;定期清理过期连接;
2.2 HttpClient连接池的实现
HttpClient通过连接池来管理持久连接,连接池分为两个,一个是总连接池,一个是每个route对应的连接池HttpClient通过异步的Future<CPoolEntry>来获取一个池化的连接默认连接重用策略与HTTP协议约束一致,根据response先判断Connection:Close则关闭,在判断Connection:Keep-Alive则开启,最后版本大于1.0则开启只有在HttpClientBuilder中手动开启了清理过期与空闲连接的开关后,才会清理连接池中的连接HttpClient4.4之后的版本通过一个死循环线程清理过期与空闲连接,该线程每次执行都sleep一会,以达到定期执行的效果
2.3 HttpClient对持久连接的复用
如果request首部中包含Connection:Close,不复用如果response中Content-Length长度设置不正确,不复用如果response首部包含Connection:Close,不复用如果reponse首部包含Connection:Keep-Alive,复用都没命中的情况下,如果HTTP版本高于1.0则复用
2.4 HttpClient清理过期连接
只有在HttpClientBuilder手动设置后,才会开启清理过期与空闲连接手动设置后,会启动一个线程死循环执行,每次执行sleep一定时间,调用HttpClientConnectionManager的清理方法清理过期与空闲连接。
三、httpclient连接池的使用