Http2
二进制协议
- 基于二进制的
http2
可以使成帧的使用变得更为便捷 - 更加便捷的从帧结构中分离出那部分协议本身的内容
多路复用的流
流是一个逻辑上的联合,一个独立的,双向的帧序列可以通过一个http2
的连接在服务端与客户端之间不断的交换数据。在流里面,每一帧发送的顺序非常关键。接收方会按照收到帧的顺序来进行处理。流的多路复用意味着在同一连接中来自各个流的数据包会被混合在一起。就好像两个(或者更多)独立的“数据列车”被拼凑到了一辆列车上,但它们最终会在终点站被分开。
它们就是这样通过多路复用的方式被组装到了同一列火车上:
在http2里面,我们很容易可以看到10个甚至100个同时存在的流,而创建一个新的流的代价也非常低。
优先级和依赖性
每个流都包含一个优先级(也就是“权重”),它被用来告诉对端哪个流更重要。当资源有限的时候,服务器会根据优先级来选择应该先发送哪些流。
优先级和依赖关系可以在传输过程中被动态的改变。这样当用户滚动一个全是图片的页面的时候,浏览器就能够指定哪个图片拥有更高的优先级。或者是在你切换标签页的时候,浏览器可以提升新切换到页面所包含流的优先级。
头压缩
HPACK
,HTTP/2
头部压缩,顾名思义它是一个专为http2头部设计的压缩格式
重置 - 后悔药
HTTP 1.1的有一个缺点是:当一个含有确切值的Content-Length
的HTTP
消息被送出之后,你就很难中断它了。当然,通常你可以断开整个TCP
链接(但也不总是可以这样),但这样导致的代价就是需要通过三次握手来重新建立一个新的TCP连接。
一个更好的方案是只终止当前传输的消息并重新发送一个新的。在http2
里面,我们可以通过发送RST_STREAM
帧来实现这种需求,从而避免浪费带宽和中断已有的连接。
服务器推送-缓存推送
这个功能通常被称作“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。这个功能帮助客户端将Z放进缓存以备将来之需。
服务器推送需要客户端显式的允许服务器提供该功能。但即使如此,客户端依然能自主选择是否需要中断该推送的流。如果不需要的话,客户端可以通过发送一个RST_STREAM
帧来中止。
流量控制
http2
上面每个流都拥有自己的公示的流量窗口,它可以限制另一端发送数据。