我们知道,HTTP 请求是在 TCP 的连接上进行发送的,TCP 的连接就可以被分为长连接和短连接。HTTP 请求发送之前首先需要创建 TCP 连接,在 TCP 连接上发送 HTTP 请求并接受返回的内容。
一次 HTTP 请求结束以后,浏览器与服务器端就会商量是否关闭这个 TCP 连接,如果这个连接保持着就可以被称为长连接。 保持 TCP 长连接会有一定的消耗,但是如果之后还有请求就可以在这个已有的 TCP 连接上进行发送,就不需要再次创建 TCP 连接。
如果 TCP 连接在 HTTP 请求结束以后被直接关闭了,就可以把这个 TCP 连接称为短连接。它没有维持 TCP 长连接的消耗,但是下一次发送请求时又需要重新创建一个 TCP 连接。
在并发量比较大的网站,如果每次发送 HTTP 请求都需要创建一次 TCP 连接,那么多次创建 TCP 连接的开销可能比保持长连接的开销要更大。而且 TCP 长连接可以设置过期时间,如果过了规定的时间这个 TCP 连接上没有新的请求,这个连接就会被自动关闭。因此现在大部分网站都是 保持长连接。
建立长连接是一个协商的过程,浏览器会在请求头加入Connection: keep-alive
,表示浏览器是希望服务器端建立长连接的。服务端返回的时候可以选择是否保持长连接,如果响应头设置的是Connection: close
则表示不保持长连接,那么浏览器就会关闭这个连接。
在 HTTP/1.0 中,默认使用的是短连接。HTTP/1.1 起默认使用的是长连接,可以在同一个连接里发送多个请求,但是这些请求是串行的。
在 HTTP2 里出现了一个新的概念 — 信道复用,在一个 TCP 连接上可以并发地发送多个 HTTP 请求。一个用户连接一个网站时只需要创建一个 TCP 连接,对比之前需要创建多个 TCP 连接,开销降低了很多。
注意:只有同域请求才能使用同一个 TCP 连接。