二进制协议死了吗?

时间:2010-03-26 17:09:39

标签: tcp binary client protocols

由于时间(拨号)的互联网速度非常慢,似乎曾经有更多的二进制协议。我一直在看到一切都被HTTP和SOAP / REST / XML所取代。

这是为什么?

二进制协议真的死了还是不太受欢迎?为什么他们会死或不受欢迎?

15 个答案:

答案 0 :(得分:43)

你不能打败二进制文件

二进制协议总是比文本协议更节省空间。即使互联网速度急剧增加,我们希望传达的信息量和复杂性也随之增加。

您参考的文本协议在标准化,灵活性和易用性方面非常出色。但是,总会存在二进制传输效率超过这些因素的应用程序。

大量信息本质上是二进制的,可能永远不会被文本协议所取代。视频流是一个明显的例子。

即使您压缩基于文本的协议(例如使用GZip),通用压缩算法也不会像围绕特定数据流设计的二进制协议那样高效。

但有时你不必

您看到更多基于文本的协议的原因是因为与广泛应用的数据大小相比,传输速度和数据存储容量确实快速增长。我们人类发现使用文本协议更加容易,因此我们围绕文本表示设计了无处不在的XML协议。当然,我们可以创建XML作为二进制协议,如果我们真的必须保存每个字节,并构建通用工具来可视化和处理数据。

然后,有时你真的做

许多开发人员习惯于考虑多GB,多核计算机。如今,即使是典型的手机也让我的第一台IBM PC-XT感到羞耻。仍然存在诸如嵌入式设备之类的平台,其对处理能力和存储器具有相当严格的限制。在处理这些设备时,二进制可能是必需的。

答案 1 :(得分:7)

与编程语言并行可能非常相关。

虽然高级语言是大多数编程工作的首选工具,并且由于CPU速度和存储能力的提高而成为可能(部分),但它们并没有消除对汇编语言的需求。

以类似的方式,非二进制协议引入了更多抽象,更具可扩展性,因此特别适用于应用程序级通信。他们也受益于带宽和存储容量的增加。然而,在较低的水平上,如此浪费仍然是不切实际的。

此外,与编程语言不同,有强烈的动机来“追求性能”以换取更简单,更快的开发等,层次结构通信的能力使得复杂性和“二元性” “较低层对应用程序级别相当透明​​。例如,只要收到的SOAP消息没问题,应用程序就不需要知道这些消息被有效压缩以通过线路传输。

答案 2 :(得分:6)

Facebook,Last.fm和Evernote使用Thrift binary protocol

答案 3 :(得分:5)

我很少看到这一点,但二进制协议,块协议尤其可以大大简化服务器架构的复杂性。

许多文本协议的实现方式使得解析器没有依据可以在接收到逻辑单元之前推断出需要多少数据(XML和JSON都可以提供最少的必要字节来完成,但是不能提供有意义的估计)。这意味着解析器可能必须定期切换到接收代码的套接字以检索更多数据。如果您的套接字处于阻塞模式,这很好,如果它们不是,那就不那么容易了。它通常意味着所有解析器状态必须保留在堆上,而不是堆栈。

如果您有一个二进制协议,在接收过程的早期阶段,您确切知道完成数据包所需的字节数,那么您的接收操作不需要与解析操作交错。因此,解析器状态可以保存在堆栈上,解析器可以为每个消息执行一次并直接运行而不会暂停以接收更多字节。

答案 4 :(得分:3)

在某些应用中总是需要二进制协议,例如极低带宽通信。但是基于文本的协议有很大的优势。例如,我可以使用Firebug轻松查看我的应用程序发出的每个HTTP调用发送和接收的内容。祝你好运用二进制协议:)

文本协议的另一个优点是,尽管它们的空间效率低于二进制,但文本数据压缩得非常好,因此可以自动压缩数据以获得两全其美的效果。例如,请参阅HTTP Compression

答案 5 :(得分:2)

二进制协议没有死。在许多情况下发送二进制数据要高效得多。

WCF支持使用TCP进行二进制编码。 http://msdn.microsoft.com/en-us/library/ms730879.aspx

答案 6 :(得分:2)

我在Internet应用程序中看到的一些二进制协议

  • Google Protocol Buffers用于内部通信,但也适用于Google Chrome书签同步
  • Flash AMF,用于与Flash和Flex应用程序进行通信。 Flash和Flex都具有通过REST或SOAP进行通信的能力,但是AMF格式对于Flex来说效率更高,因为有些benchmarks证明了

答案 7 :(得分:2)

我很高兴你提出了这个问题,因为自从引入XML以来,非二进制协议的使用倍数增加了许多倍。十年前,你会看到几乎每个人都在宣传他们对基于XML的通信的“合规性”。然而,这种方法是二元协议的几种方法之一,存在许多不足之处。

例如,其中一个值是可读性。但是,当人们阅读交易时,可读性对于调试很重要。与二进制传输相比,它们的效率非常低。这是因为XML本身是一个二进制流,必须使用另一个层将其转换为文本片段(“标记”),然后再将其转换为包含数据的二进制文件。

