PSSP 工作流程
架构与时序

PSSP 数据如何流动

本页跟踪一个应用客户端——未来的设备或服务器端集成——到 PSSP Broker,再到一个或多个订阅者的完整路径。不透明负载在 Broker 内不会改变形式。

系统视图

发布客户端未来设备 / 服务不透明字节 + 主题 QoS 0 UDP心跳 / 可容忍丢失 PSSP Broker认证 + ACL主题环形缓存有界内存按过滤器扇出不解析负载 订阅者 A消息 → 持久化交接MSGACK 订阅者 B相同或不同过滤器独立投递 TCP QoS 1 发布(PUBLISH) UDP QoS 0 连通测试/发布

未来任何 OX Device 或 WebService 都会成为普通的 PSSP 发布者、订阅者,或同时具备两种身份。两者都不需要嵌入 Broker 或桌面客户端项目中。

1. 安全连接与会话密钥流程

PSSP 客户端PSSP Broker 1. TCP 连接 + 可选 TLS 1.3 握手 2. 问候(HELLO){ supportedVersion } 3. 问候确认(HELLO_ACK){ connectionId, limits, encryptionRequired } 4. 认证(AUTH),或关闭 TLS 的 AES:KEY_REQUEST { 客户端 X25519 密钥 + salt } 5. AUTH_OK,或 KEY { 公共元数据;无 AES 密钥 } 6. 关闭 TLS 的 AES:加密 AUTH;TLS + AES:KEY_REQUEST 7. TLS + AES:TLS 内 KEY { AES 密钥 } 8. 后续 PSSP 记录使用 AES-GCM
  1. Broker 只在认证成功后创建 AES 密钥。
  2. 密钥和 nonce 前缀对该 TCP 会话唯一,且仅存在于 RAM 中。
  3. TCP 关闭/断开时,Broker 删除会话密钥、序列状态、UDP 关联和连接状态。
独立模式

关闭 TLS 且启用 AES 时,客户端验证 Broker X25519 公钥固定值,通过 X25519 + HKDF 在本地派生 AES,并加密 AUTH 与后续记录;对称密钥不会被发送。有意关闭 TLS/AES 并设置 allow_insecure_tcp_udp = true 时,会省略密钥步骤,所有凭据/记录均为明文网络流量。

2. QoS 1 发布、缓存与投递

发布者Broker订阅者 订阅(SUBSCRIBE){ filter, workerID, from } 订阅确认(SUBACK) 发布(PUBLISH){ topic, publisherSessionId, publisherSequence } + 字节 检查 ACL + 限制去重,追加主题环 发布确认(PUBACK){ topicSequence, duplicate } 消息(MESSAGE){ topic, topicSequence, metadata } + 相同字节 应用程序可靠交接ACK 前排队 / 持久化 消息确认(MSGACK){ subscriptionId, topic, topicSequence }
  1. 订阅者在发布者写入新数据前建立过滤器。
  2. 发布者通过 TCP QoS 1 发送不透明负载。发布者重试标识可避免重试创建重复主题条目。
  3. Broker 将数据加入主题有限环,然后以 PUBACK 确认接收。慢订阅者不能延迟该确认。
  4. Broker 向匹配订阅者发送包含原始负载的 MESSAGE
  5. 订阅者应用完成自己的交接并发送 MSGACK。只要数据仍被保留,该游标即可支持后续恢复。

3. 重连与有界恢复

已重连的订阅者相同客户端/用户 +相同订阅者标识 Broker 主题环恢复游标保留配置的 TTL 时长有限字节 / 数量 / 时间 重放消息(MESSAGE)MSGACK 后的序列 GAP从应用归档恢复 订阅起点:resume 历史数据可用 请求范围已淘汰

订阅者恢复状态会在 Broker 内存中保存 subscriber_resume_ttl_seconds 指定的时长。它不能在 Broker 重启后保留。GAP 明确表示 PSSP 本身无法重新创建已删除的数据。

4. QoS 0 UDP 绑定与心跳

已认证客户端Broker UDP 套接字 UDP_BIND { udpAssociationToken }(生产环境 AES-GCM) UDP_BIND_ACK — Broker 记录源端点 连通测试(PING)或 QoS 0 发布 PONG(心跳)

QoS 0 不返回 PUBACK,不缓存数据,也不重放。如果 TCP 会话关闭,关联令牌将被删除,UDP 源也不再有效。