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