Connection
用法
在 HTTP/1.1 中,Connection 头是一个逐跳头,用于管理底层 TCP 连接的生命周期。客户端或服务器包含该头以表明连接是保持以供更多请求使用,还是在当前交互之后关闭。
在 HTTP/1.1 中,持久连接是默认行为。发送 Connection: keep-alive 在技术上是多余的,但在实践中仍然常见。Keep-Alive 头与 Connection 头协同工作,用于设置持久连接的超时和请求上限。
Connection 头还承担第二种作用:列出消息中存在的逐跳头字段名。中间节点(代理、网关)在将消息转发到下一跳之前,会移除 Connection 值中列出的任何头。
注意
HTTP/1.0 默认在每个请求-响应周期后关闭连接,需要 Connection: keep-alive 才能实现持久连接。HTTP/1.1 反转了默认行为,因此除非显式发送 Connection: close,否则连接会保持。在一系列请求中的最后一个请求之后发送 Connection: close 以释放服务器资源,或在服务器负载较重时发送。
注意
Connection 头在 HTTP/2 和 HTTP/3 中被禁止。这些协议通过各自的帧层管理连接生命周期。在 HTTP/1.1 和 HTTP/2 之间转换的代理会自动剥离该头。
keep-alive
keep-alive 指令表示发送方希望连接保持打开以供后续请求使用。这是 HTTP/1.1 中的默认行为。当其存在时,Keep-Alive 头提供空闲超时和最大请求数等参数。
close
close 指令告诉对方在完成当前的请求-响应对之后关闭连接。在 HTTP/1.0 中,每次事务后关闭是默认行为。
示例
客户端发送一个带有显式 keep-alive 指令的请求。这告诉服务器在投递响应后保持 TCP 连接打开。
GET /api/status HTTP/1.1
Host: api.example.re
Connection: keep-alive
服务器表示在投递此响应后连接将关闭。客户端会为下一个请求打开一个新的 TCP 连接。
HTTP/1.1 200 OK
Content-Type: application/json
Connection: close
Connection 头还会列出逐跳头。在这个例子中,代理在转发消息之前会剥离 X-Debug-Token 头。
GET /resource HTTP/1.1
Host: example.re
Connection: keep-alive, X-Debug-Token
X-Debug-Token: abc123