[TOC]
随着Http的发展,对于HTTP 1.1很难完全使用出TCP协议能提供的所有强大能力,HTTP1.1太过繁琐,延迟也很高,HTTP Pipelining是这样一种技术:在等待上一个请求响应的同时,发送下一个请求,来了HTTP2这位;
以前的弊端
改善http1.1
1. 降低协议对延迟的敏感
2. 修复pipelining和head of line blocking的问题
3. 防止主机需求更高的连接数量
4. 保留所有现有的接口,内容,URI格式和结构
5. 由IETF的HTTPbis工作组来制定
Http2背景
既然是升级版,网络协议发展了这么久,也是要兼容上一代的http1.1的,但是取消了小版本下一代就是http3了;对于现有的url不会改变,毕竟后台代码就在那,
针对https的http2,大部分使用TLS;
http2协议
http2是一个二进制协议
当然使用了这么多中的字符字节编码和文本协议后,二进制的好处还是很多的,对于http1.1的帧混乱有了很好的解决;http1.1中对于帧的起始和结束识别起来很复杂,而通过移除掉可选的空白符以及其他冗余后,再来实现这些会变得更容易.
-
二进制格式: http2会发送有着不同类型的二进制帧,但他们包含公共字段:type,length,flags,streamID, frame等一共含有10种不同的帧,最基础的对应着http1.1的data和headers,
-
多路复用的流: stream identifier将http2连接上传输的每个帧都关联到一个流上,流是一个独立的,双向的帧序列(和channl还是有区别的,半双工)这是全双工概念的,里面可以包含来自两端的帧;流既可以被客户端/服务器端单方面的建立和使用,也可以被双方共享,或者被任意一边关闭。在流里面,每一帧发送的顺序非常关键。接收方会按照收到帧的顺序来进行处理。
-
优先级和依赖性:
每个流都包含一个优先级,它被用来告诉对端哪个流更重要,当资源有限时,服务器优先发送那些帧,借助于PRIORITY帧(优先帧),该功能能让客户端告之服务器当前的流依赖其他哪个流,让客户端建立一个优先级树; 所有的子流会依赖于父流的传输完成情况, 优先级和依赖关系可以在传输过程中被动的改变; -
头压缩
http是一种无状态的协议,意味着每个请求都必须携带着服务器所需要的所有细节,而不是服务器保存着之前请求的元数据,http2并没有做出改变,依旧这样用着;
这也保证了http的可重复性,当一个客户端从同一服务器请求了大量的资源,大部分的请求是类似的,正好可以被压缩.cookie需要被包含在所有请求中,且大部分中都是一模一样的. -
重发取消机制:http2可以发送一个取消帧RST_STREAM,将终止当前传输的消息,并发送一个新的
- 服务器推送:称为”缓存推送”,当一个客户端请求资源X时,而服务器知道他很可能也需要资源Z的情况下,服务器可以在客户端发送请求之前,主动将资源Z推送给客户端,客户端缓存z以便不时只需,
- 流量控制:每个http2流都拥有自己公示的流量窗口,它可以限制另一端发送数据。于每个流来说,两端都必须告诉对方自己还有足够的空间来处理新的数据,而在该窗口被扩大前,另一端只被允许发送这么多数据。
发表回复