HTTP/2 流和静态压缩

Posted

技术标签:

【中文标题】HTTP/2 流和静态压缩【英文标题】:HTTP/2 Streaming and static compression 【发布时间】:2018-06-23 14:11:11 【问题描述】:

我需要在 node 和 C++ 中实现一个 http2 服务器。无论如何,我无法掌握如何使流式处理与静态压缩一起工作:

我想以尽可能高的压缩率压缩我的文件,这是在构建时静态完成的

我想流式传输我的 html,因此浏览器会尽快收到 <head>,并且可以预取资源或从本地缓存中检索它们

但是在收到所有数据之前无法读取压缩文件,是吗?

我应该放弃压缩,还是应该单独压缩 HTML 流块?有没有更好的办法?

【问题讨论】:

【参考方案1】:

但是在接收到所有数据之前无法读取压缩的文件,是吗?

这(通常)是不正确的。用于 HTML 文件的基于 Deflate 的压缩(例如 gzip、brotli)可以在不接收所有数据的情况下解压缩。

这些主要通过反向引用数据来工作。例如上面的句子重复引用了文本“compress”:

基于Deflate的压缩ion(例如gzip、brotli)可以在不接收所有数据的情况下进行压缩

所以第二个实例可以替换为对第一个实例的反向引用:

可以在不接收所有数据的情况下对基于 Deflate 的压缩(例如 gzip、brotli)进行 de(-49,8)。

所以您可以看到,只要您按顺序阅读(HTTP 保证)并且从头开始,那么您不需要任何后续数据来解压您已经收到的内容 - 但您确实需要任何以前的文本。

同样,JPEG 通常在完全接收之前就显示出来,要么逐行加载(非渐进式 JPEG),要么通过加载更多数据而增强的模糊图像(渐进式 JPEG)。

【讨论】:

谢谢,我刚刚对其进行了测试,它可以跨操作系统和浏览器运行。唯一的问题是 brotli 不支持从命令行解压缩截断的文件。 说实话,我认为大多数 gzip 客户端都不会。不是因为我展示的任何技术原因 - 更多是因为可能对它没有太多要求,并且还警告您文件已被切断。

以上是关于HTTP/2 流和静态压缩的主要内容,如果未能解决你的问题,请参考以下文章

GzipStream的简单使用压缩和解压

返回预压缩的静态内容,而不是即时压缩它

前段性能-静态资源,资源压缩

性能优化Brotli使用Brotli压缩算法来压缩静态文件

视频流

Nginx静态代理3-页面压缩