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)的稳定性直接决定通信质量。

TCP/IP四层模型与SECS/GEM协议栈映射 应用层 SECS-I / HSMS / GEM 消息定义与会话管理 传输层 TCP 可靠字节流 · 端口号(如 5000, 5001) 网络层 IP 地址路由 · 数据包分片与重组 网络接口层 以太网帧 · MAC 地址 · 物理介质 数据封装:应用数据 → TCP段 → IP包 → 以太网帧

2.2 Socket API核心函数

Socket API是应用层与TCP/IP协议栈之间的编程接口。在SECS/GEM的HSMS通信中,通常采用客户端-服务器(C/S)模式。设备作为服务器(Passive),主机作为客户端(Active),或反之。

2.2.1 服务器端流程

  1. socket():创建套接字,指定地址族(AF_INET)、类型(SOCK_STREAM)和协议(TCP)。
  2. bind():将套接字绑定到本地IP地址和端口号。
  3. listen():将套接字设为监听模式,等待客户端连接。
  4. accept():阻塞等待,接受客户端连接请求,返回新的连接套接字。
  5. recv() / send():通过连接套接字收发数据。
  6. close():关闭连接。

2.2.2 客户端流程

  1. socket():创建套接字。
  2. connect():向服务器发起TCP连接请求(指定IP和端口)。
  3. send() / recv():收发数据。
  4. close():关闭连接。

调试提示:在SECS/GEM通信中,bind()失败通常意味着端口被占用;connect()超时则可能由防火墙拦截或IP不可达引起。使用 netstat -an | grep :端口号 可快速检查端口状态。

Socket API 调用流程(C/S模式) 服务器(Passive) socket() → 创建套接字 bind() → 绑定IP:端口 listen() → 开始监听 accept() → 阻塞等待连接 recv() / send() → 数据通信 close() → 关闭连接 客户端(Active) socket() → 创建套接字 connect() → 发起连接请求 send() / recv() → 数据通信 close() → 关闭连接 TCP连接请求 accept() 返回

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”。

TCP三次握手流程 客户端 CLOSED ↓ SYN_SENT ↓ ESTABLISHED 服务器 LISTEN ↓ SYN_RCVD ↓ ESTABLISHED ① SYN=1, seq=x ② SYN=1, ACK=1, seq=y, ack=x+1 ③ ACK=1, seq=x+1, ack=y+1

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)机制检测并清理死连接。防火墙规则中应允许心跳包(通常为小数据包)通过。

TCP四次挥手流程 主动方 ESTABLISHED ↓ FIN_WAIT_1 ↓ FIN_WAIT_2 ↓ TIME_WAIT ↓ CLOSED 被动方 ESTABLISHED ↓ CLOSE_WAIT ↓ LAST_ACK ↓ CLOSED ① FIN=1, seq=u ② ACK=1, seq=v, ack=u+1 ③ FIN=1, ACK=1, seq=w, ack=u+1 ④ ACK=1, seq=u+1, ack=w+1

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异常的前提。