N 001 了解HTTP2

Posted CS阿吉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N 001 了解HTTP2相关的知识,希望对你有一定的参考价值。

本文目录如下:



引子:HTTP/2 是什么?如何使用 HTTP2?HTTP/2 出现的原因是什么?或者说,解决了 HTTP/1 的什么不足?他相对于 HTTP/1 做了哪些改进?HTTP/2有哪些不足?如何去解决?


0. 历史

Google 推动 Chrome 浏览器使用自己发明的 SPDY 协议,迫使 IETF 组织以 SPDY 为基础,经过改善,2015 年推出 HTTP/2 标准。

1. 定义

HTTP/2 is a newish protocol for transporting data that will drastically speed up the web and can help your SEO.HTTP/2 offers a dramatic speed boost as the line can be kept open and a lot of stuff can be sent at once.

HTTP / 2 是一种用于传输数据的新颖协议,可以大大加快网络速度并为您的 SEO 提供帮助。HTTP / 2 极大地提高了速度,因为可以保持线路畅通并且可以一次发送很多内容。

HTTP/2 先使用 HTTP/1 请求报文发送一个 24 字节的“连接前言”字符串『PRI』,服务器收到该字符串后,后续传输会使用 HTTP/2 的数据格式。

PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n

h2: 加密的 HTTP2 h2c: 明文的 HTTP2

2. 出现原因

『改进性能』

2-1. 文本解析

HTTP/1 、 HTTP/1.1 解析采用文本格式(可见的 ASCI 码),其缺陷是健壮性不好,容易出现多义性,占用空间大。好处是方便阅读。

HTTP/1.1 采用文本格式传输数据,文本格式转为 ASCII 码,且只能按照语义以行为单位进行切割, 依旧是"Header + Body"形式的报文。

例子:类比 从文件存储角度看,文本存储按照字节 3.1415926 一个字符占用一个字节,共 9 字节。二进制存储按照数据类型,浮点数,占用 4 字节。

2-2. 长连接

HTTP/1 性能不高, 依旧依赖『长连接』,会存在 HTTP 层面和 TCP 层面的队头阻塞(HLO, Head-of-line blocking)。

HTTP 层面的队头阻塞定义:HTTP/1 规定,若干个请求排队串行化单线程处理,后面的请求等待前面请求的响应返回才能执行,一旦有某请求超时等,后续请求只能被阻塞。即有序请求,按序响应。

HTTP 层面的队头阻塞原因:这是因为 HTTP/1.1 采用 "请求-应答"模型,其规定报文必须"一收一发"。即为了知道当前响应属于哪个请求,只能有序请求、按序响应。有点类似于 Promise.all()。其实 HTTP/1.1 也可以考虑给报文标序号和连接号,但标准未采用此方案。

2-3. 冗余 header 字段

在 HTTP/1.1 中,header 字段未被压缩。随着网页内的请求数增长到需要数十到数百个请求的时候,这些请求中的冗余 header 字段不必要地消耗了带宽,从而显着增加了延迟。

2-4. 请求-响应 模式

请求啥响应啥,不灵活。

HTTP/1.1 采用文本格式传输数据,文本格式转为 ASCII 码,且只能按照语义以行为单位进行切割,

A well-designed format is dictated by what makes the information the easiest for the intended audience to understand.

文本格式最常见的是 JSON 和 XML,Content-Type:application/json, application/xml。application/x-www-form-urlencoded 表单默认提交数据格式

N 001 了解HTTP2

“队头阻塞”与短连接和长连接无关,而是由 HTTP 基本的“请求 - 应答”模型所导致的。因为 HTTP 规定报文必须是“一发一收”,这就形成了一个先进先出的“串行”队列。队列里的请求没有轻重缓急的优先级,只有入队的先后顺序,排在最前面的请求被最优先处理。

解决:并发连接,域名分片 “Connection: keep-alive

HTTP/1 里可以用头字段“Content-Encoding”指定 Body 的编码方式,比如用 gzip 压缩来节约带宽

3. 改进点

在 HTTP/2 中,请求和响应标头字段的定义保持不变,仅有一些微小的差异:所有标头字段名称均为小写,请求行现在拆分成各个 :method、:scheme、:authority 和 :path 伪标头字段。

