http 1.1
- 持久连接。 HTTP/1.1 默认开启持久连接,在 TCP 连接建立后不立即关闭,让多个 HTTP 请求得以复用。
- 管线化技术。 HTTP/1.1 中,多个 HTTP 请求不用排队发送,可以批量发送,这就解决了 HTTP 队头阻塞问题。但批量发送的 HTTP 请求,必须按照发送的顺序返回响应,相当于问题解决了一半,仍然不是最佳体验。
- 支持响应分块。 HTTP/1.1 实现了流式渲染,响应端可以不用一次返回所有数据,可以将数据拆分成多个模块,产生一块数据,就发送一块数据,这样客户端就可以同步对数据进行处理,减少响应延迟,降低白屏时间。 Bigpipe 的实现就是基于这个特性,具体是通过定义 Transfer-Encoding 头来实现的。
- 增加 Host 头。 HTTP/1.1 实现了虚拟主机技术,将一台服务器分成若干个主机,这样就可以在一台服务器上部署多个网站了。 通过配置 Host 的域名和端口号,即可支持多个 HTTP 服务:Host::
- 其他扩展。 增加 Cache-Control、E-Tag 缓存头。 增加 PUT、PATCH、HEAD、 OPTIONS、DELETE 请求方法。
http 2.0
- 请求优先级 多个 HTTP 请求同时发送时,会产生多个数据流,数据流中有一个优先级的标识,服务器端可以根据这个标识来决定响应的优先顺序。
- 多路复用 TCP 传输时,不用按照 HTTP 的发送顺序进行响应,可以交错发送,接收端根据帧首部的标识符,就能找到对应的流,进而重新组合得到最终数据。
- 服务器端推送 HTTP/2 允许服务器未经请求,主动向客户端发送资源,并缓存到客户端中,以避免二次请求。 HTTP/1.1 中请求一个页面时,浏览器会先发送一个 HTTP 请求,然后得到响应的 HTML 内容并开始解析,如果发现有 <script src="xxxx.js"> 标签,则会再次发起 HTTP 请求获取对应的 JS 内容。而 HTTP/2 可以在返回 HTML 的同时,将需要用到的 JS、CSS 等内容一并返回给客户端,当浏览器解析到对应标签时,也就不需要再次发起请求了。
- 头部压缩 HTTP/1.1 的头部字段包含大量信息,而且每次请求都得带上,占用了大量的字节。 HTTP/2.0 中通信双方各自缓存一份头部字段表,如:把 Content-Type:text/html 存入索引表中,后续如果要用到这个头,只需要发送对应的索引号就可以了。
http 3.0
将传输层替换为 QUIC,通过改进的拥塞控制、流量控制、0-RTT 建连、传输层多路复用、连接迁移等特性,进一步提升了 HTTP 传输效率。
- 传输层连接更快。
- 传输层多路复用。
- 改进的拥塞控制。
- 优化的流量控制。
- 加密认证的报文。
- 连接迁移。
- 前向纠错机制。