You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Binary transfer与文本协议差异及REST传输效率的技术问询

二进制协议与文本协议的核心区别

这问题问到点子上了——虽然底层所有数据都是0和1,但二进制协议和文本协议的核心差异,其实在数据的语义映射逻辑上,咱们拆解来看:

  • 编码目标不同:文本协议是把数据转成人类可读的字符集(比如UTF-8、ASCII),每个字符对应固定的二进制编码——简单说就是给机器传“人话”,抓包能直接看懂内容;二进制协议则跳过了“字符转译”环节,直接用自定义的二进制格式对应数据结构,抓包看是乱码,但机器能按预定义规则直接解析。
    举个例子:数字123,JSON会编码成三个字符'1''2''3'对应的二进制(0x31、0x32、0x33);而二进制协议可能直接用1个字节(0x7B)或者4字节整数存储,省了不少空间。
  • 解析成本不同:文本协议解析要两步走:先把二进制流解码成字符,再分析字符的语法(比如JSON要识别引号、逗号、括号这些分隔符);二进制协议直接按约定格式读字节/位,不需要字符解码和语法校验,CPU开销低很多。
  • 冗余度不同:文本协议为了可读性,会加大量额外开销——比如JSON的键名、引号、分隔符都是纯冗余内容;二进制协议可以紧凑编码,比如用1个字节存枚举值,变长编码存整数,把空间利用率拉到最高。
为啥纯文本场景下Binary Transfer比JSON快?

哪怕只传输文本内容,二进制序列化(比如用MsgPack、Protobuf这类工具)也比JSON高效,核心原因有三个:

  • 体积更小:JSON里字符串要加引号包裹,特殊字符还要转义(比如换行符\n要写成\\n);而二进制格式直接存储原始的UTF-8字节,不需要额外的包裹和转义。比如传"Hello, World!",JSON是"\"Hello, World!\""(15字节),MsgPack则是1字节标识长度+13字节文本(14字节),单条差异不大,但大量文本或复杂结构时,差异会指数级放大。
  • 解析更快:JSON解析需要做字符解码、语法校验(比如匹配括号、拆分键值对),这一步很耗CPU;二进制格式是“按约定读数据”——比如先读1字节知道字符串长度,再直接读对应字节数的内容,没有复杂的语法分析,解析速度能快好几倍。
  • 元数据开销更低:JSON的键名是重复的文本(比如每个用户对象都要传"username"),而二进制协议可以用整数ID代替键名(比如Protobuf用数字标识字段),不用反复传输长字符串,进一步压缩体积。

内容的提问来源于stack exchange,提问作者Sun

火山引擎 最新活动