2. Socket通信原理:TCP/IP四层模型、Socket API与三次握手
在SECS/GEM设备通信中,底层依赖TCP Socket实现可靠的数据传输。理解TCP/IP协议栈的分层结构、Socket API的调用流程以及连接建立与释放的握手机制,是诊断通信异常、配置防火墙规则的基础。
2.1 TCP/IP四层模型
SECS/GEM通信通常运行在以太网之上,遵循TCP/IP协议栈。与OSI七层模型相比,TCP/IP四层模型更贴近实际实现,每一层都有明确的职责。
| 层级 | 名称 | 核心协议/组件 | 在SECS/GEM中的角色 |
|---|---|---|---|
| 4 | 应用层 | SECS-I、HSMS、GEM | 定义消息格式、会话管理和设备行为 |
| 3 | 传输层 | TCP、UDP | 提供可靠字节流(TCP),端口寻址 |
| 2 | 网络层 | IP、ICMP | 路由寻址,数据包转发 |
| 1 | 网络接口层 | 以太网、MAC地址 | 物理介质访问,帧封装 |
关键点:SECS/GEM的HSMS(High-Speed SECS Message Services)协议直接运行在TCP之上,不依赖HTTP或其他应用层协议。因此,传输层(TCP)的稳定性直接决定通信质量。
2.2 Socket API核心函数
Socket API是应用层与TCP/IP协议栈之间的编程接口。在SECS/GEM的HSMS通信中,通常采用客户端-服务器(C/S)模式。设备作为服务器(Passive),主机作为客户端(Active),或反之。
2.2.1 服务器端流程
- socket():创建套接字,指定地址族(AF_INET)、类型(SOCK_STREAM)和协议(TCP)。
- bind():将套接字绑定到本地IP地址和端口号。
- listen():将套接字设为监听模式,等待客户端连接。
- accept():阻塞等待,接受客户端连接请求,返回新的连接套接字。
- recv() / send():通过连接套接字收发数据。
- close():关闭连接。
2.2.2 客户端流程
- socket():创建套接字。
- connect():向服务器发起TCP连接请求(指定IP和端口)。
- send() / recv():收发数据。
- close():关闭连接。
调试提示:在SECS/GEM通信中,bind()失败通常意味着端口被占用;connect()超时则可能由防火墙拦截或IP不可达引起。使用 netstat -an | grep :端口号 可快速检查端口状态。
2.3 三次握手与四次挥手
TCP是面向连接的协议,在数据传输前必须建立连接(三次握手),在传输结束后必须释放连接(四次挥手)。这两个过程是防火墙规则调试的核心关注点。
2.3.1 三次握手(建立连接)
| 步骤 | 发送方 | 报文 | 含义 |
|---|---|---|---|
| 1 | 客户端 → 服务器 | SYN=1, seq=x | 请求建立连接,初始序列号x |
| 2 | 服务器 → 客户端 | SYN=1, ACK=1, seq=y, ack=x+1 | 同意连接,确认客户端序列号,发送自己的初始序列号y |
| 3 | 客户端 → 服务器 | ACK=1, seq=x+1, ack=y+1 | 确认服务器序列号,连接建立完成 |
防火墙影响:如果防火墙丢弃了SYN包(步骤1),客户端会反复重试直到超时,表现为 connect() 长时间无响应。如果防火墙丢弃了SYN+ACK包(步骤2),客户端会收到RST或持续等待,日志中常见“Connection timed out”。
2.3.2 四次挥手(释放连接)
| 步骤 | 发送方 | 报文 | 含义 |
|---|---|---|---|
| 1 | 主动方 → 被动方 | FIN=1, seq=u | 主动方发送连接释放请求 |
| 2 | 被动方 → 主动方 | ACK=1, seq=v, ack=u+1 | 被动方确认,进入半关闭状态 |
| 3 | 被动方 → 主动方 | FIN=1, ACK=1, seq=w, ack=u+1 | 被动方数据发送完毕,释放连接 |
| 4 | 主动方 → 被动方 | ACK=1, seq=u+1, ack=w+1 | 主动方确认,等待2MSL后关闭 |
SECS/GEM场景:当设备断电或网络异常中断时,可能无法完成四次挥手,导致对端出现“半开连接”(Half-Open Connection)。此时,SECS/GEM的HSMS协议会通过心跳(Heartbeat)机制检测并清理死连接。防火墙规则中应允许心跳包(通常为小数据包)通过。
2.4 常见Socket通信异常与防火墙关联
| 异常现象 | 可能原因 | TCP层表现 | 防火墙排查点 |
|---|---|---|---|
connect() 超时 |
目标IP不可达或端口未监听 | SYN包无响应,重试直至超时 | 检查出站规则是否允许SYN包;目标端口是否开放 |
connect() 被拒绝 |
端口未监听或防火墙发送RST | 收到RST包 | 检查入站规则是否允许SYN;端口是否被占用 |
| 连接建立后立即断开 | 防火墙重置连接或心跳超时 | 收到RST或FIN | 检查会话超时设置;应用层心跳是否被拦截 |
| 数据发送后无响应 | 防火墙拦截数据包或对端崩溃 | 数据包无ACK,触发重传 | 检查数据包大小是否超过MTU;应用层协议是否被误判 |
实用命令:使用 tcpdump -i eth0 host 192.168.1.100 and port 5000 可以实时抓取SECS/GEM通信的TCP握手和挥手包,直接观察SYN、ACK、FIN、RST标志位,快速定位问题。
2.5 小结
- TCP/IP四层模型为SECS/GEM通信提供了分层清晰的协议栈,传输层TCP保证数据可靠有序。
- Socket API的
bind/listen/accept/connect是构建C/S通信的基础,每一步都可能成为故障点。 - 三次握手建立连接,四次挥手释放连接;防火墙规则必须允许握手包(SYN、SYN+ACK、ACK)通过。
- 理解这些底层机制,是后续章节中配置防火墙规则、分析通信日志、解决Socket异常的前提。