3. HSMS通信层协议与连接管理

HSMS(High-Speed SECS Message Services)是SEMI E37标准定义的通信层协议,它把SECS-II消息封装到TCP/IP之上,替代了传统SECS-I的串行传输方式。在一致性测试与自动化验证工程中,HSMS层是所有上层GEM功能的地基:如果连接状态、超时参数或链路保活处理不正确,后续的S1F13、S2F33等报文测试都会失去意义。本节围绕HSMS-SS/HSMS-GS两种模式、Select/Deselect、Linktest、Separate、连接状态机以及T3/T5/T6/T7/T8超时参数展开,并给出用网络调试工具抓包分析HSMS报文的方法。

HSMS-SS与HSMS-GS:单会话与通用会话

HSMS-SS(Single Session)是最常见的部署形态,一台设备(Equipment)与一台主机(Host)之间只建立一条TCP连接,双方角色固定:通常设备作为被动方监听端口(默认5000),主机作为主动方发起连接。HSMS-GS(General Session)则允许一个实体同时管理多条会话,每条会话有独立的Session ID,适用于一台主机管理多台设备或一台设备对接多个上层系统的场景。在一致性测试中,SS模式关注的是单条链路的完整状态迁移,GS模式还需要额外验证Session ID的分配、复用与隔离是否正确。

无论SS还是GS,HSMS报文都由4字节长度字段(Length)和10字节头部(Header)组成,头部包含Session ID(2字节)、Header Byte 2/3(含Stream、Function、PType、SType等)、System Bytes(4字节)和最后2字节的状态字段。理解这个10字节头部是抓包分析的前提。

Select/Deselect:建立与释放逻辑连接

TCP连接建立后,HSMS并不会立即进入可收发SECS-II消息的状态,必须先完成Select握手。主动方发送Select.req(SType=1),被动方回复Select.rsp(SType=2),状态字段为0表示接受。只有Select成功后,双方才进入Selected状态,可以传输Data消息(SType=0)。Deselect.req(SType=3)与Deselect.rsp(SType=4)用于优雅地释放逻辑连接,但保留TCP连接。测试中常见的错误包括:在未Select的情况下直接发送S1F1,或在Deselect后仍发送Data消息,这些都应被判定为协议违规。

Linktest与Separate:链路保活与异常断开

Linktest.req(SType=5)与Linktest.rsp(SType=6)用于在长时间无数据交互时探测链路是否仍然可用。它不改变连接状态,只验证对端是否响应。Separate.req(SType=9)则用于通知对端立即断开逻辑连接,通常出现在异常处理或强制复位场景。与Deselect不同,Separate不要求回复,发送后双方直接回到Not Selected状态。在自动化验证中,需要构造“Linktest超时未响应”和“收到Separate后状态迁移”两类用例,检查被测实现是否正确处理。

连接状态机与超时参数

HSMS连接状态机通常包含:Not Connected、Connected/Not Selected、Selected、以及过渡中的Selecting/Deselecting状态。状态迁移由TCP事件、Select/Deselect/Separate报文和超时共同驱动。E37定义了五个关键定时器:

  • T3:回复超时,默认45秒。发送需要回复的报文后,若在T3内未收到对应回复,判定为超时。
  • T5:连接分离超时,默认10秒。TCP连接建立后,若在T5内未完成Select,主动方应断开连接。
  • T6:控制报文超时,默认5秒。用于Select、Deselect、Linktest等控制报文的回复等待。
  • T7:Not Selected状态超时,默认10秒。在未Selected状态下等待Select.req的最长时间。
  • T8:网络字符间超时,默认5秒。用于检测报文传输过程中字节间间隔过长的情况。

这些参数在测试中必须可配置,并且要验证边界行为。例如把T6设为2秒,发送Select.req后故意不回复,观察主动方是否在约2秒后重试或断开。参数配置通常通过设备的HSMS配置界面或主机端配置文件完成,测试脚本需要能读取并修改这些值。

HSMS连接状态机与超时参数 Not Connected Connected / Not Selected Selected TCP连接建立 Select.req/rsp Deselect / Separate TCP断开 / T5超时 Linktest E37 超时参数与作用位置 T3 回复超时 45s T5 连接分离 10s T6 控制报文 5s T7 未选等待 10s T8 字符间 5s Data消息回复 TCP建立后Select Select/Deselect/Linktest 等待Select.req 报文传输中 HSMS报文头部结构(10字节) Length(4) | Session ID(2) | Header Byte2/3(2) | System Bytes(4) | Status(2)

使用网络调试工具抓取并分析HSMS报文

抓包分析是HSMS一致性测试中最直接的验证手段。推荐使用Wireshark配合HSMS解析插件,或使用tcpdump抓取原始流量后导入分析。基本操作流程如下:

# 在设备侧或主机侧抓取5000端口流量
tcpdump -i eth0 -w hsms_capture.pcap port 5000

# 用Wireshark打开后,过滤HSMS协议
# 显示过滤器示例:
hsms
hsms.stype == 1    # 只看Select.req
hsms.stype == 5    # 只看Linktest.req

抓包后重点观察:TCP三次握手是否成功、Select.req与Select.rsp的System Bytes是否匹配、状态字段是否为0、Data消息的Stream/Function是否与预期一致、Linktest是否按周期发送、超时后是否出现重传或Separate。一个典型的Select交互报文头部示例(十六进制)如下:

00 00 00 0A  00 01  00 01  00 00 00 01  00 00
|--Length--| |SID| |SType| |SystemBytes| |Status|
Length=10, SessionID=1, SType=1(Select.req), SystemBytes=1, Status=0

在自动化验证中,可以把抓包结果与预期报文模板做逐字段比对。例如预期Select.rsp的SType=2、Status=0、System Bytes与请求一致,若实际抓到的Status非0或System Bytes不匹配,则判定为失败。对于T3/T5/T6/T7/T8的测试,需要结合时间戳计算实际间隔,验证是否在配置值附近触发超时行为。

在实际项目中,建议把HSMS连接状态机的每个迁移都映射为一条自动化用例:TCP连接建立→T5内Select→Selected→Linktest保活→Deselect→Not Selected→Separate→断开。每条用例都记录抓包文件、时间戳和状态字段,形成可追溯的验证证据链。
注意:T5和T7都涉及“未Selected”状态,但触发条件不同。T5是TCP已连接但未完成Select的等待上限,T7是进入Not Selected状态后等待Select.req的上限。测试时不要混淆这两个定时器的启动时机,否则会得到错误的超时判定。

总结来说,HSMS通信层的一致性测试需要同时关注协议报文格式、状态迁移逻辑和超时参数行为三个维度。Select/Deselect/Linktest/Separate是状态迁移的驱动事件,T3/T5/T6/T7/T8是约束这些事件时序的边界条件,而抓包分析则是验证两者是否匹配的核心手段。只有把这三者结合起来,才能对HSMS实现做出可靠的协议一致性判断。