IETF HTTP 工作组对提出的HTTP/2标准发布了最后的通告,这意味着在提交到RFC成为草案之前,已经进入了开放社区的审查流程。jetty已经实现了该协议,并且在这个站点中成功运行。关于这个标准已经拥有了很多的赞美之词,但是我仍然对这个协议一些丑陋的地方保留意见。 HTTP/2 是google开发的 SPDY协议的一个子集,在SPDY的照耀下,HTTP/2有着以下显而易见的优点。 特点: HTTP/2 支持RFC7230中指明的HTPP/1.1的所有语义。这使得可以在不改变任何代码的情况下,仅仅通过升级客户端和服务器端的基础结构来获得HTTP/2的优点。 HTTP/2 是一个可以在同一个TCP/IP连接中同时发起多个request,接收多个response的复用协议。它可以区分不同的response,因此将不会遇到HTTP/1.1中存在的Head of Line Blocking问题。所以,当需要多个资源渲染页面时,客户端将不再因为服务质量而向同一个目标服务器发起多个连接来获取资源。这意味着将显著减少服务器所消耗的资源以及负载均衡软件的sticky session问题。 HTTP header字段是非常累赘和多余的。HTTP/2 为HTTP量身定制一个高效的压缩算法(HPACK)来避免使用TSL协议时使用一般压缩算法导致的安全问题。减少header字段的使得在一个新创建的TCP/IP连接上可以一次性发送多个request,避免了因拥塞控制窗口的增长到限定值而导致的等待。这能显著地减少渲染页面时的网络往返次数。
HTTP/2 支持推送资源,因此后端服务器可以预估相关资源的请求并且推送它们到客户端的缓存中,进一步节省了网络的往返次数。 劣势只能使用一个!(二选一的意思)
当工作组被特许解决滥用HTTP1.1作为底层传输(比如 long polling 即长轮询)的时候,并没有考虑到其他工作组关于 HTTP/2.0兼容WebSocket语义的扩展。当 websocket over http2 的草案开始撰写时,一些草案中引用的特点随后被移除出HTTP/2,因为HTTP/2主要着重于提供HTTP的语义。 Meta Data Meltdown
在早期的协议版本中,对于头部有了一个压缩的算法,这个算法应对一个流的头部的加密/解密对于另外的一个头部加密/解密高质量的完成。这样产生出这样一个限定的协议,阻止头部帧传播到其他帧当中,而且,头部会会拒绝多路控制算法,因为一旦加密传播不能被推迟没有停止,对于其他的加密/解密。 协议设计有许多方面都是丑陋的.但是不幸的是,尽管工作组中有许多人都认同协议确实很丑陋,但是IETF审阅并没有考虑审美要求,认定当前的草案没有问题(尽管许多人争论,丑陋之处意味着将会有许多误解和欠缺的协议实现).我将引用一个主要的点作为例子: 这是结束吗? 一个经典的设计丑陋之处是使用END_STREAM标识.多路复用的流是由一个序列的帧组成,其中一些带有END_STREAM标识,意味着那个方向的流正结束.在下面的图中,草案描述了结果状态机图: +--------+ PP | | PP ,--------| idle |--------. / | | \ v +--------+ v +----------+ | +----------+ | | | H | | ,---| reserved | | | reserved |---. | | (local) | v | (remote) | | | +----------+ +--------+ +----------+ | | | ES | | ES | | | | H ,-------| open |-------. | H | | | / | | \ | | | v v +--------+ v v | | +----------+ | +----------+ | | | half | | | half | | | | closed | | R | closed | | | | (remote) | | | (local) | | | +----------+ | +----------+ | | | v | | | | ES / R +--------+ ES / R | | | `----------->| |<-----------' | | R | closed | R | `-------------------->| |<--------------------' +--------+ H: HEADERS frame (with implied CONTINUATIONs) PP: PUSH_PROMISE frame (with implied CONTINUATIONs) ES: END_STREAM flag R: RST_STREAM frame
|