HTTP的版本发展变化| 青训营笔记

111 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第四篇笔记

HTTP/1.0:

特点:

  • 浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完成以后立即断开TCP连接(无连接),服务器不跟踪也每个客户单,也不记录过去的请求(无状态)。

存在的问题:

  • 无连接的特性,不能复用 TCP 连接,很消耗资源。
  • 队头阻塞,由于HTTP1.0规定下一个请求必须在前一个请求响应到达之前才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。
  • 不支持断点续传,也就是说,每次都会传送全部的页面和数据。

HTTP/1.1

HTTP1.1克服了HTTP1.0性能的问题。

特点:

  • 默认长连接:当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭;
  • 可以使用管道传输,多个请求可以同时发送,但服务器仍是按顺序回应,有可能产生队头阻塞;
  • 支持断点续传,可以用请求头中的range实现。

值得一提的是,HTTP/1.0提供了长连接选项,即在请求头中加入Connection: Keep-alive。同样的,在HTTP/1.1中,如果不希望使用长连接选项,也可以在请求头中加入Connection: close

HTTP/2.0

特点:

  • 二进制分帧: 在应用层和传输层之间加入二进制分层帧。这解决了HTTP/1.0 流水线头部阻塞的问题,使文本协议变成二进制协议,在传输的过程中传输的是二进制的帧,根据二进制帧的格式,可以对乱序的请求结果进行拼接,解决了头部阻塞的问题。
  • 多路复用: 所有HTTP2.0通信都在一个TCP链接上完成,这个链接可以承载任意流量的双向数据流。
    每个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的流标识符(Stream_id)重新封装。

HTTP/2.0 + PUSH

特点: 优化了 HTTP/2.0 的响应速度,服务器根据浏览器的请求,直接把浏览器所需要的资源一次性全部 PUSH 过去。

HTTP/3.0

特点:

  • 放弃了TCP,转而使用基于 UDP 的 QUIC 协议。
  • 减少了tcp三次握手时间,以及tls握手时间;
  • 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题;
  • 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗;