为什么HTTP协议采用明文方式设计?

38

昨天,我和我的同事们讨论了HTTP。有人问为什么HTTP要以纯文本方式设计。当然,它可以像TCP协议一样以二进制方式设计,使用标志来表示不同种类的方法(POST,GET)和变量(HTTP头)。那么,为什么HTTP以这种方式设计?是否存在任何技术或历史原因?

10个回答

61

一个既有技术又有历史渊源的原因是,在Unix世界中,文本协议几乎总是首选。

实际上,这并不是一个理由,而是一种模式。其背后的原理是,文本协议允许您通过倾倒经过网络的所有内容来“看到”网络上正在发生的事情。您不需要像TCP/IP那样需要专门的分析工具。这使得调试和维护更加容易。

不仅HTTP,许多协议都是基于文本的(例如FTP、POP3、SMTP、IMAP)。

您可能想要查看《Unix编程艺术》以获得有关Unix的更详细解释。


1
TAOUP中关于文本协议的优点的讨论非常相关。此外,看看像ASN.1中描述的协议实现中的错误数量。(它们通常比未在ASN.1中描述的二进制协议更容易出错!) - Jonathan Leffler

21
使用HTTP时,请求的内容几乎总是比协议开销大数倍。将协议转换为二进制形式可以节省很少的带宽,而文本协议提供的易于调试性能轻松地胜过二进制协议所节省的少量带宽。

10
许多互联网应用协议使用更或者少量的纯文本协议(例如FTP、POP、SMTP等),这样做可以使得互操作性和故障排除更容易。

2
尤其是当你可以打开一个telnet会话并为调试而伪造对话的一方或双方时。 - Paul Tomblin

9

HTTP代表“超文本传输协议”。

最初它被设计为一种提供文本文档的方式,因此是基于文本的协议。

现在我们使用HTTP的方式已经远远超出了其最初的意图。


1
还有很多其他的互联网协议不是“超文本”。 - icelava

5
RFC 2616第3.7.1节有关HTTP 1.1一样,命令或标头的关键标识符是文本换行符CRLF;基于文本的应用程序协议使得仅使用Telnet客户端进行会话(以进行故障排除)更加容易。它还使得使用ReadLine()调用和匹配文本字符串更加容易编程。
CRLF参数断点还提供了几乎无限的任意标头扩展,不像固定大小的TCP或IP标头,其中一个通过位偏移硬编码。

3

那么,这样做是为了更容易“读取”流量或创建客户端或服务器?

你可以争论它是否实际上使它更容易,但肯定这是目的。


当然可以 - 你查看原始流量,就能看到正在发生的事情。大多数人类比解释原始二进制字节更擅长解释字符串,而计算机则非常快速,性能损失可以忽略不计。 - Piskvor left the building

3

1

我喜欢:

...在Unix世界中更受欢迎。

原因,但它没有解释为什么。

为了理解为什么需要将自己置于想要制作可用产品的设计师的角度。

A)您可以记录无意义的胡言乱语(二进制)。

B)开发或希望其他人开发工具以有意义的方式描绘您的无意义的胡言乱语。

或者

A)您可以记录充满意义的文本,利用语言作为自我记录协议的工具。

B)没有立即需要额外的工具,并且编写和调试附加工具将更容易。

它创建了分阶段交付并创建了一些更易于理解和回忆的东西,以便进行未来的开发。 它还创造了一个不再需要更高级抽象的情况。

想象一个世界,设置头部值不像在你的框架中的字典/Map那样简单。当遇到错误时,你必须不断质疑你的框架是否正确,因为没有额外的工具,你无法轻松地看到它是否做得正确。如果每个框架都需要发明/实现自己的高级抽象(浏览器就是其中之一),那么这将是HTTP的世界。

许多协议设计师都希望提高效率,但这种设计侧重于可用性,在软件开发行业中至关重要。过早优化的无用工具会为软件开发人员带来不必要的负担,并在各个方面表现出来。


1

从历史上看,一切都始于RFC822(ARPA互联网文本消息格式标准),其最新版本为RFC5322(互联网消息格式)。SMTP(RFC 821)是基于RFC822的最流行协议之一。而HTTP则源于SMTP(您的邮件协议)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接