You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TCP连接空闲超时:开启SO_KEEPALIVE仍断连如何解决?

TCP连接存活问题的排查与解决方法

调整TCP KeepAlive的具体参数

仅开启SO_KEEPALIVE选项可能不足以解决问题——Windows默认的KeepAlive参数(空闲2小时后才发送探测包)远长于你遇到的5分钟断开时间。需要手动调整探测时机:

  • 使用WSAIoctl函数设置TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT参数,示例代码如下:
    tcp_keepalive keepAliveParams;
    keepAliveParams.onoff = 1; // 开启KeepAlive
    keepAliveParams.keepalivetime = 120000; // 连接空闲2分钟后开始发送探测包
    keepAliveParams.keepaliveinterval = 10000; // 每10秒发送一次探测包
    DWORD bytesReturned;
    WSAIoctl(connSocket, SIO_KEEPALIVE_VALS, &keepAliveParams, sizeof(keepAliveParams), 
             NULL, 0, &bytesReturned, NULL, NULL);
    
  • 注意:该设置需要在已连接套接字上执行,监听套接字上的设置不会继承到后续的连接套接字。

排查防火墙超时规则

Windows防火墙

  • 打开Windows Defender防火墙的「高级设置」,找到对应业务端口的入站/出站规则,右键选择「属性」:
    • 切换到「高级」标签,检查「连接超时」设置,若有固定超时值,改为0(无超时)或大于5分钟的数值;
    • 确保规则允许TCP会话的所有流量(包括KeepAlive探测包,它会复用已建立的TCP连接端口)。

AWS安全组

  • 确认EC2实例的安全组入站规则允许客户端IP/网段访问服务端业务端口,且没有配置过短的会话超时(AWS默认TCP会话超时为3600秒,若有自定义调整需确保大于5分钟)。

应用层主动心跳机制

如果系统级KeepAlive仍被中间设备或防火墙拦截,可在应用层实现心跳逻辑:

  • 客户端和服务端每隔2-3分钟互相发送一个轻量心跳包(比如一个固定字节的标识),对方收到后回复确认;
  • 心跳包无需复杂数据,仅需维持TCP会话的流量活性,避免连接因长时间无数据被断开;
  • 同时添加心跳超时检测,若连续多次未收到心跳回复,可主动触发重连逻辑。

调整Windows系统TCP注册表参数

通过修改注册表全局调整TCP KeepAlive行为(需管理员权限):

  1. 打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters;
  2. 新建以下DWORD值(十进制):
    • KeepAliveTime:设置为120000(2分钟,空闲多久后开始发送探测包);
    • KeepAliveInterval:设置为10000(10秒,探测包发送间隔);
    • TcpMaxDataRetransmissions:设置为5(探测失败后重传次数);
  3. 重启系统使设置生效。

内容的提问来源于stack exchange,提问作者Anchit Rana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:37:18