HTTP2.0和HTTP1.x的区别

二进制分帧(Binary Framing)

HTTP2.0和HTTP1.X都是基于TCP/IP进行通信的。但是HTTP2.0通过在传输层(TCP)之上增加了二进制分帧层,简单来说就是把之前HTTP1.X的Header和body分成一个或者多个二进制帧进行传输,这样做有什么好处呢?首先HTTP1.X要识别首行、头部和body这3部分就要做协议解析,解析是基于文本,而文本的形式有多样性,解析考的场景多,而采用二进制只有0和1的组合,解析方便。而且多帧传输配合可以并发的多路复用提高性能。

多路复用(MultiPlexing)

几个前提概念

  • 流(stream):已建立连接上的双向字节流。
  • 消息:与逻辑消息对应的完整的一系列数据帧。
  • 帧(frame):HTTP2.0通信的最小单位,每个帧包含帧头部,至少也会标识出当前帧所属的流(stream id)。

多路复用也叫连接共享。多路复用实际上就是多个HTTP请求复用一个TCP链接通道,在这个通道里面传输以帧为单位的流数据,这些流数据是可以并发的而且数量不限。实际上就是一个TCP通道里面实现多个HTTP并发请求。

多路复用也有可能会导致关键请求阻塞。通过通过设置HTTP数据流的优先级,提高关键请求的优先级,优先级高会被服务器优先处理和给客户端发送响应。

这种单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大;而且由于 TCP 连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快。

问题:HTTP2.0的多路复用和HTTP1.1的长链接有什么不同?
HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,因为传输格式是文本的,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞
HTTP/2 多个请求可同时在一个连接上并行执行(由于支持二进制的格式,可以无序)某个请求任务耗时严重,不会影响到其它连接的正常执行

Header压缩

HTTP2.0采用Hpack算法对请求的Header进行压缩,服务器和客户端双方各自维护一份Header表,这个表有静态表和动态表组成.静态表由一个预定义的头部字段静态列表组成。 动态表格由按先入先出顺序维护的头部字段列表组成。 动态表中的第一个和最新条目处于最低索引处,并且动态表的最旧条目处于最高索引处。

服务端推送

同SPDY一样,HTTP2.0也具有server push功能。服务器推送是在客户端之前发送数据的机制。在HTTP/2中,服务端可以对客户端的一个请求发送多个响应。

Server Push的功能前面已经提到过,http2.0能通过push的方式将客户端需要的内容预先推送过去,所以也叫“cache push”。另外有一点值得注意的是,客户端如果退出某个业务场景,出于流量或者其它因素需要取消server push,也可以通过发送RST_STREAM类型的frame来做到。

更安全的SSL

HTTP2.0使用了tls的拓展ALPN来做协议升级,除此之外加密这块还有一个改动,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法,一些加密算法可能还在被继续使用。如果在ssl协商过程当中,客户端和server的cipher suite没有交集,直接就会导致协商失败,从而请求失败。在server端部署http2.0的时候要特别注意这一点。

重置连接表现更好

很多app客户端都有取消图片下载的功能场景,对于http1.x来说,是通过设置tcp segment里的reset flag来通知对端关闭连接的。这种方式会直接断开连接,下次再发请求就必须重新建立连接。http2.0引入RST_STREAM类型的frame,可以在不断开连接的前提下取消某个request的stream,表现更好。

推荐阅读更多精彩内容