HTTP1.0

HTTP/1.0是无状态、无连接的应用层协议

每一次请求都需要建立一个TCP链接,服务器处理完之后立即断开连接

image-20240319140802233

通过cookie/session等进行身份认证

HTTP1.0 存在问题

无法复用

每次发送请求,都需要进行一次tcp连接,tcp的连接释放过程比较费时,使得网络利用率较低

HTTP1.1

继承自1.0 比较简单 克服了1.0部分问题

长连接

新增Connection字段, 通过设置为keep-alive保持tcp通道的不中断

管道传输

只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

HTTP1.1缺陷

  • 请求/响应头部未经压缩发送,头部信息越多延迟越大,只能压缩body部分
  • 冗长的头部,每次发送相同的头部会造成较多浪费
  • 队头阻塞: 服务器按照请求顺序进行响应,如果服务器响应慢,会导致客户端一直无法请求到数据
  • 没有请求优先级控制
  • 请求只能从客户端到服务端,服务端只能被动接受
  • 带宽利用率不高
    1. tcp慢启动,tcp通道建立后会先慢慢传输数据,之后逐步加快传输·
    2. 多条tcp通道会竞争带宽 造成不必要的损失

HTTP2.0

头部压缩

同时发送多个请求,如果头部一样,协议会帮忙消除重复部分

HPACK算法: 客户端和服务端共同维护一张头信息表,

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分

这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

二进制传输

HTTP2不再像HTTP1的纯文本形式的报文,而是以二进制格式传输 统称为帧 头信息帧 数据帧 ,对机器友好,加快传输效率 无需再将明文的报文转成二进制,而是直接解析二进制报文

多路复用

所有请求用的同一个tcp通道

服务器端推送

性能优化 将可用资源优先推送出去

HTTP2.0 缺陷

队头阻塞

http2.0通过多路复用 steam 的方式修复了对http1.1中队头阻塞的问题,但还是存在tcp的队头阻塞

HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。

HTTP 1.1管道解决了请求的队头阻塞,没有解决响应的队头阻塞,服务端需要按顺序响应接受到的请求

HTTP2 解决了http层的队头阻塞,但没有解决tcp层的队头阻塞 一旦丢包,会触发tcp的重传机制, 阻塞所有的http请求

image-20240319181244134

  • HTTP/1.1 中的管道( pipeline)虽然解决了请求的队头阻塞,但是没有解决响应的队头阻塞,因为服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等响应完这个请求后, 才能处理下一个请求,这属于 HTTP 层队头阻塞。
  • HTTP/2 虽然通过多个请求复用一个 TCP 连接解决了 HTTP 的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的 HTTP 请求,这属于 TCP 层队头阻塞。

HTTP3 采用了udp 搭配QUIC协议

QUIC 有以下 3 个特点。

  • 无队头阻塞

​ 底层协议用的udp quic协议会控制只有对应的那一个请求收到影响

  • 更快的连接建立
    • TLS层包含在quic协议内 tls请求
  • 连接迁移

​ 1.移动端 2.vpn切换 HTTP2 中 连接根据四元组确定一条tcp连接 【源ip,源端接,目标ip,目标端口】

​ http3 连接id