HTTP版本
HTTP 1.0
无法复用连接
由于每个请求都是独立的连接,因此会带来以下问题
- 连接的建立和销毁都会占用服务器和客户端的资源,造成内存资源的浪费
- 连接的建立和销毁都会消耗时间,造成响应时间的浪费
- 无法充分利用带宽,造成带宽资源的浪费
队头阻塞
要求连接是依次进行的,上一个连接完成,下一个连接才开始进行
HTTP 1.1
长连接
为了解决连接复用的问题,http1.1默认开启长连接,让同一个tcp连接服务与多个请求-响应,在这种情况下,多次请求响应可以共享一个TCP连接,这不仅减少了TCP的握手和挥手时间,同时可以充分利用TCP【慢启动】的特点,有效的利用带宽
管道化和队头阻塞
http1.1允许在响应到达之前发送下一个请求,这样可以大幅缩减带宽限制时间,但这样依然会存在队头阻塞的问题,由于多个请求使用的是同一个TCP连接,服务器必须按照请求到达的顺序进行响应
管道化的弊端:客户端无法确定每个请求和响应的对应关系
优化手段
- 减少文件数量,减少队头阻塞的几率
- 多个域管理资源
浏览器限制:同一域名下TCP连接最多6个
HTTP 2.0
二进制分帧
http2允许以更小的单元传输数据,每个传输单元称之为帧,而每一个请求或响应的完整数据称之为流,每个流有自己的编号,每个帧会记录所属的流,这样就真的解决了共享TCP连接时队头阻塞问题,实现了真正的多路复用
不仅如此,由于传输是以帧为单位,无论是响应还是请求,都可以实现并发处理,由于进行了分帧,还可以设置传输优先级
头部压缩
http2之前,所有的消息头都是以字符的形式完整传输的,大部分头部信息都有很多的重复,http2 采用头部压缩来减少消息头的体积
服务器推
HTTP2 允许在客户端没有请求的情况下,服务器预先把资源推送给客户端,当客户端后续需要请求该资源时,则自动从之前推送的资源中寻找
面试题
1.介绍下 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 允许服务器直接推送消息给客户端,无须客户端明确的请求
补充http 3.0
http3.0 目前还在草案阶段,它完全抛弃了 TCP 协议,转而使用 UDP 协议,是为了进一步提升性能。
虽然 http2.0 进行了大量的优化,但它无法摆脱 TCP 协议本身的问题,比如建立连接时间长、对头阻塞问题等等。
为了保证传输的可靠性,http3.0 使用了 QUIC 协议。
2.为什么 HTTP1.1 不能实现多路复用
HTTP/1.1 的传输单元是整个响应文本,因此接收方必须按序接收完所有的内容后才能接收下一个传输单元,否则就会造成混乱。而HTTP2.0的传输单元更小,是一个二进制帧,而且每个帧有针对所属流的编号,这样即便是不同的流交替传输,也可以很容易区分出每个帧是属于哪个流的。
3.简单讲解一下 http2 的多路复用
在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。 帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。 多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能
4.http1.1 是如何复用 tcp 连接的?
客户端请求服务器时,通过请求行告诉服务器使用的协议是 http1.1,同时在请求头中附带connection:keep-alive(为保持兼容),告诉服务器这是一个长连接,后续请求可以重复使用这一次的 TCP 连接。
这样做的好处是减少了三次握手和四次挥手的次数,一定程度上提升了网络利用率。但由于 http1.1 不支持多路复用,响应顺序必须按照请求顺序抵达客户端,不能真正实现并行传输,因此在 http2.0 出现之前,实际项目中往往把静态资源,比如图片,分发到不同域名下的资源服务器,以便实现真正的并行传输。
tips:以上信息来自渡一相关学习资料,供自己学习和面试使用。