本系列为极客时间上的《浏览器工作原理与实践》专栏的学习笔记
历史发展
HTTP 最早的一个版本是 HTTP/0.9 ,主要是为了学术交流的需求,因此设计的比较简单,没有请求头和响应头,也只能支持一种文件类型(html)的传输。
随着浏览器的推出,通过网络浏览各种文件的需求越来越多,因此就有了 HTTP/1.0 的推出,主要解决的是各种类型文件的下载问题,主要是通过增加请求头和响应头来解决,具体是:
- 文件类型
- 文件的压缩方法
- 文件的语言类型
- 文件的编码方式
随着技术的继续发展,需求也在迭代更新,新版本 HTTP/1.1 做了大量的优化工作,核心有以下几点:
- 增加持久连接(默认开启)。在一个 TCP 连接上传输多个 HTTP 请求
- 提供虚拟主机的支持。支持一台服务器可以提供多个域名,但是最终指向的是同一个 IP,所以请求头 需要增加字段 HOST 来表明该请求对应的哪个域名
- 客户端 Cookie、安全机制
解决问题
HTTP/1.1 存在的一些问题:
- TCP 的慢启动
- 多条 TCP 连接存在带宽竞争的问题
- HTTP/1.1 队头阻塞。一个 TCP 管道同一时刻只能处理一个请求,如果某个请求处理时间多长,就会导致其他请求处于等待过程
HTTP/2 的推出,主要是通过一个域名下只维持一个 TCP 连接和消除队头阻塞,来解决遗留问题。核心是通过多路复用技术来解决了 HTTP/1.1 的队头阻塞问题。
HTTP/2 的多路复用
HTTP/2 协议栈新增了一个二进制分帧层,来将各个请求数据转换为一个个带有请求 ID 编号的帧,通过协议栈发送给服务器。
服务器和浏览器,通过请求 ID 来将这些帧还原成一个个请求数据,继续处理。这样做的好处是,浏览器可以随时发送不同的请求,不用再等待上一个请求处理完成,也就解决了 HTTP/1.1 的队头阻塞问题。
同时还有其他的一些优点:
- 可以设置请求的优先级
- 服务器推送
- 头部压缩
虽然 HTTP/2 引入一个二进制分帧层,但是语义和 HTTP/1.1 是一样的,也就是通信语言没有改变,变的是传输方式。这样对于开发人员是比较友好的,部署起来也比较简单,这也是 HTTP/2 能够更快的推广的原因。
HTTP/3
即使 HTTP/2 通过多路复用解决了 HTTP/1.1 的队头阻塞问题,但是底层上还是基于 TCP 协议,因此就有一个问题绕不开:
TCP 为了保证数据传输的可靠性,对于丢失的数据包会有重传机制,这就会导致其他数据包在重传时期无法得到处理,造成 TCP 队头阻塞。
除了 TCP 队头阻塞,较长的握手时间也会导致网络延迟的增加。
为了解决这些问题,同时也不能抛开 TCP (难度与成本太大),只能是引入一个新的协议:QUIC,这个协议集合了以下几点功能:
- 实现了 TCP 的流量控制和传输可靠性
- 集成了 TLS 的加密功能
- 实现了 HTTP/2 的多路复用
在同一个物理连接上有多个独立的逻辑数据流,实现数据流的单独传输,解决了 TCP 的队头阻塞问题 - 实现了快速握手的功能
虽然 HTTP/3 有很多优点,但是由于动了底层协议,推广起来有来自各方面的挑战,等到最后大规模部署和优化会是一个比较缓慢的过程。