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

Posted

技术标签:

【中文标题】http/2 中的分块下载是如何工作的(或者更好的是啥是等效的?)【英文标题】:How does chunked downloading work in http/2 (or better what is the equivalent?)http/2 中的分块下载是如何工作的(或者更好的是什么是等效的?) 【发布时间】:2016-09-18 23:45:30 【问题描述】:

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

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

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

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

也许程序可能会关心,但如果它是一个程序,我相信 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 数据包

谢谢, 院长

【问题讨论】:

注:Chunked transfer encoding is not supported in HTTP/2, which provides its own mechanisms for data streaming.[2] 来源:*** 不阅读问题的方式@JanacMeena 第一个发布的答案是正确的。 IE。我问的是分块扩展而不是分块传输编码。 【参考方案1】:

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

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

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

【讨论】:

我们去...这很奇怪。

以上是关于http/2 中的分块下载是如何工作的(或者更好的是啥是等效的?)的主要内容,如果未能解决你的问题,请参考以下文章

JS实现文件上传下载功能实例解析

JS实现文件上传下载功能实例解析

JAVA WEB项目大文件上传下载组件

如何使用 Qt 分块下载?

如何使用 Python urllib2 下载分块数据

(Webpack) 如何分块动态模块依赖