KeepAlive随笔

参数说明 :
 1 . SocketTimeout               // 响应超时时间,超过此时间不再读取响应
 2 . ConnectTimeout    // 链接建立的超时时间
 3 . ConnectionRequestTimeout // HttpClient中,从Connetcion Pool中获得一个Connection的超时时间

 


TCP Keep-Alive :
 1 . 链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,
  当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,
  链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。
 
 2 . TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,
  TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,
  说明对方还在线,链接可以继续保持,如果对方没有报文返回,
  并且重试了多次之后则认为链接丢失,没有必要保持链接。
 
 
Http Keep-Alive :
 1 . 一个完整的HTTP事务,有链接的建立,请求的发送,响应接收,断开链接这四个过程,
  早期通过HTTP协议传输的数据以文本为主,一个请求可能就把所有要返回的数据取到,
  但是,现在要展现一张完整的页面需要很多个请求才能完成,如图片,JS,CSS等,
  如果每一个HTTP请求都需要新建并断开一个TCP,这个开销是完全没有必要的。
 
 2 . 开启HTTP Keep-Alive之后,能复用已有的TCP链接,当前一个请求已经响应完毕,
  服务器端没有立即关闭TCP链接,而是等待一段时间接收浏览器端可能发送过来的第二个请求,
  通常浏览器在第一个请求返回之后会立即发送第二个请求,如果某一时刻只能有一个链接,
  同一个TCP链接处理的请求越多,开启Keep-Alive能节省的TCP建立和关闭的消耗就越多。
  
 3 . 使用Keep-Alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。
     通过使用Keep-Alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,
  以此提高性能和提高httpd服务器的吞吐率(更少的TCP连接意味着更少的系统内核调用,Socket的accept()和close()调用)。
  
 4 . 但是,Keep-Alive并不是免费的午餐,长时间的TCP连接容易导致系统资源无效占用。
  配置不当的Keep-Alive,有时比重复利用连接带来的损失还更大。
  
 5 . 如果要在HTTP1.0中支持Keep-Alive,必须明确的在header中加入Connection:keep-alive。
   <1> Client发起一个包含Connection:keep-alive的请求。
   <2> Server收到请求后,如果server支持keepalive,回复一个包含Connection:keep-alive的响应,
    不关闭连接,否则回复一个包含Connection:close的响应,关闭连接。
   <3> 如果client收到包含Connection:keep-alive的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。
posted @ 2017-05-18 09:32  Cousoulis  阅读(209)  评论(0编辑  收藏  举报