行业资讯

TCP 连接假死(Half-Open / 死连接)

发布时间:2026/8/22 12:38:48
TCP 连接假死(Half-Open / 死连接) 什么是假死TCP 连接假死是指连接的一端认为连接仍然存活但实际上另一端已经不可用双方无法正常通信。此时 Socket 状态显示为ESTABLISHED但数据无法传输。常见原因原因说明进程崩溃一端进程崩溃但未发送 FIN/RST网络中断网线拔出、路由器故障、防火墙丢包主机宕机/重启断电或崩溃来不及关闭连接中间设备NAT/防火墙超时后静默丢弃连接表项检测手段1. TCP Keepalive内核层# Linux 查看默认参数sysctlnet.ipv4.tcp_keepalive_time# 7200s首次探测前空闲时间sysctlnet.ipv4.tcp_keepalive_intvl# 75s探测间隔sysctlnet.ipv4.tcp_keepalive_probes# 9探测次数⚠️ 默认 2 小时才开始探测太慢生产环境需调优。# 调整参数临时sysctl-wnet.ipv4.tcp_keepalive_time60sysctl-wnet.ipv4.tcp_keepalive_intvl10sysctl-wnet.ipv4.tcp_keepalive_probes3代码中启用intoptval1;setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,optval,sizeof(optval));// 单连接级别设置更灵活intidle60;setsockopt(fd,IPPROTO_TCP,TCP_KEEPIDLE,idle,sizeof(idle));2. 应用层心跳推荐 ⭐内核 Keepalive 只能检测网络无法检测应用假死如进程死锁但 TCP 栈正常。因此推荐应用层心跳Client ──── PING ──── Server Client ─── PONG ───── Server # 超过 N 个周期未收到响应 → 判定假死 → 主动断开重连两种方案对比维度TCP Keepalive应用层心跳检测层级网络层应用层更彻底检测应用死锁❌✅跨平台一致性参数因系统而异✅ 完全可控灵活性低高可携带业务数据最佳实践应用层心跳为主间隔通常 15~60s可根据业务调整设置读超时SO_RCVTIMEO或 IO 多路复用配合超时配合 Keepalive 兜底防止应用漏检心跳失败后主动关闭 重连配合指数退避区分场景移动端弱网需要更短心跳但要平衡耗电与流量