HTTP持久连接

看看wikipedia的定义

HTTP持久连接(HTTP persistent connection,也称作HTTP keep-alive或HTTP connection reuse)是使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法。

如果浏览器支持 keep-alive,它会在请求的包头中添加:
Connection: Keep-Alive
然后当服务器收到请求,作出回应的时候,它也添加一个头在响应中:
Connection: Keep-Alive
这样做,连接就不会中断,而是保持连接。当客户端发送另一个请求时,它会使用同一个连接。这一直继续到客户端或服务器端认为会话已经结束,其中一方中断连接。
在 HTTP 1.1 中 所有的连接默认都是持续连接,除非特殊声明不支持。HTTP 持久连接不使用独立的 keepalive 信息,而是仅仅允许多个请求使用单个连接。然而, Apache 2.0 httpd 的默认连接过期时间是仅仅15秒 ,对于 Apache 2.2 只有5秒。短的过期时间的优点是能够快速的传输多个web页组件,而不会绑定多个服务器进程或线程太长时间。
优势

较少的CPU和内存的使用(由于同时打开的连接的减少了)
允许请求和应答的HTTP管線化
降低网络阻塞 (TCP连接减少了)
减少了后续请求的延遲(无需再进行握手)
报告错误无需关闭TCP连接

当然,keepalive也不好的地方。
对于单个文件被不断请求的服务(例如专门的图片服务器),Keep-Alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。

HTTP persistent connection过程图示:
HTTP persistent connection
参考:
https://en.wikipedia.org/wiki/HTTP_persistent_connection
https://zh.wikipedia.org/wiki/HTTP%E6%8C%81%E4%B9%85%E9%93%BE%E6%8E%A5

HTTP persistent connection在Apache中的应用
了解HTTP persistent connection对于Apache的KeepAlive指令的配置有很大的帮助。

Apache的KeepAlive指令
The Keep-Alive extension to HTTP/1.0 and the persistent connection feature of HTTP/1.1 provide long-lived HTTP sessions which allow multiple requests to be sent over the same TCP connection. In some cases this has been shown to result in an almost 50% speedup in latency times for HTML documents with many images. To enable Keep-Alive connections, set KeepAlive On.
也就是说只有HTTP/1.1才支持持久连接。持久连接允许在同一个TCP连接中发送多个请求。

https://httpd.apache.org/docs/2.4/mod/core.html#keepalivetimeout
可以用KeepAlive On 指令开启KeepAlive.
需要注意的是,一个Keep-Alive连接只会被 MaxConnectionsPerChild 指令算作一个单一的请求,而不管在一个Keep-Alive连接的请求有多少次。
When a client uses a Keep-Alive connection it will be counted as a single "request" for the MaxConnectionsPerChild directive, regardless of how many requests are sent using the connection. (https://httpd.apache.org/docs/2.4/mod/core.html#keepalivetimeout

这个连接可以持续多久呢?
KeepAliveTimeout指令可以进行设置。默认是5秒钟。也可以加上ms指定为毫秒。
一般设定为1-5秒都是可以的。由于在这个时间内,一次请求即使完全了,连接也不会关闭,服务器会继续等待来自客户端的请求,因此,这个值不能设置太大。但是,设置太小了又不能够发挥其应有的作用。
Once a request has been received, the timeout value specified by the Timeout directive applies.
一旦服务器接收到一个请求, Timeout指令设置的超时便会便应用于这个请求。

MaxKeepAliveRequests 是从另外一个方面来限制持续连接的时间。当一个KeepAlive连接请求数量达到这个设定值时,服务器便会关闭这个连接以释放资源。

更多
One Response Post a comment
  1. 潜行者m

    字体有点小,英文有点多,加粗+下划线,有种小小的眩晕的感觉

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS