返回

数据压缩技术HTTP/2.0 Header Compression 之旅(上)

IOS

在 HTTP/1.x 的时代,支持 Body 压缩,但 Header 并不支持压缩。现在,一个网页可能会有几十到上百个请求,每个请求的 Header 至少在 600 字节以上。那么这些页面的请求 Header 就消耗了不必要的带宽,并增加了延迟。

在 SPDY 协议中,通过使用 DEFLATE 格式,有效地压缩了 Header。DEFLATE 是一种无损数据压缩算法,用于压缩二进制数据。它由 Phil Katz 开发,并首次用于 PKZIP 压缩软件。DEFLATE 算法的原理是,它首先扫描数据,找出重复的字节序列,然后用一个更短的标记来替换这些重复的字节序列。例如,如果数据中有一个连续的 10 个字节的重复字节序列,那么 DEFLATE 算法就会用一个 2 字节的标记来替换这 10 个字节。这样一来,数据就会被有效地压缩。

HTTP/2.0 继承了 SPDY 协议的 Header Compression 特性。在 HTTP/2.0 中,Header Compression 是强制性的。这意味着所有支持 HTTP/2.0 的服务器和客户端都必须支持 Header Compression。

Header Compression 的好处是显而易见的。它可以减少不必要的带宽消耗,并增强性能。特别是对于那些 Header 比较大的请求,Header Compression 可以带来显著的性能提升。

当然,Header Compression 也存在一些缺点。首先,它会增加服务器和客户端的计算开销。其次,它可能会导致安全性问题。因为在压缩之前,服务器和客户端并不知道 Header 的内容。这可能会被攻击者利用来发动攻击。

总体来说,Header Compression 的好处要大于缺点。它可以显著提升 HTTP/2.0 的性能。因此,强烈建议服务器和客户端都支持 Header Compression。

如何启用 Header Compression

在 Nginx 中启用 Header Compression 非常简单。只需在配置文件中添加以下几行代码即可:

gzip on;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/json;

在 Apache 中启用 Header Compression 也非常简单。只需在配置文件中添加以下几行代码即可:

SetOutputFilter DEFLATE
DeflateFilterNote BF
DeflateFilterMatchType DEFLATE "text/html text/plain text/css application/javascript"

注意事项

在使用 Header Compression 时,需要注意以下几点:

  • Header Compression 可能会导致安全性问题。因此,在使用 Header Compression 时,一定要确保服务器和客户端都支持安全的压缩算法。
  • Header Compression 可能会增加服务器和客户端的计算开销。因此,在使用 Header Compression 时,一定要权衡利弊。
  • Header Compression 可能会导致浏览器兼容性问题。因此,在使用 Header Compression 时,一定要确保浏览器支持 Header Compression。