什么是http2?http2比http1好在哪里?
- HTTP/1.0,每次TCP连接只能发送⼀个请求,当服务器响应后就会关闭这次连接,下⼀个请求需要再次建⽴TCP连接.
- HTTP/1.1,默认采⽤持续连接(TCP连接默认不关闭,可以被多个请求复⽤,不⽤声明Connection: keep-alive). 增加了管道机制,在同⼀个TCP连接⾥,允许多个请求同时发送,增加了并发性,进⼀步改善了HTTP协议的效率, 但是同⼀个TCP连接⾥,所有的数据通信是按次序进⾏的。回应慢,会有许多请求排队,造成”队头堵塞”。
- HTTP/2.0,加了双⼯模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题。 使⽤了多路复⽤的技术,做到同⼀个连接并发处理多个请求,⽽且并发请求的数量⽐HTTP1.1多了好⼏个数量级。 HTTP2虽然只有一条TCP连接,但是在逻辑上分成了很多stream。HTTP2把要传输的信息分割成一个个二进制帧,不同的请求或者响应帧可以互相穿插。
- 二进制分帧,HTTP/2采用二进制格式传输数据,而非HTTP1.X的文本格式,二进制协议解析起来更高效。
- 头部压缩,一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。 HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
- 服务器推送,服务器端可以在发送页面HTML时主动推送其他资源,而不用等到浏览器解析到相应位置,发起请求在响应。 例如服务端可以主动把js和css文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。
HTTP/1.1⻓连接和HTTP/2.0多路复⽤的区别?
- HTTP/1.1:同⼀时间⼀个TCP连接只能处理⼀个请求, 采⽤⼀问⼀答的形式, 上⼀个请求响应后才能处理下⼀个请求. 由于浏览器最⼤TCP连接数的限制, 所以有了最⼤并发请求数的限制。
- HTTP/2.0:同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接⽽带来的延时和内存消耗。 单个连接上可以并⾏交错的请求和响应,之间互不⼲扰。
但现实很残酷,为什么很多业务用了 HTTP/2,反倒不如 HTTP1.1 呢?
第一:HTTP/2 解决了 HTTP 协议层面的队头阻塞,但是 TCP 的队头阻塞仍然没有解决,所有的流都在一条 TCP 连接上, 如果万一序号小的某个包丢了,那么 TCP 为了保证到达的有序性,必须等这个包到达后才能滑动窗口, 即使后面的序号大的包已经到达了也不能被应用程序读取。这就导致了在多条流并发的时候,某条流的某个包丢了, 序号在该包后面的其他流的数据都不能被应用程序读取。这种情况下如果换做 HTTP1.1,由于 HTTP1.1 是多条连接, 某个连接上的请求丢包了,并不影响其他连接。所以在丢包比较严重的情况下,HTTP/2 整体效果大概率不如 HTTP1.1
第二:多流并发带来了请求优先级的问题,因为有的请求客户端(比如浏览器)希望它能尽快返回,有的请求可以晚点返回; 又或者有的请求需要依赖别的请求的资源来展示。流的优先级表示了这个请求被处理的优先级, 比如客户端请求的关键的 CSS 和 JS 资源是必须高优先级返回的,图片视频等资源可以晚一点响应。 流的优先级的设置是一个难以平衡或者难以做到公平合理的事情,如果设置稍微不恰当,就会导致有些请求很慢, 这在用户看来,就是用了 HTTP/2 之后,怎么有的请求变慢了。