Skip to main content

http2的特点

HTTP/2的主要目标是改进性能。

HTTP/2的一些特点

  1. 头部压缩,使用专门的HPACK算法进行压缩,简单讲就是客户端和服务器维护了一个索引表,通过传输索引,然后查表获得头字段的值。

  2. 二进制格式,HTTP/2的报文全面采用二进制格式。

    原来的"Header + Body"的消息打散为数个小片的二进制帧,用"HEADERS"帧存放头数据,"DATA"帧存放实体数据。

    消息的“碎片”到达目的地后使用“流”(stream)的概念进行组装。流是一个二进制帧的双向传输序列,同一个消息往返帧会分配一个唯一的流ID。

    可以认为这是一个虚拟的数据流,其中流动的是一串有先后顺序的数据帧,这些数据帧按照次序组装起来就是请求和响应报文。

  3. 多路复用

    因为采用了二进制帧的传输方式,在“流”的层面上看,消息是一些有序的帧序列;而在连接的层面上看,消息就是一个个数据帧。多个请求响应就没有顺序关系,不需要排队等待,也就解决了队头阻塞问题。

    因为可以同时发送多个请求/响应,那么多个往返通信就可以用一个连接处理,实现多路复用。

  4. 服务器推送

    服务器可以主动向浏览器推送消息。例如浏览器刚请求HTML文件的时候,服务器就提前把可能用到的JS、CSS文件推送给浏览器,减少等待的延迟。

  5. 优先级

  6. HTTP/2也分为明文传输和加密传输,但是主流的浏览器默认HTTP/2是加密传输的,即互联网上常见的HTTP/2都是使用https的协议名,跑在TLS上面。

下图是HTTP/1、HTTPS、HTTP/2协议栈对比图:

对比

HTTP/2多了个头部压缩的算法和二进制帧的传输流

HTTP/2的流和多路复用

多路复用是HTTP/2中的最核心的部分,利用二进制帧的传输流来实现。

这里的流是一个虚拟概念:流是二进制帧的双向传输序列。要理解流,关键是理解帧中的流ID。

在HTTP/2连接上,虽然帧是乱序收发的,但只要它们拥有相同的流ID,就都属于一个流,而且这个流里面的帧是有严格的先后顺序的。

流是可以并发的,因为二进制帧可以乱序收发,所以可以同时发出多个流传输数据,即实现多路复用。