HTTP的连接管理
连接管理是一个 HTTP
的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x
里有多种模型:短连接
, 长连接
, 和 HTTP
流水线。
HTTP
的传输协议主要依赖于 TCP
来提供从客户端到服务器端之间的连接。在早期,HTTP
使用一个简单的模型来处理这样的连接。这些连接的生命周期是短暂的:每发起一个请求时都会创建一个新的连接,并在收到应答时立即关闭。
这个简单的模型对性能有先天的限制:打开每一个 TCP
连接都是相当耗费资源的操作。证明了这个早期模型的效率低下。
有两个新的模型在 HTTP/1.1
诞生了。首先是长连接模型,它会保持连接去完成多次连续的请求,减少了不断重新打开连接的时间。然后是 HTTP
流水线模型,它还要更先进一些,多个连续的请求甚至都不用等待立即返回就可以被发送,这样就减少了耗费在网络延迟上的时间。
短连接
HTTP
最早期的模型,也是 HTTP/1.0
的默认模型,是短连接。每一个 HTTP
请求都由它自己独立的连接完成;这意味着发起每一个 HTTP
请求之前都会有一次 TCP
握手,而且是连续不断的。
TCP
协议握手本身就是耗费时间的,所以 TCP
可以保持更多的热连接来适应负载。短连接破坏了 TCP
具备的能力,新的冷连接降低了其性能。
长连接
短连接有两个比较大的问题:创建新连接耗费的时间尤为明显,另外 · 连接的性能只有在该连接被使用一段时间后 (热连接) 才能得到改善。为了缓解这些问题,长连接 的概念便被设计出来了,甚至在 HTTP/1.1
之前。或者这被称之为一个 keep-alive
连接。
一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP
连接握手的时间,还可以利用 TCP
的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭 (服务器可以使用 Keep-Alive
协议头来指定一个最小的连接保持时间)。