浏览器如何“流”压缩响应?

How do browsers “stream” compressed responses?

我有一个很大的 HTML 文件,我用 gzip 压缩了它。我注意到浏览器在 HTTP 响应完成之前开始显示文件中的内容。您可以在命令行中模仿这个:

curl -v -H 'Accept-Encoding: gzip' --limit-rate 2K 'http://www.theguardian.com/uk' | gzip --decompress

我正在尝试了解浏览器如何执行此操作。我对压缩的理解是整个文件都被压缩了,需要完整的响应才能解压,但这显然是不正确的。

浏览器如何设法解压缩 "chunks" 中的响应?这与压缩技术有关吗?

不,您不需要完整的回复来解压它。 deflate 压缩数据(gzip 流中使用的格式)是一系列编码文字字节和 length/distance 对(与先前未压缩的数据匹配),这些代码在收到后立即开始生成未压缩的数据。

dynamic deflate 块有大约 60 到 80 个字节 header 描述代码,因此您只需等待 gzip header(10 个字节)和第一个动态 header 以便能够开始生成未压缩的数据。 Fixed-code deflate 块使用 pre-defined 组代码,因此您开始从前两个字节中的代码获取数据。