Skip to main content
Beta —— 按区域逐步推出。 zstd 正在逐步启用。如果某个网关禁用了 zstd,receiveType: "zstd""zstd-dict" 的连接会被优雅地降级为 JSON —— 服务器会在 login_ok.receiveType 中告知协商后的模式。请始终信任该回显来选择解码器;切勿假设您请求的模式即为生效模式。

两种模式

两种模式都用 zstd 压缩每个数据帧;控制帧保持 JSON 文本。请根据您愿意承担的客户端工作量来选择: "zstd" 开始。 它完全不需要处理字典 —— 解压并解析即可。当您想要额外约 30–40% 的压缩收益、并能维护一个小型内存字典存储时,再迁移到 "zstd-dict"
有意不提供压缩版 MessagePack 模式 —— 在任何层面上,压缩 JSON 都优于压缩 MessagePack。

模式 1 —— zstd(无字典)

平滑接入路径。每个数据帧都是独立的、无字典的 zstd 帧(dictId = 0);服务器不会发送 dict 控制帧。您的客户端只需解压并解析。

登录

解码

这就是此模式的全部协议。

模式 2 —— zstd-dict(训练字典)

最大压缩比路径。oddsfixturesbookmakers 拥有约 32 KB 的训练字典,可将压缩比提升至约 7–9×。服务器在连接时以控制帧形式下发字典;每个数据帧内嵌了压缩时使用的 dictId,因此解码是自描述的,永远不需要按频道分支

登录

字典下发(服务器 → 客户端)

login_ok 之后(且在任何数据帧之前),对于每个拥有训练字典的已订阅频道,服务器推送一个控制帧:
  1. data 进行 Base64 解码,得到原始字典字节。
  2. 用它构建可复用的 zstd 解码器,并dictId 为键存储。
解码由每个数据帧内嵌的 dictId 驱动,而不是由频道驱动。dict 帧上的 channel/dictVersion 字段仅供参考。
字典很小(约 32 KB),并且会在每次连接时重新发送 —— 无需维护客户端版本缓存,登录时也无需发送 dicts 字段。没有训练字典的频道(例如 scoresclocks)不发送 dict 帧;其数据帧携带 dictId = 0,以无字典方式解码。

解码


帧规则(两种模式通用)

  • 每个数据帧都是一个 WebSocket Binary 帧,包含一个独立的 zstd 帧(魔数 28 B5 2F FD,内嵌 dictId)。
  • 控制帧(login_okdicterrorsnapshot_requiredresume_complete)保持为 JSON 文本帧,即使在 zstd 连接上也是如此。规则是固定的:
文本帧 → 控制(JSON)。二进制帧 → 数据(zstd)。
login_ok.receiveType协商后的模式("zstd""zstd-dict",或 —— 若网关禁用了 zstd —— "json")。如果返回 "json",请按纯 JSON 文本帧解码;不要尝试解压。

🐍 Python 示例

需要 pip install zstandard

另请参阅