返回

HTTP2如何巧妙处理Transfer-Encoding: chunked

前端

HTTP2 协议自发布以来,就凭借其强大的性能和诸多特性受到了广泛关注。其中,Transfer-Encoding: chunked 作为一种常见的编码方式,在 HTTP2 中也得到了很好的支持。本文将从 SSR 流式渲染的需求出发,通过一个实验介绍 HTTP2 对 chunked 的处理,并简单分析一下 HTTP2 的帧格式。

SSR 流式渲染的需求

SSR(Server-Side Rendering)流式渲染是一种将服务器端渲染的结果以流的方式发送给客户端的技术。它可以减少页面加载时间,并提高用户体验。

为了实现 SSR 流式渲染,需要在服务器端将 HTML 内容分割成多个块,然后逐块发送给客户端。这可以通过 Transfer-Encoding: chunked 来实现。

Transfer-Encoding: chunked

Transfer-Encoding: chunked 是一种分块传输编码方式。它允许将 HTTP 消息体分割成多个块,并逐块发送。

每个块的格式如下:

块长度(十六进制)
CRLF
块数据
CRLF

例如,下面的请求消息体包含两个块:

5
Hello
3
World
0

HTTP2 对 chunked 的处理

HTTP2 对 chunked 的处理与 HTTP1.1 有所不同。在 HTTP1.1 中,chunked 编码的数据必须放在一个 TCP 包中发送。而在 HTTP2 中,chunked 编码的数据可以放在多个 TCP 包中发送。

这使得 HTTP2 在处理 chunked 编码的数据时更加高效。因为 HTTP2 可以将多个 TCP 包合并成一个帧发送,从而减少了网络开销。

实验

为了验证 HTTP2 对 chunked 的处理,我们做了一个简单的实验。

我们使用 Node.js 搭建了一个简单的 HTTP2 服务器,并在服务器端使用 chunked 编码发送响应消息体。

然后,我们使用 Chrome 浏览器访问该服务器。在 Chrome DevTools 中,我们可以看到响应消息体被分割成了多个块,并逐块发送。

这表明 HTTP2 对 chunked 的处理非常高效。

HTTP2 的帧格式

HTTP2 的帧格式与 HTTP1.1 的帧格式完全不同。HTTP2 的帧格式更加紧凑,并且支持更多的功能。

HTTP2 的帧格式如下:

帧长度(24 位)
帧类型(8 位)
帧标志(8 位)
流标识符(31 位)
帧数据

帧长度指示帧的长度,帧类型指示帧的类型,帧标志指示帧的标志,流标识符指示帧所属的流,帧数据是帧的具体数据。

HTTP2 的帧类型有很多种,常用的帧类型有:

  • DATA 帧:用于传输数据。
  • HEADERS 帧:用于传输头部信息。
  • PRIORITY 帧:用于设置流的优先级。
  • RST_STREAM 帧:用于重置流。
  • SETTINGS 帧:用于协商连接设置。
  • PUSH_PROMISE 帧:用于服务器推送。

结论

HTTP2 对 chunked 的处理非常高效。它可以将 chunked 编码的数据分割成多个块,并逐块发送。这使得 HTTP2 在处理 chunked 编码的数据时更加高效。