TCP 的 keepalive
TCP 和 HTTP 都有各自的 keepalive 机制,但它们的目的和实现方式有所不同。
TCP Keepalive
-
目的:TCP 的
keepalive主要用于检测空闲连接是否仍然活跃,帮助识别那些因网络故障或对端崩溃导致的死连接。 -
实现方式:
- TCP
keepalive是在 TCP 层实现的。 - 如果启用了
keepalive,在连接保持空闲一段时间(通常是 2 小时)后,TCP 会发送一个探测包(keepalive probe)给对方。 - 如果对方没有响应,TCP 会继续发送探测包(通常每 75 秒发送一次),在连续多次(通常是 9 次)没有收到对方的响应后,TCP 会认为连接已经断开,并通知应用程序。
- TCP
-
场景:适用于长时间空闲的 TCP 连接,例如长期保持的 SSH 会话或数据库连接。
HTTP Keepalive
-
目的:HTTP 的
keepalive(也称为持久连接)用于在同一 TCP 连接上复用多个 HTTP 请求,减少连接建立和关闭的开销,提高性能。 -
实现方式:
- HTTP
keepalive是在应用层实现的。 - 默认情况下,HTTP/1.1 的连接是持久的,除非客户端或服务器明确关闭连接(通过在响应头中设置
Connection: close)。 - 通过保持连接,客户端可以在同一个 TCP 连接上发送多个 HTTP 请求,而不必为每个请求都建立一个新的 TCP 连接。
- 连接在一段时间后(通常由服务器配置)会自动关闭,或者在请求处理完后明确关闭。
- HTTP
-
场景:适用于需要频繁请求资源的 HTTP 连接,比如浏览器与 Web 服务器之间的通信。
区别总结
- 层次不同:TCP
keepalive工作在传输层,HTTPkeepalive工作在应用层。 - 目的不同:
- TCP
keepalive用于检测连接的健康状态,防止死连接。 - HTTP
keepalive用于提高性能,减少连接建立和关闭的开销。
- TCP
- 实现方式:
- TCP
keepalive通过发送探测包检测连接是否仍然有效。 - HTTP
keepalive通过在同一 TCP 连接上复用多个请求来减少资源消耗。
- TCP
TCP keepalive更多是用于长时间保持的底层连接的稳定性,而 HTTP keepalive则是为了优化短时间内多次请求的效率。