Desinflar la compatibilidad del navegador de compresión y las ventajas sobre GZIP

91

ACTUALIZACIÓN 10 de febrero de 2012:

zOompf ha completado una investigación muy exhaustiva sobre este mismo tema aquí . Supera cualquier hallazgo a continuación.


ACTUALIZACIÓN 11 de septiembre de 2010:

Se ha creado una plataforma de prueba para esto aquí




Definiciones HTTP 1.1 de GZIP y DEFLATE (zlib) para obtener información general:

"'Gzip' es el formato gzip, y 'deflate' es el formato zlib . Probablemente deberían haber llamado al segundo 'zlib' en su lugar para evitar confusiones con el formato de datos comprimidos sin formato deflate. Mientras que HTTP 1.1 RFC 2616 apunta correctamente a la especificación zlib en RFC 1950 para la codificación de transferencia 'desinflar', ha habido informes de servidores y navegadores que producen incorrectamente o esperan datos de desinflado sin procesar según la especificación de desinflado en RFC 1951, sobre todo productos de Microsoft . transferir la codificación utilizando el formato zlib sería el enfoque más eficiente ( y de hecho exactamente para lo que se diseñó el formato zlib), usar la codificación de transferencia 'gzip' es probablemente más confiable debido a una desafortunada elección de nombre por parte de los autores de HTTP 1.1 ". (fuente: http://www.gzip.org/zlib/zlib_faq.html )

Entonces, mi pregunta: si envío datos RAW desinflados sin envoltorio zlib (o gzip, para el caso), ¿hay navegadores modernos (por ejemplo, IE6 y superiores, FF, Chrome, Safari, etc.) que NO puedan entender el desinflado sin procesar datos comprimidos (asumiendo que el encabezado de solicitud HTTP "Accept-Encoding" contiene "deflate")?

Los datos desinflados SIEMPRE serán unos pocos bytes más pequeños que GZIP.

Si todos estos navegadores pueden decodificar con éxito los datos, ¿qué desventajas hay en enviar RAW deflate en lugar de zlib?



ACTUALIZACIÓN 11 de septiembre de 2010:

Se ha creado una plataforma de prueba para esto aquí

David Murdoch
fuente
1
¿Le importaría explicar por qué System.IO.Compression.DeflateStream apesta en comparación con zlib.net? Google no me muestra mucho que sea relevante, excepto que una persona lo menciona "no tiene una relación de compresión particularmente buena".
Joel Mueller
Correcto, la relación de compresión para los métodos gzip y deflate de .net no parece estar ni cerca de lo que debería ser. Sin embargo, no he realizado pruebas comparativas de velocidad entre los dos (zlib.net frente a .net nativo).
David Murdoch
¿Por qué no registra los resultados de su caso de prueba?
Gumbo
1
He estado hurgando en la biblioteca System.IO.Compression y parece usar un árbol estático / predefinido, por lo que la compresión no está optimizada para la secuencia específica. Debería ser el método más rápido, pero definitivamente producirá relaciones de compresión pobres.
Brady Moritz
2
@JoelMueller Esto podría explicar: virtualdub.org/blog/pivot/entry.php?id=335
Nayuki

Respuestas:

37

ACTUALIZACIÓN: Los navegadores han dejado de admitir el desinflado sin procesar. zOompf ha completado una investigación muy exhaustiva sobre este mismo tema aquí . Desafortunadamente, parece que el desinflado crudo NO es seguro de usar.


Consulte http://www.vervestudios.co/projects/compression-tests/results para obtener más resultados.

Estos son los navegadores que se han probado:

/*  Browser                       DEFLATE      ZLIB     */
    XP Internet Explorer 6        PASS         FAIL
    XP Internet Explorer 7        PASS         FAIL
    XP Internet Explorer 8        PASS         FAIL
    Vista Internet Explorer 8     PASS         FAIL
    XP Firefox 3.6.*              PASS         PASS
    XP Firefox 3.5.3              PASS         PASS
    XP Firefox 3.0.14             PASS         PASS
    Win 7 Firefox 3.6.*           PASS         PASS
    Vista Firefox 3.6.*           PASS         PASS
    Vista Firefox 3.5.3           PASS         PASS
    XP Safari 3                   PASS         PASS
    XP Safari 4                   PASS         PASS     
    XP Chrome 3.0.195.27          PASS         PASS
    XP Opera 9                    PASS         PASS
    XP Opera 10                   PASS         PASS
    XP Sea Monkey 1.1.8           PASS         PASS
    Android 1.6 Browser (v4)*     N/A          N/A
    OS-X Safari 4                 PASS         PASS
    OS X Chrome 7.0.517.44        PASS         PASS
    OS X Opera 10.63              PASS         PASS
    iPhone 3.1 Safari             PASS         PASS

* Android envía el encabezado de solicitud HTTP "Accept-Encoding: gzip". No se permite desinflar.


Concluyo que siempre podemos enviar DEFLATE sin procesar (cuando el encabezado de la solicitud HTTP "Accept-Encoding" contiene "deflate") y el navegador podrá interpretar correctamente los datos codificados. ¿Alguien puede probar que esto está mal?

nota: la implementación nativa de .NET de DEFLATE (System.IO.Compression.DeflateStream) es DEFLATE sin formato. También apesta. Utilice zlib.net para todas sus necesidades de desinflado de .NET.

David Murdoch
fuente
1
¿Puede ser más específico sobre el uso de zlib.net para desinflar? ¿Cómo coincide eso con la tabla anterior, donde dice que el desinflado en bruto funciona pero zlib no en algunos casos de XP IE?
David Eison
Android admite la compresión desinflada desde API 9. consulte: developer.android.com/reference/java/util/zip/… para obtener más información
Stuart Blackler
1
@DavidMurdoch, el único resultado sensato de sus pruebas parece no usar nunca deflate , vervestudios.co/projects/compression-tests/results Creo que esta respuesta debería editarse para reflejar eso
Sam Saffron
Sí, estoy de acuerdo. Actualizándolo ahora.
David Murdoch
6

El navegador Android 1.6 (v4) falla tanto en la prueba zlib como en la prueba de desinflado en su página. Lo agregué a tu lista.

Josef Pfleger
fuente
¡Gracias! ¿Qué codificación de contenido envía el navegador de Android?
David Murdoch
Envía 'Accept-Encoding: gzip'.
Josef Pfleger
1

¿No es el caso que el AddOutputFilterByType DEFLATEuso de mod_deflate envía por gzip por defecto?

Paul irlandés
fuente
1
Hola Paul, siento que estoy hablando con una celebridad ... estás en todas partes. :-) De todos modos, AddOutputFilertByType DEFLATEgzip la respuesta en lugar de desinflarla por defecto (hasta donde yo sé). Gzipes deflate+ un encabezado de 10 bytes + un pie de página de 8 bytes, lo que significa que GzipSIEMPRE será más grande que deflate... entonces, ¿por qué deberíamos usar gzip? (consulte en.wikipedia.org/wiki/Gzip#File_format para obtener un desglose de lo que está hecho gzip). Dicho esto, no estoy seguro de cómo configurarlo deflatecomo método de compresión preferido en Apache.
David Murdoch
-1

Por lo que yo sé, sí, prácticamente "siempre puedes enviar DEFLATE sin procesar y todo estará bien" ... no hay "siempre", pero la mayoría de los casos. si no, este es un problema del navegador.

Letterman
fuente
Estoy tratando de encontrar los casos en los que falla el desinflado sin procesar. Según las especificaciones, debería fallar en todos los navegadores.
David Murdoch
Raw deflate(es decir, no zlib , sin encabezados) solo funcionará en IE7 si encoding:gzipy (solo probado en chrome v24) encoding:deflateen chrome .
Scotty.NET