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

5

我有一个很大的HTML文件,使用gzip压缩后进行传输。我注意到浏览器在HTTP响应还未完全接收时就开始显示内容。你可以在命令行上模拟这种情况:

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

我试图理解浏览器如何实现这一点。我对压缩的理解是整个文件被压缩,您需要完整的响应才能解压缩它,但这显然是不正确的。

浏览器如何成功地以“块”的方式解压响应?这与压缩技术有关吗?

1个回答

8
不需要完整响应来解压缩。deflate压缩数据(gzip流中使用的格式)是一系列编码的文字字节和长度/距离对(匹配先前未压缩的数据),这些代码在接收到后立即开始产生未压缩的数据。
动态deflate块具有大约60到80字节的头,用于描述代码,因此您只需等待gzip头(10个字节)和第一个动态头即可开始生成未压缩数据。定长码deflate块使用预定义的一组代码,因此您可以从前两个字节开始获取数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接