HTTP2有哪些升级
● 二进制分帧(多路复用、优先级、流式传输、HTTP队头阻塞)
● 头部压缩
● 服务器推
HTTP1.0
无法复用连接
HTTP1.0为每一个请求单独新开一个TCP连接。
由于每个请求都是独立的连接,因此会带来下面的问题:
- 连接的建立和销毁都会占用服务器和客户端的资源,造成内存资源的浪费;
- 连接的建立和销毁都会消耗时间,造成响应时间的浪费;
- 无法充分利用带宽,造成带宽资源的浪费;
TCP协议的特点是慢启动,即一开始传输的数据量少,一段时间后达到传输的峰值,而上面这种做法,会导致大量的请求在TCP达到传输峰值前就被销毁了。
HTTP1.1
长连接
为解决HTTP1.0的问题,HTTP1.1默认开启长连接,即让同一个TCP连接服务于多个请求响应。
在这种情况下,多次请求响应可以共享同一个TCP连接,这不仅减少了TCP的握手和挥手时间,同时可以充分利用TCP慢启动的特点,有效的利用带宽。
实际上,在HTTP1.0后期,虽然没有官方标准,但开发者慢慢形成了一种共识:
只要请求头中包含 Connection: keep-alive,就表示客户端希望开启长连接,希望服务器响应后不要关闭TCP连接,如果服务器认可这一行为,即可保持TCP连接。
当需要的时候,任何一方都可以关闭TCP连接
扩展知识:
连接关闭的情况主要有三种:
1.客户端在某一次请求中设置了 Connection: close,服务器收到此请求后,响应结束立即关闭TCP。
2.在没有请求时,客户端会不断对服务器进行心跳检测(一般每隔一秒),一旦心跳检测停止,服务器立即关闭TCP。
3.当客户端长时间没有新的请求到达服务器,服务器会主动关闭TCP,运维人员可以设置该时间。
由于一个TCP连接可以承载多次请求响应,并在一段时间内不会断开,因此这种连接称之为长连接。
管道化和队头阻塞
HTTP1.1允许在响应到达之前发送下一个请求,这样可以大幅缩减带宽限制时间
但这样做会存在队头阻塞的问题。
由于多个请求使用的是同一个TCP连接,服务器必须按照请求到达的顺序进行响应。
想一想为什么?
于是,导致了一些后发出的请求,无法在处理完成后响应,产生了等待的时间,而这段时间的带宽可能是空闲的,这就造成了带宽的浪费。
队头阻塞虽然发生在服务器,但这个问题的根源是客户端无法知晓服务器的响应是针对哪个请求的。
正是由于存在队头阻塞,我们常常使用下面的手段进行优化:
● 通过减少文件数量,从而减少队头阻塞的几率
● 通过开辟多个TCP连接,实现真正的、有缺陷的并行传输
浏览器会根据情况,为打开的页面自动开启TCP连接,对于同一个域名的连接最多6个
如果想要突破这个限制,就需要把资源放到不同的域名。(域名拆分、精灵图)
然而,管道化并非一个成功的模型,它带来的队头阻塞造成非常多的问题,所以现代浏览器默认是关闭这种模式的
HTTP2.0
二进制分帧;
每个帧都带了一个头部,记录了流的ID,这样做就可以准确的知道这一帧数据是属于哪个流的。
这样就真正解决了共享TCP连接时的队头阻塞问题,实现了真正的多路复用。
不仅如此,由于传输时是以帧为单元传输的,无论是响应还是请求,都可以实现并发处理,即不同的传输可以交替进行。
由于进行了分帧,还可以设置传输优先级。
头部压缩
HTTP2.0之前,所有的消息头都是以字符的形式完整传输的。
可实际上,大部分头部信息都有很多的重复。
为了解决这一问题,HTTP2.0使用头部压缩来减少消息头的体积;
服务器推
HTTP2.0允许在客户端没有主动请求的情况下,服务器预先把资源推送给客户端;
当客户端后续需要请求该资源时,则自动从之前推送的资源中寻找。
http1.0、http1.1、http2.0协议的区别?
首先说 http1.0
它的特点是每次请求和响应完毕后都会销毁TCP 连接,同时规定前一个响应完成后才能发送下一个请求。这样做有两个问题:
- 无法复用连接
每次请求都要创建新的TCP连接,完成三次握千和四次挥手,网络利用率低 - 队头阻塞
如果前一个请求被某种原因阻塞了,会导致后续请求无法发送。
然后是 http1.1
http1.1 是 http1.0的改进版,它做出了以下改进:
- 长连接
http1.1 允许在请求时增加请求头connection: keep-alive,这样便允许后续的客户端清求在一段时间内复用之前的 TCP 连接 - 管道化
基于长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回。 - 缓存处理
新增响应头 cache-control,用干实现客户端缓存。 - 断点传输
在上传/下载资源时,如果资源过太,将其分割为多个部分,分别上传/下载,如果遇到网络故 障,可以从已经上传/下最好的地方继续请求,不用从头开始,提高效率
最后是 http2.0
http2.0进一步优化了传输效率,它主要有以下改进:
- 二进制分
将传输的消息分为更小的二进制帧,每帧有自己的标识序号,即便被随意打乱也能在另一端正确组装 - 多路复用
基于二进制分帧,在同一城名下所有访同都是从同一个 tcp 连接中走,并且不再有队头阻塞问题,也无須遵守响应顺序 - 头部压缩
http2.0 通试字典的形式,將头部中常见信息替换为更少的字符,极大的减少了头部的数据量,从而实现更小的传输量。 - 服务器推
http2.0 允许服务器直接推送消息给客户端,无需客户端明确的请求。