返回

TCP连接保活机制

后端

TCP 连接为什么要保活?

一个 TCP 连接由源IP地址、源端口、目标IP地址、目标端口这四元组来唯一标识,连接的建立需要经历“三次握手”,而连接的释放也需要经历“四次挥手”,并且“四次挥手”是需要由服务端或客户端其中一方主动发起。

在某些情况下,由于网络故障、设备故障或者人为操作等原因,可能会导致 TCP 连接处于一种“半开”状态,即连接的一方认为连接已经断开,而另一方还认为连接是有效的。这种状态下的连接被称为“僵尸连接”。

僵尸连接会占用系统资源,而且还会对网络性能产生负面影响。因此,为了避免僵尸连接的产生,需要对 TCP 连接进行保活。

常见的 TCP 保活机制

目前,常见的 TCP 保活机制主要有两种:

  • TCP Keepalive :这是最常见的 TCP 保活机制。它允许主机定期向对方发送探测报文,以检查连接是否仍然有效。如果对方没有在一定时间内回复探测报文,则认为连接已经断开。
  • TCP Fast Open :这是一种相对较新的 TCP 保活机制。它允许主机在建立连接时发送一个特殊的标志位,以告诉对方自己支持快速打开。如果对方也支持快速打开,则可以在不进行“三次握手”的情况下直接建立连接。

TCP 保活机制的实现原理

TCP Keepalive 的实现原理很简单。主机定期向对方发送探测报文,以检查连接是否仍然有效。如果对方没有在一定时间内回复探测报文,则认为连接已经断开。

探测报文通常是一个小数据包,其中包含了连接的四元组信息。探测报文不会携带任何数据,也不会对网络性能产生任何影响。

如果对方收到了探测报文,则会回复一个确认报文。确认报文同样是一个小数据包,其中包含了连接的四元组信息。

如果主机在一定时间内没有收到对方的确认报文,则认为连接已经断开。主机会尝试重新建立连接。

如何配置 TCP 保活参数

TCP 保活参数可以在操作系统中进行配置。不同的操作系统可能会有不同的配置方式。

在 Linux 系统中,可以通过修改/proc/sys/net/ipv4/tcp_keepalive_time/proc/sys/net/ipv4/tcp_keepalive_intvl/proc/sys/net/ipv4/tcp_keepalive_probes这三个参数来配置 TCP 保活参数。

  • /proc/sys/net/ipv4/tcp_keepalive_time:这是 TCP 保活探测报文的发送间隔时间。默认值为7200秒,即2小时。
  • /proc/sys/net/ipv4/tcp_keepalive_intvl:这是 TCP 保活探测报文未收到回复时的重发间隔时间。默认值为75秒。
  • /proc/sys/net/ipv4/tcp_keepalive_probes:这是 TCP 保活探测报文未收到回复时的重发次数。默认值为9次。

在 Windows 系统中,可以通过修改注册表中的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters项中的KeepAliveTimeKeepAliveIntervalKeepAliveProbeAttempts这三个值来配置 TCP 保活参数。

  • KeepAliveTime:这是 TCP 保活探测报文的发送间隔时间。默认值为7200秒,即2小时。
  • KeepAliveInterval:这是 TCP 保活探测报文未收到回复时的重发间隔时间。默认值为1000毫秒,即1秒。
  • KeepAliveProbeAttempts:这是 TCP 保活探测报文未收到回复时的重发次数。默认值为10次。

总结

TCP 保活机制是一种非常重要的机制,它可以防止僵尸连接的产生,并确保 TCP 连接的可靠性。可以通过修改操作系统中的 TCP 保活参数来配置 TCP 保活机制。