谈谈网页的压缩算法

gzip、brotli 和 zstd 压缩

当我们浏览网页的时候,现代浏览器向 Web 服务器发送 HTTP 请求时,它会添加以下请求头:

Accept-Encoding: gzip, deflate, br, zstd

这告诉服务器,可以使用以下压缩算法之一来压缩响应:gzipdeflatebrotlizstandard

gzip

  • 基于 DEFLATE 算法(结合了哈夫曼编码和 LZ77 滑动窗口压缩)。
  • 特点:广泛支持,成熟稳定,适用于大多数网页内容(如 HTML、CSS、JavaScript、JSON 等)。
  • 压缩速度: 中等,压缩和解压速度平衡。
  • 压缩率: 中等,通常比原始数据小 60%-80%(视内容而定)。
  • 兼容性: 几乎所有浏览器和服务器都支持,是 HTTP 压缩的默认选择。

deflate

  • DEFLATE 是 gzip 和 zlib 的核心算法,仅包含 LZ77 和哈夫曼编码,无额外封装。
  • 特点:比 gzip 少了一些元数据开销(如 gzip 的文件头),但实际压缩效果与 gzip 几乎相同。
  • 压缩速度: 与 gzip 相近。
  • 压缩率: 与 gzip 相当,略低于 Brotli 和 zstd。
  • 兼容性: 广泛支持,但实际应用中通常以 gzip 或 zlib 形式出现。

br (Brotli):

由 Google 开发,结合了 LZ77、哈夫曼编码和上下文建模,专为网页压缩优化。

  • 特点: 提供更高的压缩率,尤其对文本数据(如 HTML、CSS、JavaScript)效果显著。
  • 压缩速度: 压缩速度较慢(尤其是高压缩级别),解压速度较快。
  • 压缩率: 通常比 gzip 高 15%-25%,在相同压缩级别下文件更小。
  • 兼容性: 现代浏览器(Chrome、Firefox、Edge 等)普遍支持,逐渐成为高性能网站的标准。

zstd (Zstandard):

由 Facebook 开发,基于现代压缩技术(如有限状态熵编码和快速字典压缩)。

  • 特点: 在压缩率和速度之间提供极佳平衡,支持实时压缩场景。
  • 压缩速度: 压缩和解压速度非常快,适合高吞吐量场景。
  • 压缩率: 接近或略优于 Brotli,比 gzip 和 deflate 高。
  • 兼容性: 浏览器支持较少(2025 年仍未广泛支持),但在其他领域(如数据库、文件存储)使用较多。
image.png

哪个更好?

  • a. 压缩率
    Brotli 和 zstd 在压缩率上优于 gzip 和 deflate,Brotli 尤其适合文本内容(如网页资源),能显著减少传输数据量,降低带宽成本。
    对于大文件或重复性高的文本数据,Brotli 和 zstd 的优势更明显。

  • b. 压缩/解压速度
    zstd 在压缩和解压速度上表现最佳,适合需要快速响应的场景。
    Brotli 压缩速度较慢(尤其在高压缩级别),可能增加服务器负担,但解压速度快,客户端体验良好。
    gzip 和 deflate 在速度和资源占用上较为平衡,适合资源受限的服务器。

  • c.浏览器兼容性
    gzip 和 deflate 是最兼容的选择,几乎所有客户端都支持,适合需要最大兼容性的场景。
    Brotli 在现代浏览器中支持良好(2025 年覆盖率约 95%),但老旧浏览器可能不支持。
    zstd 目前在浏览器中支持有限,主要用于服务器端或其他非网页场景。

  • d. 服务器资源
    gzip 和 deflate 对服务器资源要求较低,适合低配服务器。
    Brotli 的高压缩率需要更多 CPU 资源,可能增加服务器成本。
    zstd 提供高效率,CPU 占用较低,但浏览器支持是瓶颈。

网页请求数据压缩的推荐

  • 首选 Brotli: 如果目标用户使用现代浏览器(Chrome、Firefox、Edge 等),Brotli 是最佳选择。
    它提供更高的压缩率,减少网络传输时间,改善网页加载速度。
    推荐在服务器(如 Nginx、Apache)启用 Brotli,并配置动态压缩。
  • 备选 gzip: 对于需要最大兼容性的场景(如老旧浏览器或设备),gzip 是安全的选择,性能与兼容性平衡良好。
  • deflate: 实际应用中与 gzip 差异不大,通常不单独使用。
  • zstd: 目前不推荐用于网页请求压缩,因为浏览器支持不足,但在未来可能成为替代方案(尤其在高吞吐量场景)。

Nginx 配置

http {
    brotli on;
    brotli_types text/plain text/css application/json application/javascript;
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容