Skip to content

12.说说 HTTP1.0/1.1/2.0 的区别?

1.HTTP/2

HTTP/2 主要的⽬标就是改进性能,兼容 HTTP/1.1。

image-20231018082434091

  • 问题1: HTTP/1.1 需要开启多个tcp连接,消耗性能。
  • 问题2: HTTP/1.1 采用纯文本格式,在解析过程中会有歧义,性能差。
  • 问题3: HTTP/1.1 不能乱序收发。
  • 问题4: HTTP/1.1 中只能优化 body 并没有对头部进⾏处理

1).多路复⽤

在⼀条TCP链接上可以乱序收发请求和响应,多个请求和响应之间不再有顺序关系。

image-20231018085011821

  • 有序,每一个流都有特定ID。奇数为客户端发送,偶数为服务端发送
  • 双向,同一个流内,可以接受和发送消息。
  • 并行,同一个TCP中,可以发送多个流。
  • 创建、关闭,客户端和服务端都可以主动关闭当前流。

2).帧的组成

image-20231018092557994

  • Length帧的⼤⼩, 2^24 帧最⼤不能超过 16M

  • Type帧的类型:常⽤的就是 HEADERS,DATA

  • Flags标志位:常⽤的是 END_HEADERS , END_STREAM , PRIORITY

  • Stream Identifier 流的标号

/Applications/chrome.app/Contents/MacOS/Google\ Chrome --ssl-key-log-file=/Users/jiangwen/tls/sslkeylog.log

3).头部压缩

使⽤ HPACK 算法压缩HTTP头

  • 废除起始⾏,全部移⼊到Header中去,采⽤静态表的⽅式压缩字段

  • 如果是⾃定义Header,在发送的过程中会添加到静态表后,也就是所谓的动态表

  • 对内容进⾏哈夫曼编码来减⼩体积

image-20231018093339735

如何编码:

a->0  b->1 c->10 d->11  错误编码有歧义
a->00 b->01 c->10 d->11 f->110 无歧义
a->0  b->1 c->10 d->11  错误编码有歧义
a->00 b->01 c->10 d->11 f->110 无歧义

哈夫曼编码:

  • 不同符号使用不同长度的编码,出现频率高的符号使用短编码,出现频率低的符号使用长编码。
  • 通过构建哈夫曼树,确保每个符号都有一个唯一的编码,不会出现编码冲突。

image-20231018093827175

  • 统计符号的出现频率
  • 构建哈夫曼树
  • 分配编码,通常采用左子树为0,右子树为1的规则。
  • 将数据中的每个符号替换为其对应的哈夫曼编码,从而实现数据压缩。

4),服务端推送

服务端可以提前将可能会⽤到的资源主动推送到客户端。

2.HTTP/3

TCP为了保证可靠传输,如果在传输的过程中发⽣丢包,可能此时其他包已经接受完毕,但是仍要等待客户端重传丢失的包。这就是TCP协议本身队头阻塞的问题。

image-20231018094852922

  • HTTP/3中关键的改变,那就是把下层的 TCP 换成了 UDP 。 UDP ⽆序从⽽解决了队头阻塞的问题。

  • QUIC 基于 UDP 之前说过 UDP 是⽆连的,接速度⽐ TCP 快。

  • QUIC 基于 UDP 实现了可靠传输、流量控制,引⼊流和多路复⽤。

  • QUIC 全⾯采⽤加密通信, QUIC 使⽤了 TLS 1.3,⾸次连接只需要 1RTT。

  • ⽀持链接迁移,不受 IP 及 port 影响⽽发⽣重连,通过 ConnectionID 进⾏链接。

  • 使⽤ QPACK 进⾏头部压缩,提供更好的压缩比、更快的压缩和解压缩速度以及更大的灵活性。

Released under the MIT License.