http/2 中的分块下载是如何工作的(或者更好的是什么是等效的?)

How does chunked downloading work in http/2 (or better what is the equivalent?)

在分块下载中,每个块都有扩展,可以在浏览器中使用。最后一个块还可以包含可选的 headers 定义内容,例如 content-length 如果我们流式传输一个大文件,我们可以在最后以 http header 的形式提供该信息。

这在 http/2 中如何运作?最后一篇中是否有扩展名或 headers。我看到有数据有效负载,但没有扩展名,也没有可选的 headers AFAICT。我只看到填充。

也许更好的问题是浏览器甚至

  1. 利用最后一个块中的可选 headers?
  2. 在每个块中利用扩展?

也许程序可能会关心,但如果它是一个程序,我相信 http/2,服务器可能只是更好地定义 api 并在响应+数据发送后使用推送机制?

如何在这个新的 http/2 世界中发送可选的 header,如果我是一个为客户端定义 api 的服务器?

我试图使用 wireshark 来捕获下载跟踪,但 chrome 似乎使用 QUICK 并且当我使用 firefox 和 drive.google.com 下载一个文件(它在同一个跟踪中保持加密状态,我实际上在 TLS 中看到一些 http2 流量用于一些其他服务工作得很好)。使用“(Pre)-Master-Secret 日志文件名”似乎只有一半时间有效,我不太清楚为什么。我最终不得不重新启动所有内容和 re-run 我的案件。

此外,在服务器问候中,选择了 h2 协议,但是当我过滤到 ip.addr=(server hello google ip) 和 tcp.port= 时,没有出现 http2 数据包443

谢谢, 院长

In chunked downloading, there are extensions on each chunk that can be leveraged when coming to a browser. the last chunk can also contain optional headers defining stuff like content-length if we streamed a big file through, we can provide that information at the very end in the form of a http header.

理论上(即标准)你有扩展和在末尾添加 non-essential(!) headers 的可能性。在实践中,这些功能没有被使用。我不知道有任何定义的块扩展,这意味着浏览器会简单地忽略它们。定义 content-length 的示例预告片没有任何意义,因为对于分块编码,任何 content-length header 都应该被忽略。可能有一些第三方库使用预告片。但由于对预告片的支持需要由客户端声明 up-front(使用 TE:trailers header),浏览器不使用它。

如果我理解 HTTP/2 正确的话,块扩展已经消失了(没有丢失,它们从未被使用过)。预告片仍然是可能的,即您可以在所有数据发送后添加 headers,请参阅 RFC7540: 8.1 HTTP Request/Response Exchange