HTTP持久连接

持久连接:

HTTP/1.1允许HTTP设备在事务处理结束后将TCP连接保持在打开的状态,以便为未来的HTTP请求重用现在的连接。

在事务处理结束后仍然保持在打开状态的TCP连接称为持久连接。

非持久连接会在每个事务结束后关闭。

持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止。


并行连接:

并行连接可以提高复合页面的传输速度,但并行连接也会有一些缺点:

  • 每个事务都会打开或关闭一条新的连接,会耗费时间和宽带

  • 由于TCP慢启动特性的存在,每条新连接的性能都会有所降低

  • 可打开的并行连接数量实际上是有限的


HTTP/1.0+之keep-alive连接

keep-alive已经不再使用了,而且在当前的HTTP/1.1规范中也没有对他的说明,但浏览器和服务器对keep-alive握手的使用仍然相当广泛,因此,HTTP的实现者应该做好与之进行交互操作的准备。

实现HTTP/1.0 keep-alive连接的客户端可以通过包含Connection:keep-alive首部请求将一条连接保持在打开状态。

如果服务器愿意为下一条请求将连接保持在打开状态,就在响应中包含相同的首部。如果响应中没有Connection:Keep-Alive首部,客户端就认为服务器不支持keep-alive,会在发回响应报文之后关闭连接。

例如谷歌浏览器发送的request请求报文Connection:keep-alive

GET /xinxingegeya/blog/267845 HTTP/1.1
Host: my.oschina.net
Connection: keep-alive
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Pragma: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 LBBROWSER
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
=================================================================
返回报文--报文首部Keep-Alive: timeout=20(timeout设置keep-alive的超时)
并且返回报文中有Connection:keep-alive说明支持keep-alive连接
=================================================================

HTTP/1.1 200 OK
Server: Tengine
Date: Fri, 23 May 2014 10:56:12 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Cache-Control: must-revalidate, no-cache, private
Pragma: no-cache
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Content-Encoding: gzip

注意,Keep-Alive首部只是将连接保持在活跃状态。

发出keep-alive请求之后,客户端和服务器端并不一定同意进行keep-alive会话,他们可以在任意时刻关闭空闲的keep-alive连接,并可随意限制keep-alive连接所处理事务的数量。


HTTP/1.1持久连接

HTTP/1.1逐渐停止了对keep-alive连接的支持,用一种名为持久连接(persistent connection)的改进型设计取代了它,持久连接的目的与keep-alive连接的目的相同,但工作机制更优一些。

与HTTP/1.0+的keep-alive连接不同,HTTP/1.1持久连接在默认情况下是激活的。除非特别指明,否则HTTP/1.1假定所有连接都是持久的。

要在事务处理结束后将连接关闭,HTTP/1.1应用程序必须向报文中显示添加一个Connection:close首部。这是与以前的HTTP版本很重要的区别。在以前的版本中,keep-alive要么是可选的,要么是根本不支持的。

HTTP/1.1客户端假定在收到响应后,除非响应中包含了Connection:close首部,不然HTTP/1.1连接就仍维持在打开状态,但是客户端和服务器端仍然可以随时关闭空闲的连接,不发送Connection:close并不意味着服务器承诺永远将连接保持在打开状态。

HTTP/1.1也可以发送Connection:close首部进行持久连接的关闭

当然HTTP/1.1持久连接也会有一些限制和规则。



你可能感兴趣的:(HTTP持久连接)