¿Por qué usar deflate en lugar de gzip para archivos de texto servidos por Apache?


215

¿Qué ventajas ofrece cualquiera de los métodos para los archivos html, css y javascript que sirve un servidor LAMP? ¿Hay mejores alternativas?

El servidor proporciona información a una aplicación de mapas utilizando Json, por lo que un gran volumen de archivos pequeños.

Consulte también ¿Hay algún impacto en el rendimiento al elegir gzip en lugar de desinflar para la compresión http?


cambió las respuestas aceptadas ... el consenso actual es de dos a uno a favor de gzip
Ken

1
mod_deflate es para Apache 2, mod_gzip es para Apache 1.3.
SPRBRN

Respuestas:


315

¿Por qué usar deflate en lugar de gzip para archivos de texto servidos por Apache?

La respuesta simple es no .


RFC 2616 define desinflar como:

desinflar El formato "zlib" definido en RFC 1950 en combinación con el mecanismo de compresión "desinflar" descrito en RFC 1951

El formato zlib se define en RFC 1950 como:

     0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

Entonces, algunos encabezados y una suma de verificación ADLER32

RFC 2616 define gzip como:

gzip Un formato de codificación producido por el programa de compresión de archivos "gzip" (GNU zip) como se describe en RFC 1952 [25]. Este formato es una codificación Lempel-Ziv (LZ77) con un CRC de 32 bits.

RFC 1952 define los datos comprimidos como:

Actualmente, el formato usa el método de compresión DEFLATE, pero se puede extender fácilmente para usar otros métodos de compresión.

CRC-32 es más lento que ADLER32

En comparación con una verificación de redundancia cíclica de la misma longitud, cambia la fiabilidad por la velocidad (prefiriendo la última).

Entonces ... tenemos 2 mecanismos de compresión que usan el mismo algoritmo para la compresión, pero un algoritmo diferente para los encabezados y la suma de verificación.

Ahora, los paquetes TCP subyacentes ya son bastante confiables , por lo que el problema aquí no es Adler 32 vs CRC-32 que usa GZIP.


Resulta que muchos navegadores a lo largo de los años implementaron un algoritmo de desinflado incorrecto. En lugar de esperar el encabezado zlib en RFC 1950, simplemente esperaban la carga útil comprimida. Del mismo modo, varios servidores web cometieron el mismo error.

Entonces, a lo largo de los años, los navegadores comenzaron a implementar una implementación de desinflado de lógica difusa , intentan el encabezado zlib y la suma de comprobación de Adler, si eso falla, intentan la carga útil.

El resultado de tener una lógica compleja como esa es que a menudo se rompe. Verve Studio tiene una sección de prueba aportada por el usuario que muestra cuán grave es la situación.

Por ejemplo: deflate funciona en Safari 4.0 pero está roto en Safari 5.1, también siempre tiene problemas en IE.


Por lo tanto, lo mejor que puede hacer es evitar el desinflado por completo, el aumento de velocidad menor (debido a Adler 32) no vale el riesgo de cargas útiles rotas.


¿No debería haber un nuevo estándar que combine adler32 con gzip?
Pacerier

1
@ Sam Saffron, ¿significa esto que si el navegador web no está en la imagen, puedo usar desinflar sobre gzip? Por ejemplo, si voy a subir un archivo comprimido a mi servidor FTP.
Xegara

1
Otra diferencia muy pequeña es que el contenedor zlib es de seis bytes frente a 18 bytes para gzip. Entonces, para paquetes muy pequeños, puede ser una ventaja enviar 12 bytes menos. Sin embargo, la conclusión no cambia, ya que debido a que Microsoft lo arruinó para todos al malinterpretar lo que significaba "desinflar" en lo que entregaron en sus servidores IIS, es más fácil usar el formato gzip.
Mark Adler

Pero, ¿cómo podría romperse la carga útil si se transmite mediante TCP? La idea general de TCP es transmitir cargas útiles ininterrumpidas.
user1095108

Esta respuesta data de 2012. Entonces, ¿los navegadores modernos todavía sufren el problema de la implementación incorrecta de los algoritmos de desinflado o es seguro usarlo ahora? ¿Esta parte de la respuesta aún está actualizada?
ihebiheb

172

GZip es simplemente desinflar más una suma de verificación y encabezado / pie de página. Sin embargo, desinflar es más rápido , como aprendí por las malas.

gzip vs gráfico desinflado


13
Sin mencionar que zlib no tiene soporte para la extensión, e incluso si lo tuviera, la instrucción CRC32 en SSE 4.2 usa el polinomio 1EDC6F41, y el formato gzip usa el polinomio EDB88320, algoritmos totalmente diferentes, efectivamente.
Jack Lloyd el

77
Y dado que desinflar es más rápido, ¿por qué SO usa gzip?
David Murdoch

40
Bueno, esta respuesta resulta ser incorrecta ... ver: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... en particular el cliente tiene 2 formas en que pueden "interpretar" desinflar, sin encabezado / checksumless y con encabezado zlib. La implementación en los navegadores de una desinflación correcta es mala. se debe evitar desinflar.
Sam Saffron

44
@sam adicionalmente acabo de volver a ejecutar los puntos de referencia y en un chip Intel moderno, obtengo gzip 1441/692 y desinflo 1286/531. El segundo número es descomprimir, el primero es comprimir. Entonces, desinflar es aún más rápido, ¿sus puntos de referencia muestran lo contrario? (Estoy de acuerdo en que puede no ser útil por otras razones, pero la respuesta es correcta , desinflar es más rápido ...)
Jeff Atwood

66
@JeffAtwood pero la pregunta no fue más rápida?
Ken

16

Es probable que no pueda elegir desinflar como opción. Al contrario de lo que puede esperar mod_deflate no está usando deflate sino gzip. Entonces, aunque la mayoría de los puntos son válidos, es probable que no sea relevante para la mayoría.


4

Creo que no hay una gran diferencia entre deflate y gzip, porque gzip básicamente es solo un encabezado envuelto alrededor de deflate (ver RFC 1951 y 1952).


3

La razón principal es que la desinflación es más rápida de codificar que gzip y en un servidor ocupado que puede marcar la diferencia. Con páginas estáticas es una pregunta diferente, ya que pueden precomprimirse fácilmente una vez.


presumiblemente con gzip no puede comenzar a transmitir el encabezado hasta que haya obtenido, almacenado y comprimido todos los datos. (porque necesita la suma de comprobación para crear el encabezado)
OJW

8
En el formato gzip, la suma de comprobación aparece al final del archivo, específicamente para que uno pueda comenzar a escribir bloques desinflados a medida que se procesan sin tener que detener todo.
Jack Lloyd

2

mod_deflate requiere menos recursos en su servidor, aunque puede pagar una pequeña penalización en términos de la cantidad de compresión.

Si está sirviendo muchos archivos pequeños, recomendaría realizar pruebas comparativas y pruebas de carga de sus soluciones comprimidas y sin comprimir; puede encontrar algunos casos en los que habilitar la compresión no generará ahorros.


Para quien se lo pregunte, con desinflar mis archivos de texto pasará de 30 KB a 10 KB, por lo que los archivos deben ser incluso más pequeños que eso para no obtener ningún ahorro. Supongo que menos de 1 KB o algo similar.
hextech

0

No debería haber ninguna diferencia en gzip & deflate para la descompresión. Gzip simplemente se desinfla con unas pocas docenas de encabezado de bytes envuelto alrededor, incluida una suma de verificación. La suma de comprobación es la razón de la compresión más lenta. Sin embargo, cuando está precomprimiendo miles de millones de archivos, desea esas sumas de verificación como una comprobación de sanidad en su sistema de archivos. Además, puede utilizar herramientas de línea de comandos para obtener estadísticas en el archivo. Para nuestro sitio, estamos precomprimiendo una tonelada de datos estáticos (todo el directorio abierto, 13,000 juegos, autocompletado para millones de palabras clave, etc.) y Alexa nos clasifica un 95% más rápido que todos los sitios web. Búsqueda por fax. Sin embargo, utilizamos un servidor web propietario propio. Apache / mod_deflate simplemente no lo cortó. Cuando esos archivos se comprimen en el sistema de archivos, no solo recibe un golpe por su archivo con el tamaño mínimo de bloque del sistema de archivos, sino toda la sobrecarga innecesaria en la administración del archivo en el sistema de archivos que al servidor web le podría importar menos. Sus preocupaciones deben ser la huella total del disco y el tiempo de acceso / descompresión y, en segundo lugar, la velocidad para poder precomprimir estos datos. La huella es importante porque a pesar de que el espacio en disco es barato, desea tanto como sea posible para caber en la memoria caché.


GZip probablemente verifica la suma de comprobación en la descompresión, de ahí la diferencia de velocidad para la descompresión.
Seun Osewa el

-1

En Ubuntu con Apache2 y el módulo de desinflado ya instalado (que es el predeterminado), puede habilitar la compresión de desinflar gzip en dos sencillos pasos:

a2enmod deflate
/etc/init.d/apache2 force-reload

¡Y estás lejos! Encontré que las páginas que serví a través de mi conexión adsl se cargaban mucho más rápido.

Editar: según el comentario de @ GertvandenBerg, esto permite la compresión gzip, no desinflar.


66
Excepto que eso habilita gzip, ya que mod_deflate implementa confusamente solo la compresión gzip ...
Gert van den Berg

@GertvandenBerg He actualizado mi respuesta, pero para el registro, gzip se desinfla, solo con encabezados adicionales y una suma de comprobación
aidan el

@aiden sí, pero la suma de comprobación tiene un impacto en el rendimiento ... (y la deflación bruta no es estándar)
Gert van den Berg

-4

si recuerdo correctamente

  • gzip comprimirá un poco más que desinflar
  • desinflar es más eficiente

2
gzip se desinfla con un encabezado. Y HTTP 1.1 deflate es en realidad zlib (que también es un contenedor para desinflar)
David Murdoch
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.