HTTP1.0
每一个请求建立一个TCP连接,请求完成后立马断开连接。这将会导致2个问题:连接无法复用,head of line blocking
连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。head of line blocking会导致带宽无法被充分利用,以及后续健康请求被阻塞.
HTTP1.1
HTTP1.0每次请求都需要建立TCP连接,请求结束之后需要断开连接。为了克服这个缺陷,1.1升级了下面这些功能:
- 支持长连接:在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
- 支持虚拟主机(host字段),一个服务器可以放置多个网站,充分利用服务器资源。
- 流水线:包含多个请求和应答可以在一个tcp连接中传输。但是线头阻塞可能会影响性能。
- 带宽优化:支持断点续传。
- 缓存策略:强缓存( Cache-Control 浏览器命中的缓存),协商缓存(当浏览器没有命中强缓存后,便会命中协商缓存)。
HTTP 2.0
HTTP2.0的新特性主要有下面几点:
- 多路复用:做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
- 数据压缩:使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
- 服务器推送:对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
- 二进制分帧:应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。(HTTP 1.X 是基于文本的,因为是文本,就导致了它必须是个整体,在传输是不可切割的,只能整体去传。但 HTTP 2.0 是基于二进制流的。)