Skip to content

http

揭秘http2:https://mp.weixin.qq.com/s/tG6HPSuGEOxpS9lq-Q_uLg

http1.0
http1.1

在http1.1中,请求和响应采用串行处理,一个请求完成才能进入下一个请求,如果出现等待,则后续也要等待;

队头阻塞:一个请求或者响应阻塞,则后续请求或者响应也要阻塞;

通常会为浏览器开多个并行的tcp连接,带来额外的开销。

http2

http2牛逼在哪? https://xiaolincoding.com/network/2_http/http2.html

基于https 完全基于tcp构建,

  • 头部压缩
    • 采用hpack算法压缩头部,减少头部大小;(客户端和服务端同时维护一张表,后续只发送索引号)
  • 二进制分帧
    • 头信息和数据体是分开传输的,通过帧的标志位来区分,并采用二进制格式编码
  • 多路复用
    • 在同一个tcp连接中,引入了steam的概念,可以同时发送多个请求和响应,解决了http1.1的队头阻塞问题;
  • 服务器推送(sse)

二进制分帧

多路复用
  • Steam:一个连接中可以有多个stream,一个stream中可以有多个帧;
    • 帧:帧是http2中传输的最小单位,一个帧中包含帧头和帧体;
    • 帧头:帧头中包含帧的标志位、流标识符、长度等信息;
    • 帧体:帧体中包含请求或响应的数据;

并且,同一个stream中的帧可以乱序发送,每个都有一个唯一的steamId,接收方再自行组装。

依然有队头阻塞的问题

http2通过多路复用的方式,解决了应用层的队头阻塞,但是在传输层,tcp协议本身存在队头阻塞的问题:

所有http2流会被合并成单一字节流。 少量丢包,就会导致所有请求延迟(所有的包都必须等待这个包传回来)。

text
TCP流: [A1][B1][C1][A2][B2][C2][A3][B3][C3]

              如果这个包丢失

所有后续包被阻塞: [A3][B3][C3] 必须等待 [B2] 重传
http3
本站访客数 人次 本站总访问量