3. HSMS 高速通信协议:TCP/IP 基础、连接建立与断开、Linktest 机制与消息格式
3.1 TCP/IP 基础与 HSMS 协议栈
HSMS(High-Speed SECS Message Services)是 SEMI E37 标准定义的基于 TCP/IP 的通信协议,用于替代传统的 RS-232 串行 SECS-I 协议。HSMS 利用 TCP 的可靠传输、流量控制和连接管理能力,为半导体设备与主机之间提供高速、稳定的消息交换通道。
核心概念: HSMS 位于 OSI 模型的传输层之上,将 SECS-II 消息封装为 HSMS 消息,通过 TCP 连接传输。TCP 的可靠性保证了 HSMS 消息的有序、无差错交付。
3.1.1 HSMS 协议栈层次
| OSI 层 | 协议/功能 | 说明 |
|---|---|---|
| 应用层 | SECS-II (SEMI E5) | 定义设备与主机间的业务消息格式(SxFx) |
| 表示层 | SECS-II 消息编码 | 将 SECS-II 数据项编码为字节流 |
| 会话层 | HSMS (SEMI E37) | 连接管理、消息分帧、会话控制 |
| 传输层 | TCP | 提供可靠、面向连接的字节流传输 |
| 网络层 | IP | 网络寻址与路由 |
| 链路层 | 以太网 | 物理网络接口 |
3.1.2 TCP 连接特性对 HSMS 的影响
- 可靠传输: TCP 的确认重传机制确保 HSMS 消息不丢失、不重复。
- 有序交付: TCP 保证字节流按发送顺序到达,HSMS 无需额外排序逻辑。
- 流量控制: TCP 滑动窗口机制防止发送方过快导致接收方缓冲区溢出。
- 连接状态: TCP 连接建立(三次握手)和断开(四次挥手)是 HSMS 会话管理的基础。
- 保活机制: TCP Keep-Alive 可检测连接中断,但 HSMS 定义了更精细的 Linktest 机制。
测试要点: 在 HSMS 测试中,应关注 TCP 连接的超时重传参数(如 RTO、RTT)以及 TCP 窗口大小,这些参数直接影响 HSMS 消息的吞吐量和延迟。
3.2 HSMS 连接建立与断开
HSMS 定义了两种连接模式:主动模式(Active Mode) 和 被动模式(Passive Mode)。设备通常配置为主动模式,主动向主机发起 TCP 连接;主机配置为被动模式,监听指定端口等待连接。
3.2.1 连接建立流程(Select 过程)
HSMS 连接建立分为两个阶段:TCP 连接建立 和 HSMS 会话建立(Select)。
- TCP 三次握手: 主动方(设备)向被动方(主机)发起 TCP SYN,完成三次握手,建立 TCP 连接。
- HSMS Select 请求: 设备发送 Select.req 消息,请求建立 HSMS 会话。
- HSMS Select 响应: 主机回复 Select.rsp,携带状态码(0x00 表示成功)。
- 会话建立完成: 双方进入通信状态,可以交换 SECS-II 消息。
常见故障: Select 失败通常由以下原因引起:TCP 连接未完全建立、设备 ID 不匹配、主机未处于监听状态、防火墙阻断端口。测试时应使用网络抓包工具(如 Wireshark)验证 TCP 握手和 HSMS Select 消息交换。
3.2.2 连接断开流程(Deselect 过程)
HSMS 会话的断开同样分为两个阶段:HSMS 会话断开(Deselect) 和 TCP 连接断开。
- Deselect 请求: 任一方发送 Deselect.req 消息,请求终止 HSMS 会话。
- Deselect 响应: 对方回复 Deselect.rsp,确认会话终止。
- TCP 连接关闭: 双方执行 TCP 四次挥手,释放连接资源。
| HSMS 消息 | 方向 | 功能 | 关键字段 |
|---|---|---|---|
| Select.req | 主动方 → 被动方 | 请求建立 HSMS 会话 | Device ID, Session ID |
| Select.rsp | 被动方 → 主动方 | 响应 Select 请求 | Status Code (0x00=成功) |
| Deselect.req | 任一方 → 对方 | 请求终止 HSMS 会话 | Device ID, Session ID |
| Deselect.rsp | 对方 → 请求方 | 确认会话终止 | Status Code |
测试建议: 在测试 Deselect 过程时,应验证双方在收到 Deselect.rsp 后是否正确关闭 TCP 连接。常见问题包括:一方未发送 Deselect 直接关闭 TCP(导致对端异常)、Deselect.rsp 超时未收到等。
3.3 Linktest 机制
Linktest 是 HSMS 定义的连接保活机制,用于检测 TCP 连接是否仍然有效。与 TCP Keep-Alive 不同,Linktest 在 HSMS 应用层实现,具有更精细的控制和更明确的语义。
3.3.1 Linktest 工作原理
- 定时发送: 主动方(设备)定期发送 Linktest.req 消息,默认间隔为 10 秒(可配置)。
- 响应超时: 主动方等待 Linktest.rsp 响应,超时时间通常为 5 秒(可配置)。
- 重试机制: 若超时未收到响应,主动方重试 Linktest.req,重试次数默认为 3 次。
- 连接断开: 若重试次数耗尽仍未收到响应,主动方判定连接断开,执行 Deselect 并关闭 TCP 连接。
关键参数: Linktest 间隔(T3)、Linktest 超时(T5)、Linktest 重试次数(N1)。这些参数在 HSMS 标准中有推荐值,但实际部署中可根据网络状况调整。
3.3.2 Linktest 消息格式
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| Message Length | 4 | 消息体长度(不含本字段) |
| Session ID | 4 | 会话标识 |
| Header Byte 2 | 1 | 0x00(保留) |
| Header Byte 3 | 1 | 0x00(保留) |
| Message Type | 1 | 0x05 (Linktest.req) / 0x06 (Linktest.rsp) |
| Message Body | 0 | Linktest 消息无消息体 |
3.3.3 Linktest 故障场景
| 故障场景 | 现象 | 排查方法 |
|---|---|---|
| Linktest.rsp 超时 | 设备重试 Linktest.req,重试次数耗尽后断开连接 | 检查主机是否存活、网络是否拥塞、防火墙是否丢弃 UDP/TCP 包 |
| Linktest 间隔过短 | 网络负载增加,可能触发误判 | 调整 T3 参数,避免过于频繁的 Linktest 消息 |
| Linktest 间隔过长 | 连接断开后长时间未被检测到 | 缩短 T3 间隔,或结合 TCP Keep-Alive 使用 |
| 主机未实现 Linktest | 设备持续重试 Linktest.req,最终断开连接 | 确认主机 HSMS 实现是否完整支持 Linktest |
测试重点: 在测试 Linktest 机制时,应模拟网络中断(如拔掉网线、关闭主机端口),验证设备能否在预期时间内检测到连接断开并执行 Deselect。同时,应验证恢复连接后设备能否重新建立 HSMS 会话。
3.4 HSMS 消息格式
HSMS 消息采用固定长度的消息头(Header)和可变长度的消息体(Body)组成。消息头包含会话标识、消息类型、设备 ID 等信息,消息体承载 SECS-II 编码后的数据。
3.4.1 HSMS 消息头结构
| 偏移(字节) | 字段 | 长度(字节) | 说明 |
|---|---|---|---|
| 0 | Message Length | 4 | 消息体长度(大端序),不含本字段和消息头 |
| 4 | Session ID | 4 | 会话标识,用于多会话场景 |
| 8 | Header Byte 2 | 1 | 保留/控制位 |
| 9 | Header Byte 3 | 1 | 保留/控制位 |
| 10 | Message Type | 1 | 消息类型编码 |
| 11 | Message Body | 可变 | SECS-II 编码后的消息数据 |
3.4.2 消息类型编码
| 消息类型 | 编码(十六进制) | 方向 | 说明 |
|---|---|---|---|
| Data Message | 0x01 | 双向 | 承载 SECS-II 数据消息(Primary/Secondary) |
| Select.req | 0x05 | 主动方 → 被动方 | 请求建立 HSMS 会话 |
| Select.rsp | 0x06 | 被动方 → 主动方 | 响应 Select 请求 |
| Deselect.req | 0x07 | 任一方 → 对方 | 请求终止 HSMS 会话 |
| Deselect.rsp | 0x08 | 对方 → 请求方 | 确认会话终止 |
| Linktest.req | 0x09 | 主动方 → 被动方 | 连接保活探测 |
| Linktest.rsp | 0x0A | 被动方 → 主动方 | 连接保活响应 |
| Reject.req | 0x0B | 任一方 → 对方 | 拒绝无效消息 |
3.4.3 HSMS 消息示例(Select.req)
// HSMS Select.req 消息的十六进制表示
// 消息长度 = 0x00000000(无消息体)
// Session ID = 0x00000001(设备 ID = 1)
// Header Byte 2 = 0x00
// Header Byte 3 = 0x00
// Message Type = 0x05 (Select.req)
字节序列:
00 00 00 00 // Message Length = 0
00 00 00 01 // Session ID = 1
00 // Header Byte 2
00 // Header Byte 3
05 // Message Type = Select.req
3.4.4 HSMS 消息格式对比
| 特性 | HSMS | SECS-I (RS-232) |
|---|---|---|
| 传输层 | TCP/IP | RS-232 串口 |
| 消息头长度 | 10 字节(固定) | 可变(依赖块长度) |
| 最大消息长度 | 4 GB(由 4 字节长度字段决定) | 受串口速率和缓冲区限制 |
| 连接管理 | Select/Deselect/Linktest | 无(依赖物理连接) |
| 多会话支持 | 支持(通过 Session ID) | 不支持 |
| 错误检测 | 依赖 TCP 校验和 | 依赖块校验和(Block Check) |
测试工具: 使用 Wireshark 的 HSMS 解析器可以直观查看 HSMS 消息的各个字段。在测试中,应重点关注 Message Length 字段是否正确、Session ID 是否匹配、Message Type 是否合法。
3.5 本章小结
- HSMS 基于 TCP/IP 提供可靠、高速的 SECS 消息传输,协议栈层次清晰。
- 连接建立通过 TCP 三次握手 + HSMS Select 过程完成,断开通过 Deselect + TCP 四次挥手完成。
- Linktest 机制是 HSMS 应用层的连接保活手段,参数配置直接影响故障检测的及时性和准确性。
- HSMS 消息格式固定,消息头 10 字节,消息体可变,消息类型编码定义了 8 种控制消息和 1 种数据消息。
- 测试 HSMS 时,应结合网络抓包工具和 HSMS 模拟器,验证连接建立/断开流程、Linktest 机制以及消息格式的正确性。