TCP连接保活机制
2023-12-10 20:12:41
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
项中的KeepAliveTime
、KeepAliveInterval
和KeepAliveProbeAttempts
这三个值来配置 TCP 保活参数。
KeepAliveTime
:这是 TCP 保活探测报文的发送间隔时间。默认值为7200秒,即2小时。KeepAliveInterval
:这是 TCP 保活探测报文未收到回复时的重发间隔时间。默认值为1000毫秒,即1秒。KeepAliveProbeAttempts
:这是 TCP 保活探测报文未收到回复时的重发次数。默认值为10次。
总结
TCP 保活机制是一种非常重要的机制,它可以防止僵尸连接的产生,并确保 TCP 连接的可靠性。可以通过修改操作系统中的 TCP 保活参数来配置 TCP 保活机制。