TCP 的 keepalive

TCP 和 HTTP 都有各自的 keepalive 机制,但它们的目的和实现方式有所不同。

TCP Keepalive

  • 目的:TCP 的keepalive主要用于检测空闲连接是否仍然活跃,帮助识别那些因网络故障或对端崩溃导致的死连接。

  • 实现方式

    • TCP keepalive 是在 TCP 层实现的。
    • 如果启用了keepalive,在连接保持空闲一段时间(通常是 2 小时)后,TCP 会发送一个探测包(keepalive probe)给对方。
    • 如果对方没有响应,TCP 会继续发送探测包(通常每 75 秒发送一次),在连续多次(通常是 9 次)没有收到对方的响应后,TCP 会认为连接已经断开,并通知应用程序。
  • 场景:适用于长时间空闲的 TCP 连接,例如长期保持的 SSH 会话或数据库连接。

HTTP Keepalive

  • 目的:HTTP 的keepalive(也称为持久连接)用于在同一 TCP 连接上复用多个 HTTP 请求,减少连接建立和关闭的开销,提高性能。

  • 实现方式

    • HTTP keepalive 是在应用层实现的。
    • 默认情况下,HTTP/1.1 的连接是持久的,除非客户端或服务器明确关闭连接(通过在响应头中设置Connection: close)。
    • 通过保持连接,客户端可以在同一个 TCP 连接上发送多个 HTTP 请求,而不必为每个请求都建立一个新的 TCP 连接。
    • 连接在一段时间后(通常由服务器配置)会自动关闭,或者在请求处理完后明确关闭。
  • 场景:适用于需要频繁请求资源的 HTTP 连接,比如浏览器与 Web 服务器之间的通信。

区别总结

  1. 层次不同:TCP keepalive 工作在传输层,HTTP keepalive 工作在应用层。
  2. 目的不同
    • TCP keepalive用于检测连接的健康状态,防止死连接。
    • HTTP keepalive用于提高性能,减少连接建立和关闭的开销。
  3. 实现方式
    • TCP keepalive通过发送探测包检测连接是否仍然有效。
    • HTTP keepalive通过在同一 TCP 连接上复用多个请求来减少资源消耗。

TCP keepalive更多是用于长时间保持的底层连接的稳定性,而 HTTP keepalive则是为了优化短时间内多次请求的效率。