http2.0和http1.1的区别

640?wx_fmt=png&wxfrom=5&wx_lazy=1

多路复用


多路复用允许单一的http2连接同时发起多重的请求-响应信息


http性能优化的关键并不在于高带宽,而是低延迟,TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐则称之为TCP慢启动,由于这种原因,让原本就具有突发性和短时性的http连接变得十分低效


http2通过让所有数据流共用同一个连接,可以更有效的使用TCP连接,让高带宽也能真正服务于http的性能提升


小总结:多路复用技术,单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大,由于减少TCP慢启动时间,提高传输的速度


因为所有的http2的请求都在一个TCP连接上,所以在http1中的自动化合并文件和Sprite合图等资源合并减少请求的优化手段对于http2来说是没有效果的

640?wx_fmt=png&wxfrom=5&wx_lazy=1

二进制分帧


http2在应用层和传输层之间增加一个二进制分帧层,http2会将所有传输的信息分割成更小的消息和帧,并对他们采用二进制格式的编码,其中http1的首部信息会被封装成Headers帧,而我们的request body则封装到Data帧里面


640?wx_fmt=png&wxfrom=5&wx_lazy=1

首部压缩


http请求和响应都是由状态行,请求/响应头部,消息主题三部分组成,一般而言,消息主题都会经过gzip压缩,或者本身传输的就是压缩后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输,浪费流量资源


原理:头部压缩需要在支持http2的浏览器和服务端之间,维护一份相同的静态字典,包含常见的头部名称与值的组合,维护一份相同的动态字典,可以动态的添加内容,支持基于静态哈夫曼码表的哈夫曼编码


http2支持服务器推送

640?wx_fmt=png


服务端推送是一种在客户端请求之前发送数据的机制,当代网页使用了许多资源:html,样式表,脚本等,在http1.x中这些资源每一个都必须明确的请求,这可能是一个很慢的过程,因为服务器必须等待浏览器做的每一个请求,网络经常是空闲和未充分使用的


为了改善延迟,http2引入了server push,它允许服务端推送资源给浏览器,在浏览器明确请求之前,一个服务器经常知道一个页面需要更多的附加资源,在他响应浏览器第一个请求时,可以开始推送这些资源,这允许服务端去完全充分利用一个可能空闲的网络,改善页面加载的时间


有了http2的服务端推送,http1时代的内嵌资源的优化手段也变得没有意义了,使用服务端推送更高效,因为客户端可以缓存起来,甚至可以不同页面之间共享


并行双向字节流的请求和响应

640?wx_fmt=png


在http2上,客户端和服务端可以把http消息分解成回不依赖的帧,然后乱序发送,最后再在另一端把她们重新组合起来,同一链接上可以有多个不同方向上的数据在传输,客户端可以一边乱序发送stream,也可以一边接收着服务端的响应,在服务端同理


把http消息分解为独立的帧,交错发送,然后在另一端重新组装是http2最重要的一项增强,这个机制会在整个web技术栈中引发一系列的连锁反应,从而带来巨大的性能提升,因为可以并行交错的发送请求,请求之间互不影响可以并行交错的发送响应,响应之间互不干扰只使用同一个连接即可并行的发送多个请求和响应消除不必要的延迟,从而减少页面加载的时间也就是说‘域名分区’的优化手段对于http2来说是无用的,因为资源都是并行交错发送,且没有限制,不需要额外的多域名并行下载

http2的请求优先级

640?wx_fmt=png


每个http2流里面有个优先值,这个优先值确定着客户端和服务端处理不同的流采取不同的优先级策略,高优先级的流应该优先发送,但又不是绝对的准守,可能又会引入首队阻塞的问题,高优先级的请求慢导致阻塞其他文件的交付,分配处理资源和客户端与服务器间的带宽,不同优先级的混合是必须的


0


作者:xiaobo1484812507000链接:https://juejin.im/post/5abb44c06fb9a028df22ab37