2. HSMS 连接模型:主动连接与被动连接模式,TCP/IP 通信基础
HSMS(High-Speed SECS Message Services)是建立在 TCP/IP 协议之上的通信层。理解其连接模型是掌握状态机与重连机制的前提。HSMS 定义了两种连接建立模式:主动连接(Active) 与 被动连接(Passive)。这两种模式决定了设备在建立 TCP 连接时的角色分工。
2.1 TCP/IP 通信基础回顾
HSMS 使用标准的 TCP 套接字(Socket)进行通信。TCP 提供面向连接、可靠、基于字节流的传输服务。在 HSMS 上下文中,通信双方通常分为 主机(Host) 和 设备(Equipment)。
- IP 地址与端口号:每个 HSMS 实体需要配置一个唯一的 IP 地址和一个协商好的端口号(通常为 5000 或 5555,但可配置)。
- TCP 三次握手:建立连接前,主动方发送 SYN,被动方回复 SYN-ACK,主动方再发送 ACK,完成连接建立。
- 连接终止:通过四次挥手(FIN 包)正常关闭,或通过 RST 包异常终止。
- 心跳与保活:HSMS 依赖 T3 定时器(事务超时)和 T6 定时器(连接响应超时)来检测连接健康状态,而非仅依赖 TCP Keep-Alive。
关键点:HSMS 的主动/被动模式仅决定谁先发起 TCP 连接请求,不决定通信后的主从关系。一旦连接建立,双方是对等的,都可以发起 SECS 消息事务。
2.2 主动连接模式(Active Mode)
在主动连接模式下,设备或主机作为 客户端,主动向对端发起 TCP 连接请求。该模式通常用于设备端主动向主机注册或上报事件。
- 角色:主动方(Active Entity)调用
connect()系统调用。 - 配置:需要知道对端的 IP 地址和端口号。
- 典型场景:设备上电后,主动连接主机。
- 重连行为:当连接断开后,主动方负责按照重连策略(如 T3 超时后)重新发起连接。
2.3 被动连接模式(Passive Mode)
在被动连接模式下,设备或主机作为 服务器,在指定端口上监听,等待对端发起连接。该模式通常用于主机等待设备连接。
- 角色:被动方(Passive Entity)调用
listen()和accept()系统调用。 - 配置:只需要本地 IP 和监听端口,不需要预先知道对端地址。
- 典型场景:主机作为服务器,等待多台设备连接。
- 重连行为:被动方不主动发起连接,只负责接受连接。如果连接断开,被动方只需重新进入监听状态,等待主动方重连。
2.4 主动与被动模式对比
| 对比维度 | 主动模式(Active) | 被动模式(Passive) |
|---|---|---|
| 网络角色 | 客户端(Client) | 服务器(Server) |
| 连接发起方 | 自身 | 对端 |
| 配置需求 | 需配置对端 IP 和端口 | 仅需本地 IP 和端口 |
| 重连责任 | 负责重连 | 仅等待连接 |
| 典型实现 | socket() → connect() |
socket() → bind() → listen() → accept() |
| 适用方 | 通常为设备端 | 通常为主机端 |
2.5 HSMS 连接建立流程(SVG 架构图)
下图展示了主动方与被动方在 TCP/IP 协议栈上的连接建立过程,以及 HSMS 层在连接建立后的角色。
2.6 连接模式选择策略
在实际的半导体设备集成中,连接模式的选择通常遵循以下原则:
- 主机作为被动方:这是最常见的部署模式。主机运行 HSMS 服务器,监听固定端口,等待多台设备连接。主机无需知道每台设备的 IP 地址。
- 设备作为主动方:设备上电后,根据配置的主机 IP 和端口,主动发起连接。设备负责维护连接状态,并在断开后重连。
- 双向主动/被动:某些场景下,主机和设备都可以配置为主动方,但必须避免同时发起连接导致冲突。通常通过配置协商或使用不同的端口号来避免。
常见陷阱:不要将 HSMS 的主动/被动模式与 SECS-II 的通信角色混淆。HSMS 只负责传输层连接,不改变应用层的消息交互规则。主动方在连接建立后,并不自动获得消息发起优先权。
2.7 连接建立后的 HSMS 层初始化
TCP 连接建立后,HSMS 层还需要进行协议握手,才能开始传输 SECS 消息。这个过程称为 HSMS 连接初始化,涉及以下步骤:
| 步骤 | 方向 | 消息类型 | 说明 |
|---|---|---|---|
| 1 | 主动方 → 被动方 | Select.req | 主动方请求建立 HSMS 会话 |
| 2 | 被动方 → 主动方 | Select.rsp | 被动方响应,携带状态码(0=成功) |
| 3 | 双方 | Linktest.req / Linktest.rsp | 可选,用于验证连接健康状态 |
| 4 | 双方 | Separate.req | 用于正常断开 HSMS 会话 |
实践要点:在编写 HSMS 通信代码时,主动方应在 TCP 连接建立成功后立即发送
Select.req。如果被动方在 T6 超时时间内未收到 Select.req,应主动关闭 TCP 连接。T6 定时器通常设置为 5 秒。
2.8 连接断开与重连触发
当 TCP 连接因网络故障、对端崩溃或 T3 超时而断开时,HSMS 状态机将进入 未连接(Not Connected) 状态。此时,主动方应根据配置的重连策略(如固定间隔、指数退避)重新执行连接流程。
- T3 超时:事务等待响应超时,通常触发消息重发或事务终止,进而可能导致连接断开。
- T6 超时:连接响应超时,直接触发连接断开。
- 重连间隔:建议初始间隔 1 秒,最大间隔 30 秒,避免频繁重连导致网络拥塞。