HTTP 持久连接(也称为HTTP keep-alive 或 HTTP connection reuse)是使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每个新的请求/应答打开新的连接的方法。
版本发展
在 HTTP 1.0 中,没有官方的 keepalive 操作。通常操作是在先有协议上新增一个指数。如果浏览器支持 keep-alive,它会在请求的包头中添加Connection: Keep-ALive
,当服务器收到请求,并作出回应时,它也会添加一个头在响应中Connection: Keep-ALive
。
这样就可以保存连接。
在 HTTP 1.1 中 所有的连接默认都是持续连接,除非特殊声明不支持。 HTTP 持久连接不使用独立的 keepalive 信息,而是仅仅允许多个请求使用单个连接。然而, Apache 2.0 httpd 的默认连接过期时间[2] 是仅仅15秒,对于 Apache 2.2 只有5秒。[4] 短的过期时间的优点是能够快速的传输多个web页组件,而不会绑定多个服务器进程或线程太长时间。
优势
- 由于同时打开的连接减少,从而降低了CPU 和 内存的使用
- 允许请求和应答的 HTTP 管线化
- TCP 连接的减少,也降低了拥塞控制
- 因为无需再次握手,减少了后续请求的延迟
- 报告错误无需关闭 TCP 连接
劣势
对于现在的广泛普及的宽带连接来说,Keep-Alive也许并不像以前一样有用。web服务器会保持连接若干秒(Apache中默认15秒),这与提高的性能相比也许会影响性能。[7]
对于单个文件被不断请求的服务(例如图片存放网站),Keep-Alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。