← 返回列表

工业以太网与上位机的长连接保活策略

2026-09-27 · 工业通信

车间里的电磁干扰会让交换机端口短暂假死。TCP 连接看起来还在,实际已经收不到任何数据——这就是典型的半开连接。

心跳间隔的权衡

间隔太短会加重设备负担,太长则故障发现不及时。我们最终选定 3 秒:

重连退避

固定间隔重连在设备重启时会形成冲击。指数退避更稳:

delay = min(30, 1 << retry_count)  // 1,2,4,8,16,30,30...

加上 ±20% 的随机抖动,避免多台上位机同时重连。

半开连接的检测

仅靠应用层心跳不够,因为发送成功不代表对端收到。SO_KEEPALIVE 配合调优的内核参数更可靠:

setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle));   // 10s
setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl)); // 3s
setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt));      // 3

这样 19 秒内能发现死连接,比默认的 2 小时快得多。