Skip to main content

长连接(http)keep-alive

HTTP 是 Hyper Text Transfer Protocol 的缩写,该协议是用于从万维网服务器传输超文本到本地浏览器的传送协议,且它是基于 TCP/IP 通信协议来传递数据。

短连接,是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。 长连接,指在一个连接上可以连续发送多个数据包。

HTTP 协议的初始版本中 HTTP 是如何进行通信的。

HTTP/1.1 和一部分的 HTTP/1.0 实现长连接(HTTP Persistent Connections)的方法:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x

长连接有什么优点呢?

  1. 长连接的好处在于减少了 TCP 连接重复建立和断开所造成的额外开销,可以使得 HTTP 请求和响应能够更早的结束,同样 Web 的响应速度也会相应提高。

  2. 尽可能规避 TCP 的慢启动(拥塞控制算法)。

TCP 慢启动介绍: 当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量的数据注入到网络环境中,就有可能会引起网络的拥塞,经大量实验验证之后,较好的方法是先探测一下,由小到大的增大发送窗口。

HTTP/1.1 如何实现的长连接?

在 HTTP/1.1 之前或 HTTP/1.1 使用了 Connection:close,HTTP 响应结束之后,服务器和客户端的关系也就结束了 HTTP/1.1 版本中长连接是默认开启的,即 Connection:Keep-Alive。所以客户端可以长连接上连续发送请求。只有服务端想明确断开连接时则指定 Connection:close

服务端

Keep-Alive 能够实现,需要服务端支持: Http 守护进程,如 nginx 需要设置 keepalive_timeout 这个 keepalive_timout 时间值意味着:一个 http 产生的 tcp 连接在传送完最后一个响应后,还需要 hold 住 keepalive_timeout 秒后,才开始关闭这个连接。

  • keepalive_timeout=0:建立 tcp 连接 + 传送 http 请求 + 执行时间 + 传送 http 响应 + 关闭 tcp 连接 + 2MSL
  • keepalive_timeout>0:建立 tcp 连接 + (最后一个响应时间 – 第一个请求时间) + 关闭 tcp 连接 + 2MSL