Skip to content

协议术语速查 ​

帧类型、Flags、错误码、配置参数四张表,写实现和排障时快速对照。口径以协议规范为单一事实源;方法签名与 Go 常量的完整出处见 API 参考。本页只收数值与一句话语义,取舍理由、帧序规则与恢复流程不在这里展开。

帧类型 ​

线上 Type 字段的全部合法值(协议 §4)。收到未定义类型:立即断开且不回帧——对照 WebSocket 对未知 opcode 直接 fail the connection。

值名称方向Stream ID用途
0x01CONNECTC→S0握手,携带能力声明与会话恢复凭证
0x02CONNACKS→C0握手应答,下发会话 ID 与生效参数
0x03PING双向0心跳探测
0x04PONG双向0心跳应答
0x05REQUEST双向≠0发起一次请求(单帧/流式/双工,看 Flags)
0x06RESPONSE双向≠0流上的一帧数据
0x07COMPLETE双向≠0流正常终止
0x08CANCEL双向≠0取消流:立即终结
0x09ONEWAY双向≠0单向发送,永不产生任何响应帧
0x0AERROR双向≠0/0终结流;Stream ID=0 是连接级致命错误(随后必须断开)
0x0BSUBSCRIBEC→S≠0订阅主题
0x0CSUBACKS→C≠0订阅确认
0x0DUNSUBSCRIBEC→S≠0退订;成功不回帧,失败回 ERROR
0x0EPUBLISH双向≠0*发布/投递(由订阅/发布动作关联,本身不开启流)
0x0FCREDIT双向≠0背压授权:补 n 条发送额度
0x10FRAGMENT双向≠0分片消息的续段/收尾帧,永不单独出现

FRAGMENT(0x10)与 bit5 Fragmented 为协议定稿能力,Go 参考实现的支持在落地中——合入前对端不应发送这类帧,当前参考实现按未知类型/保留位违规断开(§3.4 实现状态)。Go 常量表当前到 0x0F,见 API 参考 · 帧层。

帧形惯例:PING/PONG/COMPLETE/CANCEL/SUBACK 的 payload 为空且不带 Metadata;UNSUBSCRIBE 携带 topic Metadata;CREDIT 的 payload 为 {"n": N};FRAGMENT 不带 Metadata 且除 Fragmented 外不得置其他位。完整清单见协议 §4。

opcode 与 Flags ​

本协议没有 WebSocket 式的 opcode:连接复用由 Type(上一节)承担,两种分帧方案的对照见协议 §3.3。每帧的第二个控制字节是 Flags,标注载荷变换与流语义(§3.2 字段说明):

位名称语义
bit0Compressedpayload 经 flate(raw DEFLATE 流,无 zlib/gzip 外壳)
bit1Encryptedpayload 经 AES-256-GCM(12B nonce 前置 + 16B tag,共 28B 开销)
bit2HasMeta帧头后携带 Metadata 段(明文 JSON,上限 64 KiB−1)
bit3Stream流式请求
bit4Channel双工通道请求(隐含 Stream)
bit5Fragmented分片:开帧与续段置位,收尾段不带(见 §3.4)
bit6–7保留必须为 0

一帧的语义由 Type + Flags 共同表达:同一个 RESPONSE 帧型按位组合落在请求/响应、流式、双工、订阅投递等不同模式里。解码端按帧内 Flags 走变换管线、不依赖握手协商结果,所以单连接内可以混合发送(心跳与握手恒明文,大载荷才压缩)。

错误码 ​

ERROR 帧 payload 为 {"code": N, "message": "…"}(协议 §7.10)。携带非零 Stream ID 时终结该流;Stream ID = 0 表示连接级致命错误,双方随后必须断开 TCP。

code名称含义
1INTERNAL处理器内部错误(handler panic 归并为此)
2NOT_FOUND路由不存在
3INVALID载荷/参数非法(JSON 解码失败等)
4PROTOCOL协议违规(坏魔数、未知类型等帧层错误);Flags 声明与 handler 模式不符也用它,但只终结所在流
5CANCELLED对端已取消
6TIMEOUT服务端处理超时(v1 预留,当前无产生路径)
7AUTH_DENIED鉴权失败 / 拒绝连接
8SESSION_EXPIRED会话过期,恢复失败
9BUSY过载拒绝(含保留队列溢出)
10UNSUPPORTED对端使用了本端未启用的能力(如未启用加密却收到加密帧);发生在变换层,接收方直接断连

断连与否看错误发生在哪一层:握手与帧/变换层错误(版本不匹配、坏魔数、未知类型、非零保留位、解密/解压失败、UNSUPPORTED)必须断开;应用层语义错误(1/2/3/6/9)以 ERROR 回执后连接继续服务其他流。完整惯例见协议 §7.10。

Go 侧另有包级哨兵错误 ErrMalformed(帧结构损坏)与 ErrClosed(连接已关闭,API 参考 · 错误):它们是本地 API 返回值,不是线上错误码。

配置参数 ​

Config 全部 13 个字段的默认值与一句话语义。逐字段完整说明见 API 参考 · Config;协商生效规则(压缩/加密双方都开才启用、credit 取双方大于 0 者的最小值、心跳与保留期由服务端权威下发)见协议 §6.1,可运行的开关注册法见上手指南的参数化开关。

字段类型默认语义
Heartbeattime.Duration10sPING 间隔;读空闲超 1.5× 判死。零值取默认,低于 1s 钳到 1s
Compressboolfalseflate 压缩(载荷 ≥64B 才实际压缩)
EncryptboolfalseAES-256-GCM;启用时 Key 必须是 32 字节
Key[]bytenil32 字节预共享密钥,不上线传输
Creditint0(关闭)连接级信用窗口(条数);生效值 = min(双方配置),任一方 ≤0 关闭
Authstring""透传到 CONNECT 的令牌,服务端在 OnAuth 中校验
Retentiontime.Duration30s服务端会话保留期;负值禁用会话恢复
RetentionBytesint4 MiB每会话下行保留队列字节上限,超限失去恢复资格
DialTimeouttime.Duration5s建立 TCP 连接的超时
Reconnect*boolnil(= true)false 时客户端不自动重连
BackoffInitialtime.Duration100ms重连退避起点(指数 + 抖动)
BackoffMaxtime.Duration5s重连退避上限
LoggerLoggernil(静默)适配 *log.Logger 等常见实现

排障时先分清层次:帧/Flags/错误码的问题查本页前两节与 FAQ,行为不符合预期(重连、恢复、背压)查协议 §7/§8。

基于 MIT 许可发布