1. HTTP/1.1 的缺陷:
安全不足 和 性能不高;
(1)、高延迟 - - 带来页面加载速度的降低
网络延迟问题主要由于队头阻塞(Head-Of-Line Blocking),导致带宽无法被充分利用;
队头阻塞是指当前顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据,针对队头阻塞,人们尝试过以下办法来解决:
- 将同一页面的资源分散到不同域名下,提升连接上限。 Chrome有个机制,对于同一个域名,默认允许同时建立 6 个 TCP持久连接,使用持久连接时,虽然能公用一个TCP管道,但是在一个管道中同一时刻只能处理一个请求,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。另外如果在同一个域名下同时有10个请求发生,那么其中4个请求会进入排队等待状态,直至进行中的请求完成。
- Spriting合并多张小图为一张大图,再用JavaScript或者CSS将小图重新“切割”出来的技术。
- 内联(Inlining)是另外一种防止发送很多小图请求的技巧,将图片的原始数据嵌入在CSS文件里面的URL里,减少网络请求次数。
(2)、无状态特性 — 带来的巨大HTTP 头部
由于报文Header一般会携带”User Agent””Cookie””Accept””Server”等许多固定的头字段(如下图),多达几百字节甚至上千字节,但Body却经常只有几十字节(比如GET请求、204/301/304响应),成了不折不扣的“大头儿子”。Header里携带的内容过大,在一定程度上增加了传输的成本。更要命的是,成千上万的请求响应报文里有很多字段值都是重复的,非常浪费。
(3)、明文传输 — 带来的不安全性
HTTP /1.1 在传输的内容都是明文,客户端和服务器都无法验证对方的身份,这在一定程度上无法保证数据的安全性;
(4)、不支持服务器推送消息
2. SPDY协议 与 HTTP/2 :
HTTP
SPDY
SSL
TCP
HTTP/2 是先行HTTP协议(HTTP/ 1.X)的替代,HTTP方法/状态码/语义都与HTTP/1.X一致,HTTP/2 基于SPDY,专注于性能,最大的一个目标是在用户和网站只用一个连接。
HTTP/2由两个规范组成:
(1)、Hypertext Transfer Protocol version 2 - RFC7540
(2)、HPACK - Header Compression for HTTP/2 - RFC7541
3. HTTP/2 新特性
(1)、二进制传输
HTTP/2 传输数据量的大幅减少,主要有两个原因: 以二进制方式传输 和 Header 压缩。
HTTP/2 采用二进制格式传输数据,而非HTTP/1.x 里纯文本形式的报文 ,二进制协议解析起来更高效。HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。
HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
(2)、Header 压缩
HTTP/2并没有使用传统的压缩算法,而是开发了专门的”HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还采用哈夫曼编码来压缩整数和字符串,可以达到50%~90%的高压缩率。
(3)、多路复用
在 HTTP/2 中引入了多路复用的技术。多路复用很好的解决了浏览器限制同一个域名下的请求数量的问题,同时也接更容易实现全速传输,毕竟新开一个 TCP 连接都需要慢慢提升传输速度。
(4)、Server Push
比如,在浏览器刚请求HTML的时候就提前把可能会用到的JS、CSS文件发给客户端,减少等待的延迟,这被称为”服务器推送”( Server Push,也叫 Cache push)
另外需要补充的是,服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,换句话说,服务器不能随便将第三方资源推送给客户端,而必须是经过双方确认才行。
(5)、提高安全性
所以“事实上”的HTTP/2是加密的。也就是说,互联网上通常所能见到的HTTP/2都是使用”https”协议名,跑在TLS上面。HTTP/2协议定义了两个字符串标识符:“h2”表示加密的HTTP/2,“h2c”表示明文的HTTP/2。
4. HTTP/3 新特性
(1)、HTTP/2 的缺点
1、 TCP以及TCP+TLS 建立连接的延时;
HTTP/2都是使用TCP协议来传输的,而如果使用HTTPS的话,还需要使用TLS协议进行安全传输,而使用TLS也需要一个握手过程,这样就需要有两个握手延迟过程:
2、TCP 的队头阻塞并没有彻底解决
因为TCP为了保证可靠传输,有个特别的“丢包重传”机制,丢失的包必须要等待重新传输确认,HTTP/2出现丢包时,整个 TCP 都要开始等待重传,那么就会阻塞该TCP连接中的所有请求(如下图)
(2)、HTTP/3 的简介:
基于UDP协议的”QUIC” 协议,让HTTP跑在QUIC上而不是TCP上,完美解决了“队头阻塞”的问题。
1、 实现了类似TCP的流量控制、传输可靠性的功能。
2、 实现了快速握手功能。
3、 集成了TLS加密功能。
4、 多路复用,彻底解决TCP中队头阻塞的问题
5. 总结
(1)、HTTP/1.1有两个主要的缺点:安全不足和性能不高。
(2)、HTTP/2完全兼容HTTP/1,是“更安全的HTTP、更快的HTTPS”,头部压缩、多路复用等技术可以充分利用带宽,降低延迟,从而大幅度提高上网体验;
(3)、QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。