本文参考 High Performance Browser Networking,获取更多详细内容请查看原文。
超文本传输协议的历程
超文本传输协议(HTTP)是我们在互联网世界中使用最为广泛的应用协议之一。作为客户端和服务器之间的通用交流语言,HTTP支撑了现代网络的发展。最初,这个协议的构思十分简单,由基本的关键词和文档路径构成,随着技术的进步,HTTP逐渐成为了所有连接互联网的软件和硬件的首选协议。
在这一章节,我们将探索HTTP协议的历史演变。虽然无法全面探讨其每一个细节和技术演进,但理解HTTP的一些重要设计变更及其动机,将为讨论HTTP的性能奠定基础,尤其是在HTTP/2所提供的众多改进的背景下。
HTTP 0.9:极简协议
Tim Berners-Lee最初设想的HTTP协议重点关注的就是简单性,以便支持他提出的万维网概念。这个思路取得了显著成功,从而吸引了世界各地的协议设计者。
在1991年,Berners-Lee阐明了这个新协议的动机,并列出了几个基本的设计目标,比如文件传输、对超文本存档的请求索引、格式协商以及将请求转发到其他服务器的能力。为了验证理论的合理性,他构建了一个简单的原型,实施了这一设想的一部分功能:
- 客户端请求是单行ASCII字符串。
- 以回车(CRLF)结束请求。
- 服务器返回一个ASCII字符流。
- 服务器回应为超文本标记语言。
- 文档传输结束后,连接关闭。
这种简单的协议支持通过Telnet进行交互,至今仍被部分Web服务器所使用。其实,这个协议正是HTTP 0.9的前身,标志着一个新时代的开始。
从这1991年的初步版本开始,HTTP很快开始独立发展,接下来总结一下HTTP 0.9的几个关键特点:
- 客户端-服务器架构,请求-响应模型。
- 在TCP/IP协议上运行的ASCII协议。
- 设计意在传输超文本文档(HTML)。
- 每次请求后关闭客户端与服务器之间的连接。
现在许多流行的Web服务器如Apache与Nginx仍支持HTTP 0.9,因为它的设计简洁明了。感兴趣的话,可以在Telnet会话中尝试访问某些网站,体验这个早期协议的表现。
HTTP/1.0:迅速演变的RFC
从1991到1995年,这是HTML规范和面向用户的Internet基础设施迅速发展的阶段,新兴Web功能的期望不断增加,HTTP 0.9的限制逐渐显露出来。我们需要一个更全面的协议,不仅要支持超文本文档,还要能够提供更详细的请求和响应元数据,支持内容协商等。
开发者们积极投入HTTP的实验性服务器和客户端实现,各种实践和相关模式逐步浮现。1996年,HTTP工作组发布了RFC 1945,正式记录了HTTP/1.0的“常见用法”。需要注意的是,这仅仅是一个信息性RFC,并没有成为正式的规范或标准。
一个典型的HTTP/1.0请求示例如下:
1
2
3
4
5
$>telnetwebsite.org 80
连接到xxx.xxx.xxx.xx
GET /rfc/rfc1945.txt HTTP/1.0
User-Agent: CERN-LineMode/2.15 libwww/2.17b3
接受:*/*
如上所示,HTTP/1.0引入了多个重要的改动:
- 请求头由多行字段组成。
- 响应状态通过状态行前缀。
- 禁止响应限于超文本文件。
- 连接在每次请求后关闭。
随着HTTP的继续演进,媒体类型协商、内容编码、缓存机制等也逐步进入规范,现今几乎每个Web服务器都在使用HTTP/1.0。
HTTP/1.1:成为互联网标准
HTTP的进一步发展是与HTTP/1.0的文档化工作同步进行的,历时近四年。1997年,RFC 2068作为第一个官方的HTTP/1.1标准发布。经过更新与改进,1999年6月,HTTP/1.1的更新版本RFC 2616正式推出。
HTTP/1.1标准针对早期版本中的协议歧义进行了澄清,并引入了许多性能优化措施,比如保持连接、分块编码、字节范围请求、增强的缓存控制等等。
现代HTTP/1.1会话的典型示例:
1
2
3
4
5
$>telnetwebsite.org 80
连接到xxx.xxx.xxx.xx
GET /index.html HTTP/1.1
主机:website.org
User-Agent: Mozilla/5.0…(剪切)
在这个版本中,请求和响应的复杂性显著增加,连接的保持活跃性被默认实施,从而优化了用户体验。
HTTP/1.1对协议的理解高度抽象,用户和开发者皆受益匪浅。显著的变化包括,但是不限于:
- 支持持续连接和资源复用。
- 时间延迟降低,网络请求更为流畅。
- 增加了丰富的请求和响应头。
正如前文所述,HTTP语义学的改变使得HTTP的运输效率获得了突破,而这在许多现代应用中继续发挥着关键作用。
HTTP/2:传输性能的提升
自RFC 2616发布以来,HTTP协议经历了巨大的发展,成为全球数十亿设备的基础协议。HTTP起初只是单一请求到超文本的简单协议,但随着技术进步,大家意识到需要一种更高级的协议来满足日益增长的使用需求。
为了应对这些挑战,HTTPbis工作组于2012年启动了HTTP/2的开发。
HTTP/2的核心目标是显著提升传输性能,以更低的延迟和更高的吞吐量为特色。值得注意的是,虽然其设计上进行了许多重大的增强,但所有现有的HTTP标头、值和用例却都保持不变。也就是说,当前的网站和应用无需变更即可通过HTTP/2交付。
HTTP/2确保新旧终端的无缝迁移,目标是让应用程序可以以更高的效率和更低的延迟传递。虽然HTTP/1.1依然会在可预见的将来继续支持,但HTTP/2将会为未来的网上应用设置一个新的标杆。
HTTP/3:基于QUIC协议的新纪元
尽管HTTP/2引入了许多性能优化,如多路复用、头部压缩等,但它依然依赖于TCP作为传输层协议,这限制了某些方面的性能提升,特别是在处理高延迟和不稳定的网络环境时。因此,HTTP/3应运而生,它最大的变化在于采用了UDP为基础的QUIC协议,以进一步提高网络性能。核心特性有:
- 基于QUIC:QUIC是一个新的传输层协议,旨在提供更快速的连接建立、减少延迟,并且能够更好地处理丢包问题。
- 0-RTT连接建立:通过重用之前会话的安全参数,可以在新连接上发送数据而无需等待完整的TLS握手完成,大大减少了首次请求的时间。
- 改进的多路复用:解决了HTTP/2中存在的“队头阻塞”问题,在一个流上的丢失不会影响其他流的数据传输。
- 更好的安全性:默认采用TLS 1.3,增强了隐私保护和数据完整性。
通过对过去和现在的比较,我们可以看出HTTP协议经历了从简单到复杂,从单一的超文本传输到超媒体的演变过程,这一切都在推动着互联网的发展。了解HTTP的历史,对于从事网络开发和应用设计的每位专业人士来说,都是至关重要的。