HTTP 2.0最大的特色: 不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之因此叫2.0,是在于新增的二进制分帧层。
html
既然又要保证HTTP的各类动词,方法,首部都不受影响,那就须要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增长一个二进制分帧层。缓存
在二进制分帧层上,HTTP 2.0 会将全部传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而咱们的request body则封装到Data帧里面。服务器
而后,HTTP 2.0 通讯都在一个链接上完成,这个链接能够承载任意数量的双向数据流。相应地,每一个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧能够乱序发送,而后再根据每一个帧首部的流标识符从新组装。网络
HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储以前发送的键-值对,对于相同的数据,再也不经过每次请求和响应发送;通讯期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只 需发送一次。事实上,若是请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时全部首部都自动使用以前请求发送的首部。性能
若是首部发生变化了,那么只须要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP 2.0 的链接存续期内始终存在,由客户端和服务器共同渐进地更新 。优化
HTTP2.0全部通讯都是在一个TCP链接上完成。HTTP 2.0 把 HTTP 协议通讯的基本单位缩小为一个一个的帧,这些帧对应 着逻辑流中的消息。并行地在同一个 TCP 链接上双向交换消息。就比如,我请求一个页面http://www.qq.com。页面上全部的资源请求都是客户端与服务器上的一条TCP上请求和响应的!编码
有关注TCP性能的同窗就会知道,HTTP性能的关键在于低延迟而不是高带宽!大多数HTTP 链接的时间都很短,并且是突发性的,但TCP 只在长时间链接传输大块数据时效率才最高。HTTP 2.0 经过让全部数据流共用同一个链接,能够更有效地使用TCP 链接,让高带宽也能真正的服务于HTTP的性能提高。代理
同时,单连接多资源的方式,使到至上而下的层面都获得了好处:htm
1.能够减小服务连接压力,内存占用少了,链接吞吐量大了内存
2.因为 TCP 链接减小而使网络拥塞情况得以改观;
3.慢启动时间减小,拥塞和丢包恢复速度更快。
也就是说,“资源合并减小请求”的优化手段对于HTTP2.0来讲是没有效果的,只会增大无用的工做量而已。
在HTTP2.0上,客户端和服务器能够把HTTP 消息分解为互不依赖的帧,而后乱序发送,最后再在另外一端把它们从新组合起来。注意,同一连接上有多个不一样方向的数据流在传输。客户端能够一边乱序发送stream,也能够一边接收者服务器的响应,而服务器那端同理。
把 HTTP 消息分解为独立的帧,交错发送,而后在另外一端从新组装是 HTTP 2.0 最 重要的一项加强。事实上,这个机制会在整个 Web 技术栈中引起一系列连锁反应, 从而带来巨大的性能提高,由于:
能够并行交错地发送请求,请求之间互不影响;
能够并行交错地发送响应,响应之间互不干扰;
只使用一个链接便可并行发送多个请求和响应;
消除没必要要的延迟,从而减小页面加载的时间;
那么也就是说“域名分区”这种优化手段对于HTTP2.0是无用的,由于资源都是并行交错发送,且没有限制,不须要额外的多域名并行下载。
每一个HTTP2.0流里面有个优先值,这个优先值肯定着客户端和服务器处理不一样的流采起不一样的优先级策略,高优先级的流都应该优先发送,但又不会绝对的。绝对地准守,可能又会引入首队阻塞的问题:高优先级的请求慢致使阻塞其余资源交付。分配处理资源和客户端与服务器间的带宽,不一样优先级的混合也是必须的。
HTTP 2.0 新增的一个强大的新功能,就是服务器能够对一个客户端请求发送多个响应。换句话说,除了对最初请求的响应外,服务器还能够额外向客户端推送资源,而无需客户端明确地请求。
有了HTTP2.0的服务器推送,HTTP1.x时代的内嵌资源的优化手段也变得没有意义了。并且使用服务器推送的资源的方式更加高效,由于客户端还能够缓存起来,甚至能够由不一样的页面共享(依旧遵循同源策略)。