2、HSMS连接建立流程:TCP三次握手、HSMS Select/Attach过程、连接状态机详解
HSMS(High-Speed SECS Message Services)连接建立是设备与主机之间通信的物理与逻辑基础。整个建立过程分为三个层次:TCP传输层连接、HSMS会话层选择、以及状态机迁移。任何一个环节失败,都会导致连接建立失败。本节将逐层拆解标准流程,并给出每个步骤的关键验证点。
2.1 TCP三次握手:物理连接建立
HSMS基于TCP/IP协议栈,在发送任何SECS消息之前,必须先完成TCP三次握手。设备(主动方)与主机(被动方)通过SYN、SYN-ACK、ACK三个报文段建立全双工通道。
关键验证点:三次握手完成后,双方各自维护一个已建立(ESTABLISHED)状态的socket。如果握手未完成,HSMS层无法启动任何Select/Attach过程。
| 步骤 | 报文 | 设备状态 | 主机状态 | 常见失败原因 |
|---|---|---|---|---|
| ① | SYN | CLOSED → SYN_SENT | LISTEN | 主机端口未监听、防火墙拦截SYN |
| ② | SYN-ACK | SYN_SENT | LISTEN → SYN_RCVD | 设备未收到SYN-ACK(路由不可达) |
| ③ | ACK | SYN_SENT → ESTABLISHED | SYN_RCVD → ESTABLISHED | 主机未收到ACK(半连接队列溢出) |
调试建议:使用
tcpdump -i eth0 'tcp port 5000' 或 Wireshark 捕获三次握手报文。如果只看到SYN发出但无SYN-ACK返回,优先检查主机端口可达性与防火墙规则。
2.2 HSMS Select/Attach过程:会话层建立
TCP连接建立后,设备与主机进入HSMS会话层协商。标准HSMS协议定义了两个关键过程:Select过程(选择通信模式)和Attach过程(附加会话标识)。实际工业实现中,大多数设备使用Select过程完成会话建立,Attach过程用于多会话场景。
2.2.1 Select过程(最常用)
设备作为主动方,发送Select.req消息,主机回复Select.rsp。Select过程的核心目的是协商通信模式(主动/被动)并建立逻辑连接。
| HCACK值 | 含义 | 根因方向 |
|---|---|---|
| 0 | 成功 | — |
| 1 | 连接已存在(重复Select) | 设备重复发起Select,或主机未清理旧连接 |
| 2 | 未连接(TCP未建立) | TCP层未完成三次握手 |
| 3 | 无效device_id | 设备ID与主机配置不匹配 |
| 4 | 其他错误 | 主机内部异常,需查看主机日志 |
2.2.2 Attach过程(多会话场景)
Attach过程用于在同一个TCP连接上建立多个逻辑会话。设备发送Attach.req,主机回复Attach.rsp。Attach过程在Select过程之后或同时进行,但实际工业现场较少使用,多数设备仅使用Select过程。
常见误区:部分工程师将Attach过程视为Select过程的替代。实际上,Select过程建立的是控制连接,Attach过程建立的是数据连接。对于单会话设备,Select过程已足够;多会话设备(如同时处理多个lot)才需要Attach。
2.3 连接状态机详解
HSMS协议定义了一套严格的状态机,用于管理连接生命周期。设备与主机各自维护独立的状态机,状态迁移由TCP事件和HSMS消息驱动。理解状态机是诊断连接建立失败的核心能力。
| 状态 | 允许发送的消息 | 允许接收的消息 | 典型持续时间 |
|---|---|---|---|
| NOT CONNECTED | 无(仅发起TCP连接) | 无 | 设备启动后或断开后 |
| CONNECTED | Select.req, Linktest.req, Separate.req | Select.rsp, Linktest.rsp, Separate.rsp | 通常<1秒(快速进入SELECTED) |
| SELECTED | 所有SECS-II消息(SxFy) | 所有SECS-II消息(SxFy) | 设备运行期间持续 |
2.4 连接建立完整流程总结
将上述三个层次串联起来,HSMS连接建立的完整流程如下:
- TCP三次握手:设备向主机端口发起SYN,完成三次握手,socket进入ESTABLISHED状态。
- 状态迁移至CONNECTED:TCP连接建立后,HSMS层自动将状态机从NOT CONNECTED迁移至CONNECTED。
- 发送Select.req:设备在CONNECTED状态下发送Select.req消息,携带device_id和通信模式。
- 主机验证并回复Select.rsp:主机验证device_id有效性,返回HCACK=0表示成功。
- 状态迁移至SELECTED:设备收到HCACK=0后,状态机从CONNECTED迁移至SELECTED。
- 开始SECS-II通信:在SELECTED状态下,设备可以发送S1F13等SECS-II消息进行数据交换。
调试黄金法则:当连接建立失败时,按层次排查——先确认TCP三次握手是否完成(抓包看ESTABLISHED),再确认Select过程是否收到HCACK=0,最后检查状态机是否卡在CONNECTED状态。80%的HSMS连接失败问题出在TCP层或device_id配置错误。