http /1.0/1.1/2.0/3.0 的特性以及他们之间的对比是面试的重要考点之一,今天找资料做个总结,加强记忆。
HTTP/1.0版本
最早的http只是使用在一些较为简单的网页上和网络请求上,所以比较简单,每次请求都打开一个新的TCP链接,收到响应之后立即断开连接。
HTTP1.1版本
-
默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求 -
请求管线化以支持并行请求处理,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
HTTP/2.0新特性
-
多路复用:HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵塞"的问题。 -
新的二进制格式: HTTP/1.x的解析是基于文本的。基于文本协议的解析存在天然缺陷,文本的表现形式有多样性,要做到全面性考虑的场景必然很多。二进制则不同,只识别0和1的组合。基于这种考虑HTTP/2.0的协议解析采用二进制格式,方便且强大。 -
头部压缩:HTTP/2 实现了头信息压缩,由于 HTTP 1.1 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。 HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。 -
服务器推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送,提前给客户端推送必要的资源,这样就可以相对减少一些延迟时间。(推送的是静态资源,如把客户端所需要的css/js/img资源伴随着index.html一起发送到客户端) -
2.0的缺陷: 因为 HTTP/2 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。由于多个数据流使用同一个 TCP 连接,遵守同一个流量状态控制和拥塞控制。只要一个数据流遭遇到拥塞,剩下的数据流就没法发出去,这样就导致了后面的所有数据都会被阻塞。HTTP/2 出现的这个问题是由于其使用 TCP 协议的问题 ,与它本身的实现其实并没有多大关系。
HTTP/3.0新特性
由于 TCP 本身存在的一些限制,Google 就开发了一个基于 UDP 协议的 QUIC 协议 ,并且使用在了 HTTP/3 上。 QUIC 协议在 UDP 协议上实现了多路复用、有序交付、重传等等功能。
一般来说同一域名下只需要使用一个 TCP 连接。但当这个连接中出现了丢包的情况,那就会导致 HTTP/2 的表现情况反倒不如 HTTP/1 了。
因为在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了。但是对于 HTTP/1.1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。
QUIC的优势是:
避免包阻塞 : 多个流的数据包在TCP连接上传输时,若一个流中的数据包传输出现问题,TCP需要等待该包重传后,才能继续传输其它流的数据包。但在基于UDP的QUIC协议中,不同的流之间的数据传输真正实现了相互独立互不干扰,某个流的数据包在出问题需要重传时,并不会对其他流的数据包传输产生影响。
快速重启会话 : 普通基于tcp的连接,是基于两端的ip和端口和协议来建立的。在网络切换场景,例如手机端切换了无线网,使用4G网络,会改变本身的ip,这就导致tcp连接必须重新创建。而QUIC协议使用特有的UUID来标记每一次连接,在网络环境发生变化的时候,只要UUID不变,就能不需要握手,继续传输数据。
什么是 HTTP 队头阻塞?
HTTP/1.1 默认使用了持久连接,多个请求可以复用同一个 TCP 连接,但是在同一个 TCP 连接里面,数据请求的通信次序是固定的。服务器只有处理完一个请求的响应后,才会进行下一个请求的处理,如果前面请求的响应特别慢的话,就会造成许多请求排队等待的情况,这种情况被称为“队头堵塞”。队头阻塞会导致持久连接在达到最大数量时,剩余的资源需要等待其他资源请求完成后才能发起请求。
为了避免这个问题,一个是减少请求数,一个是同时打开多个持久连接。这就是我们对网站优化时,使用雪碧图、合并脚本的原因。
http1.0和http1.1的区别
http1.0发完一个请求后立马结束tcp链接,接着在发起第二个,属于一种串行短连接的方式 http1.1可以只用一个tcp长链接发起请求,这样可以较少tcp链接的开销,同时也可以开启管道机制,并行的发送多个请求,但必须要按顺序返回。
http1.1和http2.0的区别
http2.0传输效率上大大提升,主要得益于采用二进制分帧的方式,可以真正做到多路复用,并且可以对首部进行压缩和使用字典较少传输的字符数。
http2.0和http3.0的区别
http2.0效率已经很高了,但还是存在三个问题,其一是tcp和ssl链接太费时间,其二是tcp有队头阻塞的问题,其三是网路切换问题。http3.0就是为了解决上面这些问题而产生的。
- 采用udp协议,提高握手效率
- 0或1RTT建立链接,QUIC协议包含了TLS1.3不再分层,可以进一步优化握手过程,首次链接只需要1RTT,而非首次链接更能做到0RTT建立链接,主要是把应用数据和秘钥协商的过程进行了统一
- 可以无缝迁移网路,使用链接ID来标识,与ip无关。
|