网络:HTTP Keep-Alive 和 TCP Keepalive
HTTP Keep-Alive | TCP Keepalive | |
---|---|---|
含义 | HTTP 长连接,持久连接 | TCP 保活机制 |
实现 | 应用层(用户态) | TCP 层(内核态) |
HTTP Keep-Alive
- HTTP 基于 TCP 协议:
- 进行 HTTP 通信之前,需要先建立 TCP 连接。
- 结束 HTTP 通信之后,需要断开 TCP 连接。
- HTTP 采用请求-应答模式:客户端发起请求,服务端才会返回响应。
短连接 & 长连接
-
短连接:
- 每进行一次 HTTP 请求/应答,都建立和断开一个 TCP 连接。
- 客户端只能串行请求,且增加了双方的通信开销。
-
长连接:
- 只要任意一端没有明确提出断连,则保持 TCP 连接状态。
- 减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻服务端的负载。
Keep-Alive
-
HTTP 1.0 默认关闭:如果要开启
Keep-Alive
,客户端和服务器需要在报文首部中添加。Connection: Keep-Alive
-
HTTP 1.1 默认开启:如果要关闭
Keep-Alive
,需要在报文首部中添加。Connection: close
TCP Keepalive
保活机制:在双方没有数据交互时,通过探测报文来确定对方 TCP 连接是否存活。
触发 TCP 保活机制的条件时,内核的 TCP 协议栈就会发送探测报文。
-
对端程序正常工作:对端收到探测报文后会正常响应,此时会重置 TCP 保活时间。
-
对端主机宕机 or 探测报文不可达:如果达到保活探测次数后仍没收到对端响应,TCP 报告该 TCP 连接已经死亡。
Hint:
- 进程崩溃 ≠ 主机宕机:进程崩溃后操作系统在回收资源时会发送 FIN 报文,而主机宕机无法感知。
- 启用保活机制:应用程序使用 TCP 保活机制,需要通过 socket 设置
SO_KEEPALIVE
选项。