人们发现的另一个价值是可扩展性。但是,如果在事务开始时使用二进制流的协议版本号,则可以容易地维护可扩展性。可以发送二进制指示符,而不是发送XML标记。如果版本号是未知版本,则接收端可以下载该未知版本的“字典”。例如,该字典可以是XML文件。但是下载字典是一次操作,而不是每一笔交易!

因此,效率可以与可扩展性保持在一起,非常容易!有很多“编译的XML ”协议可以做到这一点。

最后,但并非最不重要的是,我甚至听到人们说XML是克服little-endian和big-endian类型二进制系统的好方法。例如,Sun计算机与英特尔计算机。但这是不正确的:如果双方都能以正确的方式接受XML(ASCII),那么双方肯定会以正确的方式接受二进制,因为XML和ASCII也会以二进制方式传输.......

希望你能找到这个有趣的读物!

答案 8 :(得分:1)

二进制协议将继续存在于需要高效的地方。大多数情况下,他们将生活在较低级别,其中硬件实现比软件实现更常见。速度不是唯一的因素 - 实施的简单性也很重要。使芯片处理二进制数据消息比解析文本消息容易得多。

答案 9 :(得分:1)

到目前为止,答案都集中在空间和时间效率上。没有人提到我认为这么多基于文本的协议的首要原因:共享信息。这是互联网的重点,使用基于文本的,人类可读的协议也很容易,它们也很容易被机器处理。通过文本数据交换,您可以摆脱语言依赖,特定于应用程序,平台偏向的编程。

链接您想要使用的任何XML / JSON / * - 解析库,找出信息的结构,并剪掉您感兴趣的数据片段。

答案 10 :(得分:1)

当然这完全取决于应用程序?到目前为止,有两种常见类型的示例,xml / html相关答案和视频/音频。一个被设计为Jonaton所指出的“共享”,另一个被设计为有效的数据传输(没有Matrix视觉,'阅读'电影永远不会像阅读HTML文档那样有用)。

轻松调试不是选择文本协议而不是'二进制'的理由 - 数据传输的要求应该指明这一点。我在航空航天工业工作,其中大多数通信是高速,可预测的数据流,如高度和无线电频率,因此它们在流上分配位,并且不需要人类可读的包装器。它的传输效率也很高,除干扰检测外,不需要元数据或协议处理。

当然,我会说他们并没有死。

我同意人们的选择可能会受到他们必须调试它们的影响,但也会严重依赖于所需的可靠性,带宽,数据类型和处理时间(以及可用的电源!)。

答案 11 :(得分:1)

他们并没有死,因为他们是每个通信系统的底层。每个主要通信系统的data linknetwork层都基于某种“二进制协议”。

以互联网为例,您现在可能正在局域网中使用EthernetPPPoE与您的ISPIP进行通信,以便在网上冲浪,也许{ {3}}下载文件。所有这些都是“二进制协议”。

我们看到这种向上层基于文本的协议的转变,因为与“二进制协议”相比,它们更容易开发和理解,并且因为大多数应用程序没有严格的带宽要求。

答案 12 :(得分:0)

取决于应用程序...... 我认为在实时环境(firewire,usb,现场总线......)将始终需要二进制协议

答案 13 :(得分:0)

  

二进制协议已经死了吗?

两个答案:

  1. 我们希望如此。
  2. 没有
  3. 至少一个二进制协议比XML更好,它提供了二进制协议的所有可读性,与的效率相比,的效率低于精心设计的ASCII协议。

答案 14 :(得分:0)

Eric J的回答几乎说明了,但这里有更多的思考和事实。请注意,下面的内容与媒体协议(视频,图像)无关。有些项目可能对你很清楚,但我每天都会听到神话,所以你去了......

  • 二进制协议和文本协议之间的表达性没有区别。您可以以相同的可靠性传输相同的信息。

  • 对于每个最佳二进制协议,您可以设计一个最佳文本协议,只需大约15%的空间,并且您可以在键盘上键入该协议。

  • 在实践中(每天都会看到实用的协议),由于许多二进制协议的静态特性,差异往往更小。

例如,取一个可能变得非常大的数字(例如,在32位范围内)但通常非常小。在二进制文件中,人们通常将其建模为四个字节。在文本中,它通常以打印数字后跟冒号完成。在这种情况下,低于10的数字变为两个字节,数字低于100三个字节。 (当然,您可以声称二进制编码很糟糕,并且您可以使用一些大小的位来使其更节省空间,但这是您必须记录,双方实施并且能够在它到来时进行故障排除的另一件事在你的电线上。)

例如,二进制协议中的消息通常由长度字段和/或终结符构成,而在文本协议中,您只需使用CRC。

  • 实际上,由于需要冗余,差异通常不太明显。

无论是二进制还是文本,您都需要一定程度的冗余。二进制协议通常不会留下任何错误。你必须100%正确地记录你发送的每一点,因为我们大多数人都是人类,这种情况很少发生,你读得不够好,无法做出正确的安全结论。

总而言之:理论上二元协议在空间和计算效率上更高,但实际上差异往往比你想象的要少,而且这笔交易往往不值得。我在物联网领域工作,几乎每天都要处理定制的,设计糟糕的二进制协议,这些协议很难排除故障,实现起来很烦人,而且空间效率也不高。如果您不需要绝对调整电池的最后一毫安并用微控制器周期(或传输介质)计算,请三思而后行。