这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
前言
现代互联网基于许多通信协议搭建而成,我们对于HTTP协议再熟悉不过了,随着互联网工程任务组(IETF)将HTTP-over-QUIC 命名为 HTTP/3.0,HTTP发展来到了一个新的阶段。让我们来回顾下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请求,增加了POST和HEAD - 引入了
HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。 - 内容协商。在
HTTP头Content-Type的帮助下,允许传输除HTML文件以外其他类型文档。 - 得益于
HTTP头,其他的新增功能还包括状态码、字符集支持、内容编码等等。
HTTP/1.1
1.0 发布的几个月后,1.1 在1997年1月以 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则引入了更多的缓存控制策略例如ETag,If-Unmodified-Since,If-Match,If-None-Match等更多可供选择的缓存头来控制缓存策略。 - 额外的内容协商机制:新增语言,编码,类型等内容协商字段,并允许客户端和服务器之间以约定的内容进行信息交换。
Host字段:能够使不同域名配置在同一个IP地址的服务器上,使得一个服务器能够用来创建多个Web站点。- 分块传输编码:通过
Content-Length、Accept-Ranges、Content-Range等HTTP头字段,允许服务器发送给客户端数据可以分成多个部分。
局限性
- 虽然加入
keep-alive可以复用一部分连接,但域名分片等情况下仍然需要建立多个连接,耗费资源,给服务器带来性能压力。 - 队头阻塞:
1.0版本的遗留问题,管线化技术仍不能完全解决队头阻塞问题,即浏览器可以一次性发出多个请求(同个域名、同一条TCP连接)。但由于没有相应标识来区分哪个响应是哪个请求的,因此要求返回是按序的,那么前一个请求如果很耗时,那么后面的请求即使服务器已经处理完,仍会等待前面的请求处理完才开始按序返回。 - 协议开销大:在使用时,首部里携带的内容过大,在一定程度上增加了传输的成本,并且有些请求的首部基本不怎么变化。尤其在移动端增加用户流量。
HTTP/2.0
2.0版本源于SPDY协议。2009 年,Google 的工程师 Mike Belshe 和 Roberto Peon 提出了一种 HTTP 的替代方案: SPDY(发音同 speedy)。SPDY 不是第一个希望替代 HTTP 的方案,但它是其中最重要的一个,因为它带来了显而易见的性能提升。HTTP工作组最终以SPDY为起点来制定HTTP/2.0,于2015 年 5 月 14 日随RFC 7540正式发布。
特性
HTTP/2.0的大部分特性是为了解决1.1的问题:
- 二进制传输:相比
HTTP/1的文本格式,HTTP/2.0采用二进制格式传输数据。 - 二进制分帧:通过在应用层和传输层之间增加一个二进制分层帧,二进制分层帧负责将所有传输信息分割为更小的消息帧,并对它们封装,加上流标识符等等。
- 多路复用:
2.0突破1.1的性能限制,改进传输性能的关键。基于二进制分帧,多个请求可以复用同个TCP连接,传输以流的方式进行,不同请求的帧交错地经发送队列发送出去,不用在意发送顺序,因为接收端会根据流标识重新组装成一个完整的包。 - 流量控制:基于
TCP的流量控制机制,在不改变协议的情况下使用多种流量控制算法。 - 请求优先级:每个消息帧都有一个优先级标识,服务器可以根据优先级控制资源分配,而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。
- 头部压缩:
HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自缓存一份首部表,既避免重复header传输,又减少了需要传输的大小,提高传输效率。 - 服务端推送:服务器除了响应原始请求外,还可以启发式地推送客户端接下来可能需要的资源,而无需客户端明确的请求。例如,客户端请求一个
html文件,服务端除了响应html文件资源外,还额外返回css,js等资源。
二进制分帧
多路复用
服务端推送
局限性
基于二进制分帧和多路复用,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是明文传输,在传输过程中可能会遭到劫持、篡改,然后也没有相应机制来进行内容可信度校验。HTTPS在TCP基础上,增加了SSL/TLS加密层,混合使用对称加密、非对称加密来保证数据的加密传输,同时结合CA证书等组成了一套HTTP安全通信的架构。
HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:
TCP三次握手建立连接- 客户端验证服务器数字证书
CA - 通信双方协商对称加密算法、哈希算法的密钥
- 安全加密隧道协商完成
- 数据传输采用之前协商好的对称加密密钥进行加密传输,用协商的哈希算法进行数据完整性保护,保证数据不被篡改。
HTTP/3.0
HTTP/2.0极大提升了传输性能,TCP成为了下一个性能瓶颈。如何解决TCP队头阻塞?
TCP队头阻塞的产生是由TCP自身的实现机制决定的,无法避免。想要在应用程序当中避免TCP队头阻塞带来的影响,只有舍弃TCP协议。
谷歌为了提高Web联网的速度决定推倒重来,吸收TCP的优点,基于UDP协议推出了名为QUIC(快速UDP互联网连接)的实验性网络协议,最终演变成HTTP/3.0。
从上图看出,传输层UDP保证了传输效率,应用层QUIC提供可靠、安全传输等,基于QUIC的HTTP/3.0彻底解决了HTTP的队头阻塞问题,并且拥有更大的定制化空间。
更多关于QUIC的特性参考:QUIC, a multiplexed transport over UDP - The Chromium Projects