TCP Keep-Alive:维护长寿命的套接字连接
简介
TCP 套接字连接在两个端点之间提供可靠的通信通道。与具有显式保持活动机制的 HTTP 连接不同,TCP 套接字本身并不提供此类功能。为了长时间保持持久连接,TCP 实现了一种称为“保持活动”的机制。
TCP 保持活动过程
TCP 保持活动解决了这种情况连接的一端变得无响应的情况。该过程的功能如下:
-
超时配置:每个操作系统定义三个可配置参数:
-
保活时间: 发送 ACK 数据包之后的不活动时间。
-
保持活动探测: 在声明连接失效之前发送的 ACK 探测数量。
-
Keepalive Interval: ACK 探测之间的时间间隔。
-
流程概要:
- 如果连接仍然存在空闲时间达到 Keepalive Time,将发送 ACK 数据包。
- 如果远程端响应 ACK,则过程重置并继续。
- 如果远程端在 Keepalive Probes ACK 探测后没有响应,连接将通过 RST 数据包终止。
默认情况下,这些值为:
- 保持活动时间: 7200 秒(2 小时)
- Keepalive 探针:9
- Keepalive 间隔:75 秒
配置和注意事项
配置 TCP 超时:
-
每个套接字:Java 目前不支持在套接字级别配置 TCP 超时。
-
系统范围:操作系统提供了调整这些参数的机制。
-
Linux:修改 /proc/sys/net/ipv4/tcp_keepalive_time, / proc/sys/net/ipv4/tcp_keepalive_probes 和 /proc/sys/net/ipv4/tcp_keepalive_intvl.
-
Mac OS X: 使用 sysctl 设置 net.inet.tcp.keepidle, net.inet.tcp.keepcnt 和 net.inet.tcp.keepintvl。
-
Windows: 调整 HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTCPIPParameters 的注册表值。
陷阱:
-
两小时默认值:默认的保持活动时间 2 小时可能会允许过时的连接持续很长一段时间。
-
可选实现: TCP Keep-Alive 并未普遍实现,某些系统可能会选择丢弃不包含数据的 ACK 数据包。
使用建议:
- 对于需要高度可靠和持久连接的应用程序,减少默认的 Keepalive 时间和探测可能是有益的。
- 配置超时时,请考虑响应能力和连接稳定性之间的权衡。
- 注意可能阻止 ACK 数据包的潜在防火墙或网络设备规则,尤其是在使用非标准超时值时。
以上是## TCP Keep-Alive 如何维持长寿命的套接字连接?的详细内容。更多信息请关注PHP中文网其他相关文章!