3

在分块下载中,每个块都有扩展,可以在访问浏览器时加以利用。最后一个块还可以包含定义诸如内容长度之类的可选标头,如果我们通过流式传输一个大文件,我们可以在最后以 http 标头的形式提供该信息。

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

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

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

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

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

我试图使用wireshark来捕获下载跟踪,但chrome似乎使用QUICK,当我使用firefox和drive.google.com下载文件时,我似乎无法用wireshark解密SSL(它仍然存在在同一个跟踪中加密时,我实际上在 TLS 中看到了一些 http2 流量,而其他一些服务工作得很好)。使用“(Pre)-Master-Secret 日志文件名”似乎只工作了一半,我不太清楚为什么。我最终不得不重新启动一切并重新运行我的案例。

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

谢谢,院长

4

1 回答 1

1

在分块下载中,每个块都有扩展,可以在访问浏览器时加以利用。最后一个块还可以包含可选的标头,如果我们通过流传输一个大文件,我们可以在最后以 http 标头的形式提供该信息,例如 content-length。

理论上(即标准)你有扩展和在最后添加非必要(!)标题的可能性。在实践中,这些功能并未被使用。我不知道任何定义的块扩展,这意味着浏览器只是忽略它们。并且定义内容长度的示例预告片没有意义,因为使用分块编码应该忽略任何内容长度标头。可能有一些第三方库使用了预告片。但是由于客户端需要预先声明对预告片的支持(使用TE:trailers标头),因此浏览器不使用它。

如果我正确理解 HTTP/2,块扩展就消失了(没有丢失,它们从未被使用过)。仍然可以使用预告片,即您可以在发送所有数据后添加标头,请参阅RFC7540:8.1 HTTP 请求/响应交换

于 2016-05-23T05:29:24.383 回答