4. HSMS连接管理与会话生命周期
HSMS(High-Speed SECS Message Services)是SEMI E37标准定义的通信协议,它把SECS-II消息封装在TCP/IP之上,是当前半导体设备与EAP之间最主流的通信方式。与早期的SECS-I串行链路不同,HSMS的连接是面向会话的:一条TCP连接建立后,双方必须先完成Select握手,才能交换SECS-II消息;通信结束或异常时通过Deselect或直接断开连接释放会话。EAP要同时管理几十甚至上百台设备,连接管理与会话生命周期控制直接决定了系统的可用性。
主动模式与被动模式
HSMS定义了两种连接角色。主动模式(Active)由本端发起TCP连接,被动模式(Passive)由本端监听端口等待对端连接。在半导体厂内,通常由EAP作为Active方,设备作为Passive方监听固定端口(常见为5000),这样EAP可以统一控制连接时机、重连节奏和并发规模。反过来也可以让设备主动连EAP,但设备数量多时EAP需要维护大量监听端口,运维复杂度高,因此较少采用。
角色选择不是随意的,必须与对端严格互补:一端Active,另一端必须Passive。如果两端都配成Active,会出现连接反复建立又立即被对端拒绝的现象;如果两端都配成Passive,则永远不会有连接建立。实际配置中,EAP侧通常为每台设备维护一条“设备ID—IP—端口—角色”的记录,角色字段与设备端HSMS参数必须一致,这是排障时最先核对的内容。
Select与Deselect:会话的建立与释放
TCP连接建立只代表链路可达,并不代表可以收发SECS消息。HSMS规定,连接建立后由Active方发送Select.req,Passive方回Select.rsp,状态码0表示接受,此时会话进入Selected状态,双方才能发送Data消息。Deselect.req/rsp用于正常释放会话,通常发生在设备维护、EAP切换或计划停机时。若一方直接关闭TCP而不发Deselect,对端会通过T5超时或连接断开事件感知异常。
Select阶段还会交换双方支持的HSMS参数,包括Session ID、是否支持Deselect等。Session ID用于标识会话,在多设备并发场景下,EAP必须保证每个连接上的Session ID与设备配置一致,否则即使Select成功,后续Data消息也可能被对端丢弃。
T3/T5/T6/T7/T8定时器
HSMS用一组定时器约束交互节奏,理解它们的作用是定位“卡住”“超时”“反复重连”类问题的关键。
| 定时器 | 作用 | 典型值 | 超时后果 |
|---|---|---|---|
| T3 | 等待对端回复(Reply)的时间 | 45 s | 判定消息超时,触发重发或告警 |
| T5 | 连接建立后等待Select.rsp的时间 | 10 s | Select失败,关闭连接并重连 |
| T6 | 等待Deselect.rsp的时间 | 5 s | 强制关闭连接 |
| T7 | 等待Select.req的时间(Passive侧) | 10 s | 未收到Select,关闭连接 |
| T8 | 两次Data消息之间的最大间隔 | 5 s | 判定链路空闲异常,可断开重连 |
这些值不是固定不变的,设备厂商手册通常会给出推荐范围。EAP侧配置必须与设备侧匹配或更宽松,否则会出现EAP认为超时、设备认为正常的错位。例如T3设为45 s而设备处理一条复杂配方查询需要60 s,EAP就会提前判超时并重发,导致设备收到重复消息。因此T3的设定要结合设备最慢响应时间,并留出余量。
连接断开与重连策略
连接断开的原因很多:设备重启、网络抖动、对端进程崩溃、T5/T7超时、Deselect后主动关闭等。EAP不能简单地在断开后立即重连,否则设备刚重启时会被大量重连请求淹没。合理的做法是采用带退避的重连:首次断开后等待1 s重连,失败则等待2 s、4 s、8 s,直到上限30 s,之后保持30 s间隔持续尝试。同时要区分“正常Deselect关闭”和“异常断开”,前者可以按计划重连,后者需要记录事件并触发告警。
重连成功后必须重新执行Select流程,不能假设会话仍然有效。EAP侧应维护每个连接的状态机:Disconnected → Connecting → Connected → Selecting → Selected → Deselecting → Disconnected。每次状态迁移都记录时间戳和原因,便于事后分析。对于关键设备,还可以在重连成功后主动查询设备状态,确认设备是否处于可通信状态。
多设备并发下的会话状态管理
当EAP同时管理上百台设备时,会话状态管理需要解决三个问题:状态一致性、资源隔离和故障隔离。状态一致性要求每个连接的Session ID、定时器配置、当前状态在EAP内部有唯一记录,避免多个线程同时操作同一连接。资源隔离要求每个连接有独立的收发缓冲和超时计时器,一台设备的慢响应不能阻塞其他设备。故障隔离要求单台设备的反复重连、消息风暴不影响EAP整体,通常通过连接数上限、每设备消息速率限制和独立线程池实现。
实际实现中,常用一个会话管理器维护Map<DeviceId, HsmsSession>,每个HsmsSession封装Socket、状态机、定时器和消息队列。会话管理器定期扫描所有会话,检查T3/T5/T6/T7/T8是否超时,并触发相应动作。对于Select失败或T5超时的会话,标记为异常并进入重连队列;对于长时间处于Selected但无Data交互的会话,可根据T8判断链路是否健康。
配置示例与排障要点
以下是一段典型的HSMS连接配置示例,用于说明EAP侧需要维护的关键字段:
device:
id: "EQP-001"
ip: "192.168.10.21"
port: 5000
role: "active" # EAP 主动连接
session_id: 1
timers:
t3: 45s # 等待 Reply
t5: 10s # 等待 Select.rsp
t6: 5s # 等待 Deselect.rsp
t7: 10s # Passive 侧等待 Select.req
t8: 5s # Data 间隔
reconnect:
initial_delay: 1s
max_delay: 30s
backoff: 2.0
排障时按以下顺序检查:先确认TCP层是否可达(ping、telnet端口),再确认Select是否成功(看Select.rsp状态码),然后确认Session ID是否一致,最后检查T3是否过短导致误超时。如果设备反复断开,重点看T5和T7:T5超时说明设备未回Select.rsp,可能是设备HSMS服务未启动或Session ID不匹配;T7超时说明EAP未及时发Select.req,可能是EAP连接后卡在别的处理逻辑中。把这些定时器与状态迁移日志结合,就能快速定位是链路问题、配置问题还是对端处理能力问题。
会话生命周期管理的本质,是把“连接”从一个瞬时动作变成一个有状态、有超时、有恢复策略的持续过程。EAP只有把Select/Deselect、五个定时器、重连退避和多设备隔离都纳入统一的状态机管理,才能在设备数量增长和网络波动时保持稳定通信。