为什么我们不在http上发送二进制而不是文本?

时间:2009-12-12 02:06:00

标签: http binary

似乎二进制文件会更紧凑并且可以以标准方式反序列化,为什么要使用文本呢?它似乎效率低下,并且Web框架被迫除了使用字符串之外什么都不做。为什么没有二进制标准?网络会更快,浏览器可以非常快地加载二进制页面。

如果我要启动二进制协议(HBP超级二进制协议),我会定义哪种标准?

8 个答案:

答案 0 :(得分:30)

HTTP协议本身可以作为文本读取。这很有用,因为您可以远程访问任何服务器并与之通信。

通过文本,您还可以轻松地通过wireshark等程序观看HTTP通信。然后,您可以轻松诊断问题的根源。

HTTP定义了一种使用resources的方法。这些资源不需要是文本,也可以是图像或其他任何内容。通过指定Content-Encoding标头,可以将文本资源作为二进制文件发送。您的资源类型是通过Content-Type标题指定的。

所以你的问题实际上只适用于HTTP协议本身,而不适用于作为资源的有效载荷。

  

网络速度更快,浏览器可以非常快速地加载二进制页面。

我不认为这是真的。最慢的部分可能是连接建立和slow TCP start

以下是HTTP响应如何使用二进制表示形式发送文本资源的示例:

  

HTTP / 1.1 200 OK
  服务器:Apache / 2.0
  内容编码:gzip
  内容长度:1533   内容类型:text / html;字符集= ISO-8859-1

答案 1 :(得分:13)

基于文本的协议有许多重要的优点:

  • 假设您使用的是UTF-8或其他面向八位字节的编码,则无法解决字节顺序问题。
  • 让每个人都同意基于文本的模式(例如用XML完成的模式)是很困难的。想象一下,试图让每个人都同意二进制协议中的数字应该是多少位。
    • 相关地,想象一下试图让他们就浮点表示达成一致。这不是一个假设 - IBM威胁要破坏ECMAScript 5标准化工作而不是浮点表示问题。
  • 网络是基于文本的,我不只是指协议级别。大部分内容都是文本(同时,几乎所有内容都是文本)。因此,现代编程语言已经围绕着他们使用文本的想法而成长,并且解析二进制格式并不那么重要。
    • 不久前,我不得不在Python中生成一个不起眼的二进制格式,以便与遗留系统进行交互。事实证明这比我想象的要痛苦得多。解析它会远远更糟。
  • 开发人员无法查看字节流并按照他可以查看的方式说“哦,我的字符串长度丢失”一个XML文档并说“哦,那个元素没有被关闭”。这使得开发和故障排除变得更加容易。
  • 性能被高估,而XML解析器现在“足够快”。如果你正在做的事情真的必须从硬件中挤出最后一点性能,你几乎肯定做任何基于网络的事情,并且可能会构建你自己的二进制协议在您已经控制的两个应用程序之间进行通信。

答案 2 :(得分:11)

二进制通信标准,其中许多都是http之前的日期。我构建/工作了一个二进制的客户端/服务器数据库协议,它确实工作并且在字节方面是有效的。所以问题是,为什么市场上会出现文本格式的胜利?

我认为可能有很多因素,但我相信这些是最重要的因素:

  • 您可能不记得从XML之前的日子开始,但是在尝试交换数据时,字节排序曾经是一件令人头疼的问题。每一点都很珍贵,所以文件格式尽可能紧密地打包。但是,只要您尝试在Mac和PC与大型机之间交换文件,就会意识到整数的二进制版本远非标准。程序员花了无数个小时来纠正这个问题。
  • 使用文本流可以更轻松地进行调试和开发。正如有人指出的那样,您可以使用telnet终端会话来进行一些开发。很多时候你可以忽略字符编码问题。 Unix管道和流的简单比喻可能是它成功的主要原因。它更容易。

答案 3 :(得分:8)

好吧,它看起来像是在发布,但是......看来,你在预测未来。 HTTP 2.0将是二进制文件。

答案 4 :(得分:2)

答案 5 :(得分:2)

你可以随时gzip你的文字。

答案 6 :(得分:1)

以前,将二进制文件编码为文本被视为浪费(带宽)资源。您不仅需要编码和解码,而且还必须非常清楚您想要发送的对象的二进制对象的类型,以及可能的结构。 XML有时会让你觉得这是自动出现的错觉。但事实并非如此。

正如Brian所提到的,文本编码是一个很大的优势,你作为一个人可以很容易地生成和调试它们。

一种有趣的非文本格式是ASN.1(抽象语法表示法No.1)。与编码规则(BER - 基本编码规则,DER - 可分辨编码规则等)一起,您最终会得到一个非常非常紧凑的二进制结构编码,它针对网络传输进行了高度优化。这里定义了甚至处理不同的字节性别。  ASN.1在X.-协议族(X.25,X.400,X.500等)中使用和传播。它仍然在LDAP中使用。还定义了用XML编码数据的编码规则(XER-XML编码规则)。请参阅http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

答案 7 :(得分:0)

只要我们人类与数据进行交互(即通过UI视图,编辑或只是阅读),它就可以保留为文本。

如果软件系统决定将文本转换为二进制文件以进行紧凑存储,缓存或传输,则可以执行此操作,但它应该在幕后。所以这只是优化问题。由于过早优化是许多问题的根源,因此可以在项目路线图上的非常晚的位置实施。