3-1. 二进制格式

HTTP/2 的协议解析采用二进制格式,方便计算机解析、健壮性好。

将 "Header + Body" 拆分为二进制“帧”, 报头只有 9 字节, 用“HEADERS”帧存放头数据、“DATA”帧存放实体数据。

帧大小通常不超过 16K, 最大是 16M。

拆分成『碎片化』的流,可以进行多路复用。

3-2. 多路复用

多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行。

使用二进制帧的双向传输序列 即流,同一个消息往返的帧会分配一个唯一的流 ID。这样子乱序收发的帧, 使得多个请求-响应之间没有了顺序关系,根据流 ID 分配到对应的请求,根据帧序号组装出完整响应。

多路复用改变了 "请求-应答" 的工作模式,服务器可以新建流主动向客户端发送消息。

3-3. 头部压缩:

使用HPACK 算法, 将 header 字段 在客户端和服务端各自维护一个字典, 又称 Header Fields 表 (即 索引-header 字段, ),发送中用索引号表示重复的字符串,避免了 Header 字段反复发送。且釆用哈夫曼编码来压缩整数和字符串。

Header Field:一个名称/值 name-value 对。名称和值都被视为八位字节的不透明序列。

HTTP/2 提倡使用尽可能少的连接数,头部压缩是其中一个重要的原因:在同一个连接上产生的请求和响应越多,动态字典累积的越全,头部压缩的效果就越好。

动态字典上下文有关,需要为每个 HTTP/2 连接维护不同的字典。

HPACK 详解

3-3-1. 设计思想

简单,不灵活

3-3-2. 优点

消除了多余的 header 字段,将漏洞限制到已知的安全攻击,并且在受限的环境中具有有限的内存需求。

3-3-3. 缺点

潜在安全问题:

(1)将压缩用作基于长度的预测,以验证有关被压缩到共享压缩上下文中的加密的猜想。

(2)由于耗尽解码器的处理或存储容量而导致的拒绝服务。

3-3-4. 原理

HPACK 算法会保留 header 列表内 header 字段的顺序, 釆用哈夫曼编码, 生成 索引号-header 字段 的表,其键值均为八位字节的不透明序列。

编码器执行插入操作,解码器执行更新操作。

3-3-5. 表分类

(1)静态表(Static Table)

静态表包含一个预定义且不可更改的 header 字段列表。

将经常出现的 header 字段与索引值静态关联的表。该表是有序的,只读的,始终可访问的,并且可以在所有编码或解码上下文之间共享。

静态表是根据流行网站使用的最频繁的 header 字段创建的,并添加了 HTTP/2 特定的伪 header 字段。对于具有一些频繁值的 header 字段,为每个这些频繁值添加了一个条目。对于其他标题字段,添加了带有空值的条目。

(2)动态表(Dynamic Table)

将存储的 header 字段与索引值相关联的表。

动态表包含以先进先出的顺序维护的 header 字段列表。动态表中的第一个条目和最新条目在最低索引处,而动态表的最旧条目在最高索引处。

3-3-5. 更新表

没有定义扩展机制, 只能通过定义完整的替换来更新。

3-4. 服务器推送:

例:在浏览器请求 html 文件时,服务器把其可能用到的 css、js 发送给客户端,减少等待延迟。

多路复用改变了 "请求-应答" 的工作模式,服务器可以新建流主动向客户端发送消息。

静态资源通过该方式可以提升速度,节省客户端请求开销。

4. 好处

(1). 提高连接的利用率

(2). 增强了安全性,要求至少使用 TLS1.2

(3). 有利于 SEO

网站速度是 SEO 的重要因素

5. 缺点

不能解决传输层的队头阻塞。

6. 解决方案

改变传输层协议,例如 QUIC。


以上是关于N 001 了解HTTP2的主要内容,如果未能解决你的问题,请参考以下文章

征收问题关于 HTTP2,你有什么想了解的吗?

[新增ST-001片段]全程字幕-20套UML+Enterprise Architect建模示范视频

了解 BitTorrent 片段输出

HTTP2和HTTPS来不来了解一下?

了解用于 http/2 请求和升级的标头 HTTP2-Settings 的值

现有连接上的 HTTP2 DNS 查找