1、二进制协议基础:什么是二进制协议、为什么交易所选择二进制协议、二进制协议与文本协议对比
1.1 什么是二进制协议
先说说我个人的理解。二进制协议,说白了就是机器和机器之间用「0和1」直接对话。
你想想看,我们人类写的是「BUY 100 BTC @ 50000」,但机器不认这个。它认的是——第1个字节表示操作类型,第2-5个字节表示价格,第6-9个字节表示数量。每个bit都有明确的含义,没有多余的空格、换行、逗号。
我在做早期交易系统时,第一次接触二进制协议,感觉就像在「裸写」数据。没有JSON那种花里胡哨的括号,没有XML的标签,就是纯粹的字节流。但正是这种「纯粹」,带来了极致的性能。
核心定义:二进制协议是一种基于字节流的数据交换格式,数据字段按固定或可变长度排列,通过预定义的偏移量和长度来解析每个字段的值。
举个例子,一个简单的订单消息,用二进制表示可能是这样:
// 二进制订单消息结构(32字节)
// 偏移 0: 消息类型 (1字节) -> 0x01 表示新订单
// 偏移 1: 订单ID (8字节) -> 长整型
// 偏移 9: 价格 (8字节) -> 双精度浮点
// 偏移 17: 数量 (8字节) -> 双精度浮点
// 偏移 25: 方向 (1字节) -> 0x00 买, 0x01 卖
// 偏移 26-31: 保留 (6字节)
字节序列: 01 00 00 00 00 00 00 0A 40 59 38 00 00 00 00 00 40 59 00 00 00 00 00 00 00 00 00 00 00 00 00 00
// 解析结果: 新订单, ID=10, 价格=100.0, 数量=100.0, 方向=买
嗯,这里要注意:二进制协议不一定是「固定长度」的。很多交易所也支持变长消息,但核心思想不变——每个字段的位置和长度都是事先约定好的。
1.2 为什么交易所选择二进制协议
这个问题我当年也问过自己。后来在对接几家头部交易所时,才真正体会到背后的原因。
原因一:速度就是金钱
在量化交易里,微秒级的延迟差距,可能就是盈利和亏损的分界线。二进制协议不需要像JSON那样做字符串解析,不需要做词法分析、语法分析。机器直接按偏移量读取字节,一步到位。
我曾经做过一个对比测试:同样一笔订单消息,JSON解析耗时约 2.3 微秒,二进制解析只需要 0.3 微秒。差了将近 8 倍。在每秒处理几万笔订单的场景下,这个差距就是天壤之别。
原因二:带宽就是成本
你想想看,同样的数据,用文本协议传输,体积可能是二进制协议的 3-5 倍。比如「价格 50000.00」,文本需要 9 个字节,二进制只需要 8 个字节(double)。别小看这点差距,在每秒百万级消息的行情推送中,带宽成本能差出好几倍。
原因三:确定性解析
文本协议有个坑——你不知道字符串里会不会有奇怪的字符。比如价格字段传了个「NaN」或者「Infinity」,解析器可能直接崩溃。二进制协议就没这问题,每个字段都是固定类型,解析逻辑是确定的。
我的经验:在对接某家二线交易所时,他们用的就是JSON协议。有一次行情数据里突然出现了一个超大数字,导致我们的解析器内存溢出。从那以后,我对文本协议就多了一份警惕。
1.3 二进制协议与文本协议对比
直接上对比表,这样更直观:
| 对比维度 | 二进制协议 | 文本协议(JSON/XML) |
|---|---|---|
| 解析速度 | 极快(直接内存读取) | 较慢(需要字符串解析) |
| 数据体积 | 小(无冗余字符) | 大(有引号、逗号、空格) |
| 可读性 | 差(需要工具解码) | 好(人类可直接阅读) |
| 调试难度 | 高(需要抓包+解码) | 低(直接看日志) |
| 跨语言兼容性 | 需注意字节序(大小端) | 天然跨语言 |
| 扩展性 | 需预留字段或版本号 | 灵活(可随意加字段) |
| 典型应用 | 高频交易、行情推送 | REST API、WebSocket |
说白了,选择哪种协议,取决于你的场景。如果你做的是高频交易,毫秒必争,那二进制协议是唯一选择。如果你做的是策略回测或者风控系统,对延迟不敏感,那文本协议反而更方便。
我个人习惯是:交易链路用二进制,日志和监控用文本。这样既保证了核心链路的性能,又保留了调试的便利性。
1.4 知识体系结构图
下面这张图,是我梳理的二进制协议知识体系。你可以把它当作本章的「地图」:
避坑提醒:我曾经在对接某交易所时,忽略了字节序(Endianness)的问题。他们用的是大端序,我默认用了小端序,结果解析出来的价格全是天文数字。排查了整整一个下午才发现。所以,拿到协议文档的第一件事,先确认字节序。
好了,关于二进制协议的基础概念,就聊到这里。记住一句话:二进制协议不是银弹,但在对延迟敏感的场景下,它是目前最优的选择。