一文带你了解HTTP的发展历程

469 阅读8分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

前言

现代互联网基于许多通信协议搭建而成,我们对于HTTP协议再熟悉不过了,随着互联网工程任务组(IETF)将HTTP-over-QUIC 命名为 HTTP/3.0HTTP发展来到了一个新的阶段。让我们来回顾下HTTP协议的发展历程。

超文本传输​​协议(HTTP) 是一个用于传输超媒体文档的应用层协议。1989年由Tim Berners-Lee发明,直到1991年, W3C和互联网工程任务组根据它来制定了 HTTP/0.9 标准。

HTTP/0.9

HTTP协议的起源,一开始并没有版本号,后来为了与其他版本区分开来,这个最初版本被定义为HTTP/0.9

这个版本相当简单,是一个单行协议,它没有请求头,只有一个GET方法,这是因为其最初设计目标是传输只包含文本的HTML文件。

HTTP/1.0

随后几年,HTTP 逐渐流行起来,截至 1995 年,世界上有超过 18000 台服务器使用HTTP协议处理请求。为了更好地应对发展带来的需求,人们在1996年通过 RFC 1945制定了 HTTP/1.0 规范。

1.0新增很多内容,大大丰富了浏览器与服务器的互动方式。这为互联网的大发展奠定了基础:

  • 相对于单一的 GET 请求,增加了 POSTHEAD
  • 引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
  • 内容协商。在HTTPContent-Type的帮助下,允许传输除HTML文件以外其他类型文档。
  • 得益于HTTP头,其他的新增功能还包括状态码、字符集支持、内容编码等等。

HTTP/1.1

1.0 发布的几个月后,1.119971月以 RFC 2068 文件正式发布,它属于1.0版本的修订版本,同时也是HTTP的第一个标准化版本。1.1版本是为了解决1.0遗留的问题并且进一步完善,一直用到了20多年后的今天,直到现在还是最流行的版本。

特性

  • 长连接HTTP头加入 Connection:keep-alive 可以复用一部分连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
  • 管线化技术:允许在等待上一个请求响应的同时,发送下一个请求,以降低通信延迟。
  • 额外的缓存控制机制:在 HTTP 1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP 1.1则引入了更多的缓存控制策略例如 ETagIf-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  • 额外的内容协商机制:新增语言,编码,类型等内容协商字段,并允许客户端和服务器之间以约定的内容进行信息交换。
  • Host字段:能够使不同域名配置在同一个IP地址的服务器上,使得一个服务器能够用来创建多个Web站点。
  • 分块传输编码:通过Content-LengthAccept-RangesContent-RangeHTTP头字段,允许服务器发送给客户端数据可以分成多个部分。

局限性

  • 虽然加入 keep-alive 可以复用一部分连接,但域名分片等情况下仍然需要建立多个连接,耗费资源,给服务器带来性能压力。
  • 队头阻塞1.0版本的遗留问题,管线化技术仍不能完全解决队头阻塞问题,即浏览器可以一次性发出多个请求(同个域名、同一条 TCP 连接)。但由于没有相应标识来区分哪个响应是哪个请求的,因此要求返回是按序的,那么前一个请求如果很耗时,那么后面的请求即使服务器已经处理完,仍会等待前面的请求处理完才开始按序返回。
  • 协议开销大:在使用时,首部里携带的内容过大,在一定程度上增加了传输的成本,并且有些请求的首部基本不怎么变化。尤其在移动端增加用户流量。

HTTP/2.0

2.0版本源于SPDY协议。2009 年,Google 的工程师 Mike BelsheRoberto Peon 提出了一种 HTTP 的替代方案: SPDY(发音同 speedy)。SPDY 不是第一个希望替代 HTTP 的方案,但它是其中最重要的一个,因为它带来了显而易见的性能提升。HTTP工作组最终以SPDY为起点来制定HTTP/2.0,于2015514 日随RFC 7540正式发布。

image.png

特性

HTTP/2.0的大部分特性是为了解决1.1的问题:

  • 二进制传输:相比 HTTP/1 的文本格式,HTTP/2.0 采用二进制格式传输数据。
  • 二进制分帧:通过在应用层和传输层之间增加一个二进制分层帧,二进制分层帧负责将所有传输信息分割为更小的消息帧,并对它们封装,加上流标识符等等。
  • 多路复用2.0突破1.1的性能限制,改进传输性能的关键。基于二进制分帧,多个请求可以复用同个TCP连接,传输以流的方式进行,不同请求的帧交错地经发送队列发送出去,不用在意发送顺序,因为接收端会根据流标识重新组装成一个完整的包。
  • 流量控制:基于TCP的流量控制机制,在不改变协议的情况下使用多种流量控制算法。
  • 请求优先级:每个消息帧都有一个优先级标识,服务器可以根据优先级控制资源分配,而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。
  • 头部压缩HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自缓存一份首部表,既避免重复header传输,又减少了需要传输的大小,提高传输效率。
  • 服务端推送:服务器除了响应原始请求外,还可以启发式地推送客户端接下来可能需要的资源,而无需客户端明确的请求。例如,客户端请求一个html文件,服务端除了响应html文件资源外,还额外返回cssjs等资源。

二进制分帧

image.png

多路复用 image.png

服务端推送 image.png

局限性

基于二进制分帧和多路复用,2.0版本彻底解决了应用层的HTTP队头阻塞问题,但是仍然具有一些局限性:

  • 传输层的TCP队头阻塞:TCP一旦发生丢包,就会触发重传机制,阻塞后续帧的传输,虽然有滑动窗口这个方案,但是只能增强抗干扰,并没有彻底解决,这一点不如1.1的多个TCP连接并行请求。总之,应用层的HTTP无法解决传输层TCP的问题。
  • 多路复用没有限制同时请求数,导致服务器压力上升。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

HTTPS = HTTP + SSL/TLS,以往HTTP是明文传输,在传输过程中可能会遭到劫持、篡改,然后也没有相应机制来进行内容可信度校验。HTTPSTCP基础上,增加了SSL/TLS加密层,混合使用对称加密、非对称加密来保证数据的加密传输,同时结合CA证书等组成了一套HTTP安全通信的架构。

image.png

HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:

  • TCP 三次握手建立连接
  • 客户端验证服务器数字证书CA
  • 通信双方协商对称加密算法、哈希算法的密钥
  • 安全加密隧道协商完成
  • 数据传输采用之前协商好的对称加密密钥进行加密传输,用协商的哈希算法进行数据完整性保护,保证数据不被篡改。

image.png

HTTP/3.0

HTTP/2.0极大提升了传输性能,TCP成为了下一个性能瓶颈。如何解决TCP队头阻塞?

TCP队头阻塞的产生是由TCP自身的实现机制决定的,无法避免。想要在应用程序当中避免TCP队头阻塞带来的影响,只有舍弃TCP协议。

谷歌为了提高Web联网的速度决定推倒重来,吸收TCP的优点,基于UDP协议推出了名为QUIC(快速UDP互联网连接)的实验性网络协议,最终演变成HTTP/3.0

image.png

从上图看出,传输层UDP保证了传输效率,应用层QUIC提供可靠、安全传输等,基于QUICHTTP/3.0彻底解决了HTTP的队头阻塞问题,并且拥有更大的定制化空间。

更多关于QUIC的特性参考:QUIC, a multiplexed transport over UDP - The Chromium Projects