【问题标题】:binary vs text protocols二进制与文本协议
【发布时间】:2023-04-11 06:23:01
【问题描述】:

我想知道二进制和基于文本的协议之间有什么区别。 我读到二进制协议更紧凑/处理速度更快。 效果如何?由于您必须发送相同数量的数据?没有?

例如,字符串“hello”在二进制格式中的大小有何不同?

【问题讨论】:

  • 一个更有趣的问题是何时选择基于二进制或文本的协议,即它们的一般(缺点)优势是什么。 Max E. 的答案中的链接在这里很有帮助。
  • 当您已经知道二进制协议和文本协议之间的区别时,这是一个更有趣的问题,但是像我这样的人还必须了解这一点:)

标签: binary protocols


【解决方案1】:

如果您所做的只是传输文本,那么是的,两者之间的差异并不是很明显。但请考虑尝试传输以下内容:

  • 数字 - 您使用数字的字符串表示还是二进制表示?特别是对于大数,二进制会更紧凑。
  • 数据结构 - 如何在文本协议中表示字段的开始和结束?有时,具有固定长度字段的二进制协议更紧凑。

【讨论】:

    【解决方案2】:

    文本协议在可读性、易于重新实现和易于调试方面更好。二进制协议更紧凑。

    但是,您可以使用 LZO 或 Zlib 之类的库来压缩文本,这几乎与二进制文件一样紧凑(压缩/解压缩对性能的影响很小。)

    您可以在此处阅读有关该主题的更多信息:
    http://www.faqs.org/docs/artu/ch05s01.html

    【讨论】:

    【解决方案3】:

    字符串“hello”本身的大小不会不同。大小/性能差异在于序列化引入的附加信息(序列化是程序如何表示要传输的数据,以便一旦到达管道的另一端就可以重新构造)。

    例如,在 .NET 中使用 XML(文本序列化方法之一)序列化以下内容时:

    string helloWorld = "Hello World!";
    

    你可能会得到类似的东西(我知道这不准确):

    <helloWorld type="String">Hello World!</helloWorld>
    

    而二进制序列化将能够以二进制形式本地表示该数据,而无需所有额外的标记。

    【讨论】:

      【解决方案4】:

      如果您使用控制位/字节,二进制协议会更好

      即不是发送 msg:Hello 在二进制中,它可以是 0x01,后跟您的消息(假设 0x01 是代表 msg 的控制字节)

      所以,由于在文本协议中您发送 msg:hello\0 ...它涉及 10 个字节 在二进制协议中,它将是 0x01Hello\0 ...这涉及 7 个字节

      另一个例子,假设你想发送一个数字,比如 255,在文本中它的 3 个字节 在二进制中,它的 1 个字节即 0xFF

      【讨论】:

      • 更常见的是 4 个原始字节 (0x0000_00FF) 以支持更大的整数,并且您通常必须计算文本协议中的分隔符,也至少提供 4 个字节(“255”+ 1)。
      • @Roger Pate:重点是,与文本协议相比,二进制协议可能具有更高的熵。如果我知道这个数字在 1 到 255 之间,我为什么要使用整数对其进行编码?我也可以把你的例子反过来:如果确实需要大数字(例如从 1 到 4,294,967,295 的整数),那么任何大于 999 的数字都可以更有效地使用 32 个固定位而不是 4 个字节进行编码。
      • @Caffeine:如图所示,我使用“字节”作为“8 位”,所以 32 位等于 4 字节。
      • @Roger Pate:我的一个错字,我的意思是 ASCII 编码 超过 4 个字节(包括分隔符)
      【解决方案5】:

      您需要清楚什么是协议的一部分以及什么是数据的一部分。 文本协议可以发送二进制数据,二进制协议可以发送文本数据。

      协议是消息的一部分,状态为“嗨,我可以连接吗?我有一些数据,我应该把它放在哪里?,你有回复我吗?太好了!谢谢,再见!”

      在二进制协议中,转换的每一位(可能)要小得多,以 HTTP 为例(基于文本):

      如果您有一个编码标准,我敢打赌,您可以想出比单词“PUSH”所需的 4 个字节更小的字符序列

      【讨论】:

      • 另一方面,小 3 个字节并不是“小很多”。是的,它可以加起来,但有时人们会为 75% 的潜在节省而兴奋不已,别无所求。 (为了记录,我已经犯了很多次了。)
      【解决方案6】:

      有人说二进制协议更安全,例如What should follow the web? 中的 Mike Hearn。

      【讨论】:

        【解决方案7】:

        我不会说二进制格式的处理速度更快。如果您查看 CSV 或固定字段长度的文本格式 - 它仍然可以快速处理。

        我想说,一切都取决于谁是消费者。如果人类处于最后(如 HTTP 或 RSS),则无需以某种方式压缩数据,除非压缩它。

        二进制协议需要解析器/转换器,难以扩展并保持向后兼容性。协议栈越高,协议就越人性化(TCP 是二进制的,因为数据包必须由路由器高速处理,但 XML 更人性化)。

        我认为,尺寸变化在今天并不重要。对于您的示例,hello 的二进制格式与文本格式的数量相同,因为文本格式对于计算机来说也是“二进制”——只有我们解释数据的方式很重要。

        【讨论】:

        • -1 二进制格式可以更快地处理,因为它们可以更好地匹配机器表示。 HTTP 用于计算机到计算机的通信以及计算机到计算机的通信。与文本协议相比,二进制协议(可以)对解析器/转换器的需求更少。协议栈越高,协议就越抽象,而不是以人为本。如果你有一个好的阅读器(GIF 或 JPG 怎么样),二进制文件可以被认为是面向人的。尺寸变化可能非常重要 - 想想移动设备和移动网络。
        猜你喜欢
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 2015-08-16
        • 2011-02-01
        • 1970-01-01
        相关资源
        最近更新 更多