HTTP协议进化史
HTTP 1.0
- 对多文件提供良好的支持
- 引入状态码
- 提供Cache机制,用来缓存已经下载过的数据
- 加入User Agent字段,统计客户端基础信息
HTTP 1.1
Keep Alive
HTTP/1.0 每进行一次 HTTP 通信,都需要经历建立 TCP 连接、传输 HTTP 数据和断开 TCP 连接三个阶段。Keep Alive
可以在一个TCP连接上传输多个HTTP请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。- 浏览器对于同一域名,默认允许同时建立6个TCP持久连接
- 增加Host字段:使得一台物理主机上绑定多个虚拟主机,每个虚拟主机都有自己的单独的域名,服务器可以根据
Host
值做不同的处理。 - 增加Content-Length
- 引入Cookie机制
HTTP 1.1 的问题
- TCP的慢启动
- 同时开启了多条 TCP 连接,这些连接会竞争固定的带宽
- 同一个TCP管道,同一时刻只能处理一个请求
HTTP 2.0
- 多路复用
一个域名只使用一个 TCP 长连接来传输数据,但是可以并行请求 - 服务器推送
HTTP/2 还可以直接将数据提前推送到浏览器。你可以想象这样一个场景,当用户请求一个 HTML 页面之后,服务器知道该 HTML 页面会引用几个重要的 JavaScript 文件和 CSS 文件,那么在接收到 HTML 请求之后,附带将要使用的 CSS 文件和 JavaScript 文件一并发送给浏览器 - 头部压缩
HTTP 2.0的问题
- 丢包导致的阻塞问题
有一个数据因为网络故障或者其他原因而丢包了,那么整个 TCP 的连接就会处于暂停状态,需要等待丢失的数据包被重新传输过来。
在 HTTP/2 中,多个请求是跑在一个 TCP 管道中的,如果其中任意一路数据流中出现了丢包的情况,那么就会阻塞该 TCP 连接中的所有请求。当系统达到了 2% 的丢包率时,HTTP/1.1 的传输效率反而比 HTTP/2 表现得更好。
HTTP 3 —— QUIC
- 实现了类似 TCP 的流量控制、传输可靠性的功能。
- 集成了 TLS 加密功能
- 实现了 HTTP/2 中的多路复用功能,和 TCP 不同,QUIC 实现了在同一物理连接上可以有多个独立的逻辑数据流。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。
- 实现快速握手