工业以太网与上位机的长连接保活策略
车间里的电磁干扰会让交换机端口短暂假死。TCP 连接看起来还在,实际已经收不到任何数据——这就是典型的半开连接。
心跳间隔的权衡
间隔太短会加重设备负担,太长则故障发现不及时。我们最终选定 3 秒:
- PLC 侧心跳开销可忽略(每 3 秒一个 16 字节帧)
- 最坏情况下 9 秒内(3 个周期)能确认断线
- 低于 2 秒时,部分老旧网关会主动限流
重连退避
固定间隔重连在设备重启时会形成冲击。指数退避更稳:
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 小时快得多。