3. HSMS 消息类型详解
HSMS(High-Speed SECS Message Services)定义了五种控制消息,用于建立、维护和终止设备与主机之间的逻辑连接。理解这些消息的格式、触发条件和响应行为,是配置会话超时与链路恢复参数的基础。本节逐一拆解 Select.req/rsp、Deselect.req/rsp、Linktest.req/rsp 和 Separate.req 的结构与交互流程。
3.1 Select.req / Select.rsp — 会话建立
Select.req 是设备或主机主动发起的会话建立请求,用于将 TCP 连接从“未选择”状态提升为“已选择”状态。只有处于已选择状态的连接才能传输 SECS 数据消息。
消息格式
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| Message Length | 4 | 固定为 10(不含自身) |
| Session ID | 2 | 设备 ID,通常为 0 |
| Header Byte 0 | 1 | 0x01(Select.req)/ 0x02(Select.rsp) |
| Header Byte 1 | 1 | 0x00 |
| P/B Type | 1 | 0x00(控制消息) |
| System Bytes | 4 | 事务 ID,用于请求-响应匹配 |
Select.rsp 响应码
| 响应码 | 含义 | 处理建议 |
|---|---|---|
| 0x00 | 成功(已选择) | 正常通信开始 |
| 0x01 | 连接已存在 | 无需重复 Select |
| 0x02 | 连接未就绪 | 检查 T3 超时或网络状态 |
| 0x03 | 拒绝(资源不足) | 检查设备连接数上限 |
关键点:Select.req 必须在 TCP 连接建立后的 T5(连接响应超时)时间内发送,否则对端会主动关闭连接。Select.rsp 中的 System Bytes 必须与请求一致,否则视为无效响应。
3.2 Deselect.req / Deselect.rsp — 会话释放
Deselect.req 用于主动将连接从“已选择”状态降级为“未选择”状态。释放后,该 TCP 连接不再传输 SECS 数据消息,但 TCP 连接本身可能保持(取决于实现)。
触发场景
- 正常关机流程:设备在断电前发送 Deselect.req,通知主机释放会话。
- 链路切换:多链路冗余场景下,主动释放当前链路以切换到备用链路。
- 资源回收:主机检测到设备长时间空闲,主动释放会话以节省连接资源。
Deselect.rsp 响应码
| 响应码 | 含义 |
|---|---|
| 0x00 | 成功(已释放) |
| 0x01 | 连接未选择(无需释放) |
| 0x02 | 拒绝(正在处理其他事务) |
实践建议:Deselect 操作不会关闭 TCP 连接。如果需要完全断开,应在 Deselect 之后发送 Separate.req 或直接关闭 Socket。在链路恢复参数配置中,Deselect 通常作为“优雅降级”的第一步。
3.3 Linktest.req / Linktest.rsp — 链路保活
Linktest.req 是 HSMS 的链路保活机制,用于检测 TCP 连接是否仍然存活且通信正常。设备或主机在空闲期间定期发送 Linktest.req,对端必须在 T3(回复超时) 时间内回复 Linktest.rsp。
消息特点
- 无数据负载:仅包含 HSMS 头部,不携带 SECS 数据。
- System Bytes 递增:每次 Linktest.req 使用递增的 System Bytes,用于检测响应匹配。
- 响应码固定为 0x00:Linktest.rsp 的响应码始终为成功,否则视为协议错误。
超时与重试策略
| 参数 | 默认值 | 说明 |
|---|---|---|
| T6(链路测试间隔) | 45 秒 | 两次 Linktest.req 之间的最大间隔 |
| T3(回复超时) | 45 秒 | 发送 Linktest.req 后等待 Linktest.rsp 的最大时间 |
| 重试次数 | 3 次 | T3 超时后重试 Linktest.req 的次数 |
⚠ 常见问题:如果 T6 配置过小(如 < 10 秒),会导致网络中出现大量 Linktest 消息,增加 CPU 和带宽开销。如果 T6 配置过大(如 > 120 秒),则无法及时发现链路中断,影响链路恢复的时效性。建议 T6 与 T3 保持相同值(如 45 秒),简化超时管理。
3.4 Separate.req — 连接终止
Separate.req 是 HSMS 中唯一不需要响应的控制消息(单向)。发送方通过 Separate.req 通知对端即将关闭 TCP 连接。收到 Separate.req 后,接收方应停止发送数据并准备关闭 Socket。
使用场景
- 设备关机:设备在断电前发送 Separate.req,然后关闭 TCP 连接。
- 主机维护:主机在重启服务前发送 Separate.req,通知设备重新连接。
- 异常断开:检测到协议错误或不可恢复的链路故障时,发送 Separate.req 后立即关闭连接。
与 Deselect 的区别
| 特性 | Deselect.req | Separate.req |
|---|---|---|
| 会话状态 | 已选择 → 未选择 | 已选择/未选择 → 终止 |
| TCP 连接 | 保持 | 关闭 |
| 是否需要响应 | 是(Deselect.rsp) | 否(单向) |
| 典型用途 | 优雅降级 | 紧急断开 |
协议规范:Separate.req 的 Header Byte 0 固定为 0x05。发送 Separate.req 后,发送方应等待至少 1 秒(确保消息被对端接收)再关闭 Socket。接收方收到 Separate.req 后,不应再发送任何 HSMS 消息。
3.5 五种消息类型对比总览
| 消息类型 | 方向 | 是否需要响应 | 会话状态变化 | TCP 连接影响 |
|---|---|---|---|---|
| Select.req / Select.rsp | 双向 | 是 | 未选择 → 已选择 | 无 |
| Deselect.req / Deselect.rsp | 双向 | 是 | 已选择 → 未选择 | 无 |
| Linktest.req / Linktest.rsp | 双向 | 是 | 无变化 | 无 |
| Separate.req | 单向 | 否 | 任何状态 → 终止 | 关闭 |
| Data Message | 双向 | 可选 | 无变化(需已选择) | 无 |
3.6 消息类型与超时参数的关联
每种 HSMS 控制消息都与特定的超时参数绑定。在配置链路恢复参数时,必须理解这些关联关系:
| 消息类型 | 关联超时 | 超时触发行为 |
|---|---|---|
| Select.req | T5(连接响应超时) | TCP 建立后 T5 内未收到 Select.req → 关闭连接 |
| Select.rsp | T3(回复超时) | 发送 Select.req 后 T3 内未收到 Select.rsp → 重试或断开 |
| Linktest.req | T6(链路测试间隔) | 空闲时间超过 T6 → 发送 Linktest.req |
| Linktest.rsp | T3(回复超时) | 发送 Linktest.req 后 T3 内未收到 Linktest.rsp → 重试 |
| Deselect.req | T3(回复超时) | 发送 Deselect.req 后 T3 内未收到 Deselect.rsp → 强制断开 |
| Separate.req | 无(单向) | 发送后等待 1 秒 → 关闭 Socket |
配置原则:在链路恢复参数配置中,T3 是最核心的超时参数,因为它同时影响 Select、Linktest 和 Deselect 三类消息的响应等待。建议将 T3 统一设置为 45 秒,与 T6 保持一致,形成“45 秒空闲 → Linktest → 45 秒等待 → 重试 3 次 → 链路恢复”的完整超时链。