4. 常见 Socket 异常分类:连接超时、连接被拒绝、连接重置、半开连接、端口未监听
在 SECS/GEM 通信中,Socket 异常是导致设备离线、数据丢失或制程中断的主要原因。本章将系统梳理五种最常见的 Socket 异常类型,分析其成因、典型现象及诊断方向。理解这些异常的本质,是快速定位通信故障的基础。
4.1 连接超时 (Connection Timeout)
连接超时是指客户端发起 TCP 连接请求后,在预定的超时时间内未收到服务端的 SYN-ACK 响应。在 SECS/GEM 环境中,这通常意味着网络路径不通、防火墙丢弃了 SYN 包,或对端设备处于不可达状态。
| 诊断维度 | 典型表现 | 常见原因 |
|---|---|---|
| 网络层 | ping 不通或延迟极高 | 物理链路故障、路由不可达 |
| 传输层 | connect() 返回 ETIMEDOUT | 防火墙丢弃 SYN、对端负载过高 |
| 应用层 | SECS 连接建立阶段卡在等待 | HSMS 握手超时 (T3 计时器到期) |
tcpdump -i eth0 host 目标IP and port 5000 抓包,观察是否有 SYN 发出但无 SYN-ACK 返回。若连续重试均超时,优先排查网络连通性和防火墙规则。
4.2 连接被拒绝 (Connection Refused)
连接被拒绝发生在客户端 SYN 到达服务端,但服务端对应端口上没有进程在监听,此时服务端 TCP 协议栈会回复 RST 包。在 SECS/GEM 中,常见于 HSMS 服务未启动、端口号配置错误或服务崩溃后未自动重启。
- 错误码:connect() 返回 ECONNREFUSED (Linux) 或 WSAECONNREFUSED (Windows)。
- 抓包特征:SYN 发出后立即收到 RST,三次握手未完成。
- SECS 场景:主动连接方 (通常是 Host) 向 Equipment 发起连接,但 Equipment 的 HSMS 服务未运行。
4.3 连接重置 (Connection Reset)
连接重置发生在已建立的 TCP 连接上,一方突然发送 RST 包终止连接。在 SECS/GEM 长连接中,这是最频繁出现的异常之一,通常由应用层异常退出、双工模式不匹配或 Keep-Alive 机制触发。
| 触发场景 | SECS/GEM 典型表现 | 诊断方法 |
|---|---|---|
| 应用层崩溃 | 设备突然离线,日志无正常断开记录 | 检查设备进程状态、core dump 文件 |
| Keep-Alive 超时 | 长时间无数据交互后连接断开 | 调整 TCP Keep-Alive 参数 (tcp_keepalive_time) |
| 双工模式不匹配 | 半双工设备收到全双工数据 | 检查网卡协商模式 (ethtool) |
4.4 半开连接 (Half-Open Connection)
半开连接是指 TCP 连接的一端已经崩溃或异常关闭,而另一端仍然认为连接处于 ESTABLISHED 状态。在 SECS/GEM 中,这是最隐蔽的异常——设备端显示连接正常,但实际已无法收发数据,导致 HSMS 心跳超时 (T3 超时) 和链路断开。
半开连接的典型成因:
- 设备突然断电或网络闪断,未发送 FIN 包。
- 防火墙或 NAT 设备在空闲超时后静默移除连接表项。
- 设备端 HSMS 服务进程被 kill -9 强制终止。
诊断方法:
- 在 Host 端执行
ss -t -o state established查看连接状态。 - 发送 SECS Link Test (S9F1/S9F2) 消息,观察是否在 T3 时间内收到响应。
- 使用
tcpdump抓取双向流量,确认是否有单向数据中断。
4.5 端口未监听 (Port Not Listening)
端口未监听与连接被拒绝类似,但区别在于:端口未监听时,服务端可能根本没有启动 TCP 监听,或者监听在错误的 IP/端口组合上。在 SECS/GEM 配置中,常见于端口号冲突、服务绑定地址错误 (如绑定到 127.0.0.1 而非 0.0.0.0) 或防火墙仅开放了部分端口。
| 对比项 | 连接被拒绝 | 端口未监听 |
|---|---|---|
| TCP 行为 | 服务端回复 RST | 无响应 (超时) 或回复 RST |
| 服务端状态 | 端口被占用但应用未处理 | 端口完全未被监听 |
| SECS 场景 | HSMS 服务崩溃但端口仍被占用 | HSMS 服务未启动或配置错误 |
| 诊断命令 | netstat -tlnp | grep 5000 |
ss -tln | grep 5000 |
1. 在服务端执行
ss -tlnp | grep <端口号> 确认监听状态。2. 检查服务配置文件中的
LISTENER_PORT 和 BIND_ADDRESS 参数。3. 使用
telnet <IP> <端口> 从客户端测试端口可达性。4. 查看防火墙规则:
iptables -L -n | grep <端口> 或 firewall-cmd --list-ports。
4.6 异常对比与诊断优先级
在实际 SECS/GEM 故障排查中,建议按照以下优先级顺序进行诊断,以最快缩小问题范围:
- 第一步:检查端口监听状态 —— 排除端口未监听和连接被拒绝。
- 第二步:检查网络连通性 —— 排除连接超时。
- 第三步:检查连接稳定性 —— 通过抓包识别连接重置。
- 第四步:检查应用层心跳 —— 发现半开连接。