到现在为止,HTTP协议已经有三个版本了:
- HTTP1.0
- HTTP1.1
- HTTP/2
HTTP1.0和HTTP1.1区别
HTTP1.1新改动:
- 持久连接
- 请求管道化
- 增加缓存处理(新的字段如cache-control)
- 增加Host字段、支持断点传输等
HTTP1.0和HTTP1.1最主要的区别就是:
- HTTP1.1默认是持久化连接!
在HTTP1.0默认是短连接:
简单来说就是每次与服务器交互,都需要新开一个连接!而现在不用再这样,HTTP1.1中建立一次连接,多次请求均由这个连接完成!
HTTP1.1和HTTP2.0比较
HTTP2新改动:
- 二进制分帧
- 多路复用
- 头部压缩
- 服务器推送
多路复用:
其最重要的就是解决了线头阻塞的问题!
多路复用意味着线头阻塞将不在是一个问题,允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息,合并多个请求为一个的优化将不再适用。
HTTP2所有性能增强的核心在于新的二进制分帧层(不再以文本格式来传输了),它定义了如何封装http消息并在客户端与服务器之间传输。
在HTTP/1.x中,用户想要多个并行的请求来提高性能,但是这样必须得使用多个TCP连接.这样的操作是属于HTTP/1.x 发送模型的直接序列.它能保证在每次连接中在一个时间点只有一个响应被发送出去.更糟糕的是,它使得队头阻塞和重要TCP连接的低效使用.在HTTP/2中,新的二进制帧层,解除了这个限制.使得所有的请求和响应多路复用.通过允许客户端和服务端把HTTP消息分解成独立的帧,交错传输,然后在另一端组装.
图12-3显示了在一次连接中的多个流.客户端传输数据帧到服务端(Stream5).服务端传输交错的帧序列(Stream1,Stream3)到客户端.此时,同时存在并行的3个流.
能够把HTTP消息分解成交错的帧,并在另一端组装它们是HTTP/2中一个非常重要的提高.事实上,它引起了一种波浪效应使得web技术的全栈在性能上有很大的提升
上面流的解释:
流:已经建立的连接之间双向流动的字节,它能携带一个至多个消息
帧:在HTTP/2通信的最小单元。每个桢包括一个帧头,里面有个很小标志,来区别是属于哪个流。
- 所有的通信都建立在一个TCP连接上,可以传递大量的双向流通的流。
- 每个流都有独一无二的标志和优先级。
- 每个消息都是逻辑上的请求和相应消息。由一个或者多个帧组成。
- 来自不同流的帧可以通过帧头的标志来关联和组装起来。
头部压缩
每个HTTP传输都包含一组描述传输资源及其属性的标题。在HTTP / 1.x中,此元数据始终以纯文本形式发送,并且每次传输的开销都会在任何位置增加500-800字节,如果使用HTTP Cookie,则会增加数千字节。为了减少这种开销并提高性能,HTTP / 2使用HPACK压缩格式来压缩请求和响应头元数据:
-
它允许通过静态霍夫曼编码对传输的头部字段进行编码,从而减少它们各自的传输大小。
-
它要求客户端和服务器都维护和更新先前看到的标题字段的索引列表(即,建立共享压缩上下文),然后将其用作参考以高效编码先前传输的值。
服务器推送
HTTP / 2的另一个强大的新功能是服务器为单个客户端请求发送多个响应的能力。也就是说,除了对原始请求的响应之外,服务器还可以向客户端推送额外的资源,而不需要客户端明确请求每一个资源!
HTTP / 2脱离了严格的请求 - 响应语义,并支持一对多和服务器启动的推送工作流程,在浏览器内部和外部打开全新的交互可能性。这是一个启动功能,对于我们如何考虑协议以及在何处以及如何使用协议,都会产生重要的长期影响。
为什么我们需要在浏览器中使用这种机制?一个典型的Web应用程序由几十个资源组成,所有这些资源都是客户端通过检查服务器提供的文档发现的。因此,为什么不消除额外的延迟并让服务器提前推送相关资源?服务器已经知道客户端需要哪些资源;这是服务器推动。
我们将该资源推送到客户端,而无需等待客户端请求。通过HTTP / 2,我们可以获得相同的结果,但是具有额外的性能优势:
-
推送的资源可以由客户端缓存
-
推送的资源可以在不同的页面上重复使用
-
推送的资源可以与其他资源一起复用
-
推送的资源可以由服务器优先
-
推送的资源可以被客户拒绝
每个推送的资源都是一个流,它允许客户端对其进行单独复用,优先化和处理。由浏览器执行的唯一安全限制是推送资源必须遵守同源策略:服务器必须对提供的内容具有权限。