Http持久连接、非持久连接和pipeline连接

基本概念

  持久连接:使用同一个TCP连接发送和接受 多个 http请求/应答;
  非持久连接:一个TCP连接只能发送和接受 一个 http请求/应答;

持久连接的两种类型

keep-alive机制(http1.0)

keep-alive握手过程如下:

  1. HTTP/1.0+支持keep-alive连接,但默认并未**。客户端通过发送一个包含Connection: Keep-Alive首部的请求来请求服务器**keep-alive连接,即将这条连接保持在打开状态。
  2. 如果服务器愿意为下一条请求重用此连接,就会在响应中包含相同的首部。若没有,服务器就会在发回响应报文后关闭连接。客户端就是通过检测响应中是否包含Connection:
    Keep-Alive响应首部来判断服务器是否会在发送响应后关闭连接的
  3. 假如服务器同意使用keep-alive连接,那么接下来客户端必须在所有希望保持持久连接的请求中包含Connection: Keep-Alive首部。如果没有发送该首部,服务器会在那条请求后关闭连接。
  4. 那么何时关闭持久连接呢?注意,Connection: Keep-Alive首部只是请求将连接保持在活跃状态。即使服务器和客户端都同意建立持久连接了,它们仍可以在任意时刻关闭空闲的keep-alive连接,且可随意限制keep-alive连接所处理事务的数量。

转自:http://www.jianshu.com/p/0a47fc776314

persistent连接(http1.1)

  Http1.1默认使用持久连接,如果客户端或者服务端任何一方不想使用持久连接,需要通过字段connection:close来通知对方。

pipeline连接

  HTTP/1.1的新特性,允许在持久连接上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。在髙时延网络条件下,这样做可以降低网络的环回时间,提高性能。
Http持久连接、非持久连接和pipeline连接
管道化连接有如下几条限制:

  1. 客户端必须确认是持久连接才能使用管道;
  2. 如果对请求/响应顺序敏感的话,需要客户端与服务端自定义顺序编号
  3. 客户端必须有出错重试机制:如果客户端打开了一条持久连接,并立即发出了10条请求,服务器可能在只处理了5条请求之后关闭连接。剩下的5条请求会失败,客户端必须能够应对这些过早关闭连接的情况,重新发出这些请求;
  4. 尽量使用管道化的方式发送幂等请求