随着Http协议发展的20年间,从物理带宽、CPU、内存,到软件都有了很大的提升,而原来的协议也具有了很大的局限性:
Http协议发展史
而HTTP/2 的主要设计思想应该都是源自 Google的 SPDY 协议。
HTTP/2试图解决HTTP/1.1的许多缺点和不灵活之处。
在Http1.x中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制,而超过限制数目的请求会被阻塞。
浏览器链接上限
而为了更快的加载速度,很多公司提供了多个静态资源的CDN域名,目的就是变相的解决浏览器针对同一域名的请求限制阻塞问题。
Http2.0通过多路复用,同时将多个资源通过同一个TCP链接发送到客户端。相比于Http1.0而言,减少了建立多个链接握手的时间,并且能实现并发发送资源。
而且TCP协议存在滑动窗口,在开始时滑动窗口比较小,随着数据的传送,滑动窗口会慢慢变大,就是说每次建立新连接后,数据先是慢慢地传,然后滑动窗口慢慢变大,才能较高速度地传。
而Http1.x在创建完新连接后,没用多久就关闭了,所以滑动窗口一直都非常小,传送的数据也就会很慢。而Http2.x由于资源都是通过该链接发送的,所以滑动窗口在后面的传输中就会一直保持最大化,这样就减少了Http1.x的突发性与短时性。
所以,HTTP2中用一条单一的长连接,避免了创建多个TCP连接带来的网络开销,提高了吞吐量。
HTTP1.0与HTTP2.0对比
应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层(Binary Framing)。
二进制帧
在BinaryFraming中,会将Http Header以及Http Request Data进行二进制编码,将数据放入Binary Framing这一层中。
HTTP2把数据分割成一个个二进制帧,然后为帧进行编号来区分不同的请求。但是:
总结:
HTTP1.x一直都是Plain Text(纯文本),方便阅读与抓包。而Https会把Plain Text加密成二进制数据。
HTTP2使用HPACK
压缩来压缩头部,减少报文大小。以下图为例:
method:Get
对应静态表中的2
user-agent:Mozilla/5.0
对应62
Header Compression
这个功能通常被称作“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。
这个功能帮助客户端将Z放进缓存以备将来之需。服务器推送需要客户端显式的允许服务器提供该功能。但即使如此,客户端依然能自主选择是否需要中断该推送的流。如果不需要的话,客户端可以通过发送一个RST_STREAM帧来中止。
Server Push
Turn-on HTTP/2 today! HTTP 2 的新特性你 get 了吗? HTTP/2.0 相比1.0有哪些重大改进?