1、什么是Keep-Alive模式?
我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep-Alive连接就看服务器设置情况。
参考:http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
2、盲中继和哑代理
作为一个HTTP代理,盲中继就是不管HTTP报文内容是什么,都进行转发。但是转发Connection头时,如果带有keep-alive属性,那么代理并不会理解keep-alive的意思,在进行完一次事务(request-response)后,代理会挂在哪里等待源端服务器将连接关闭。而此时,客户端和服务端都以为持久化连接已经建立了,还在傻傻的等着继续的发送,这个代理就“哑”了。
Netscape的解决方法
在头上写入Proxy-Connection扩展首部,而不是Connection。如果代理是盲中继,它会将无意义的Proxy-Connection首部转发给web服务器,服务器会忽略此首部,不会带来任何问题;如果代理是个聪明的代理,就用一个Connection首部取代Proxy-Connection首部,如果转发给服务器,收到预期的效果。
在客户端与服务器之间只有一个代理时可以用这种方案。但是如果在哑代理(盲中继)的任何一侧有聪明的代理时,该问题还是无法解决
参考:《HTTP权威指南》 4.5.7
3、管道化连接
HTTP/1.1允许在持久连接上使用管道。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向另一端的服务器时,第二条、第三条请求也可以开始发送了,这样能有效地降低网络的环回时间。
缺点:
1、服务端需要按HTTP请求顺序正确返回Response(也就是请求&响应采用FIFO模式),容易导致Head-of-line blocking:第一个请求的响应发送影响到了后边的请求。
2、事务必须是幂等,因为客户端无法得知当前已经处理到什么地步,重试后可能发生不可预测的结果。GET是幂等的,而POST不是幂等的。比如向一个电商网站POST一张订单,就不能重复执行,否则可能会下多张订单。
参考:《HTTP权威指南》 4.6
http://www.cnblogs.com/cswuyg/p/3653263.html