Dégonflez la compatibilité du navigateur de compression et ses avantages par rapport à GZIP

91

MISE À JOUR du 10 février 2012:

zOompf a réalisé des recherches très approfondies sur ce sujet très ici . Il l'emporte sur toutes les conclusions ci-dessous.


MISE À JOUR du 11 septembre 2010:

Une plateforme de test a été créée pour cela ici




Définitions HTTP 1.1 de GZIP et DEFLATE (zlib) pour quelques informations générales:

"'Gzip' est le format gzip, et 'deflate' est le format zlib . Ils auraient probablement dû appeler le second 'zlib' à la place pour éviter toute confusion avec le format de données compressées brutes deflate. Alors que le HTTP 1.1 RFC 2616 pointe correctement vers la spécification zlib dans la RFC 1950 pour le codage de transfert 'deflate', il y a eu des rapports de serveurs et de navigateurs qui produisent ou s'attendent à des données brutes de deflate selon la spécification de deflate de la RFC 1951, notamment les produits Microsoft . Donc, même si le 'deflate' le codage de transfert utilisant le format zlib serait l'approche la plus efficace ( ), l'utilisation du codage de transfert 'gzip' est probablement plus fiable en raison d'un choix de nom malheureux de la part des auteurs HTTP 1.1." (la source: et en fait exactement ce pour quoi le format zlib a été conçu http://www.gzip.org/zlib/zlib_faq.html )

Donc, ma question: si j'envoie des données RAW deflate sans emballage zlib (ou gzip, d'ailleurs) y a-t-il des navigateurs modernes (par exemple, IE6 et plus, FF, Chrome, Safari, etc.) qui ne peuvent PAS comprendre le dégonflage brut données compressées (en supposant que l'en-tête de requête HTTP "Accept-Encoding" contient "deflate")?

Les données de dégonflage seront TOUJOURS quelques octets plus petites que GZIP.

Si tous ces navigateurs parviennent à décoder les données, quels inconvénients y a-t-il à envoyer RAW deflate au lieu de zlib?



MISE À JOUR du 11 septembre 2010:

Une plateforme de test a été créée pour cela ici

David Murdoch
la source
1
Pourriez-vous expliquer pourquoi System.IO.Compression.DeflateStream est nul par rapport à zlib.net? Google ne me montre pas grand-chose de pertinent, sauf une personne mentionnant qu'il "n'a pas un taux de compression particulièrement bon".
Joel Mueller
À droite, le taux de compression pour les méthodes gzip et deflate de .net ne semble pas être proche de ce qu'ils devraient être. Cependant, je n'ai pas fait de benchmarks de vitesse entre les deux (zlib.net vs .net natif).
David Murdoch
Pourquoi ne consignez-vous pas simplement les résultats de votre scénario de test?
Gumbo
1
J'ai fouillé dans la bibliothèque System.IO.Compression, et elle semble utiliser un arbre statique / prédéfini - ainsi la compression n'est pas optimisée pour le flux spécifique. Cela devrait être la méthode la plus rapide, mais produira certainement de mauvais taux de compression.
Brady Moritz
2
@JoelMueller Cela pourrait expliquer: virtualdub.org/blog/pivot/entry.php?id=335
Nayuki

Réponses:

37

MISE À JOUR: Les navigateurs ont abandonné la prise en charge du dégonflage brut. zOompf a réalisé des recherches très approfondies sur ce sujet très ici . Malheureusement, il semble que le dégonflage brut n'est PAS sûr à utiliser.


Consultez http://www.vervestudios.co/projects/compression-tests/results pour plus de résultats.

Voici les navigateurs qui ont été testés:

/*  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 envoie l'en-tête de la requête HTTP "Accept-Encoding: gzip". Le dégonflage n'est pas autorisé.


J'en conclus que nous pouvons toujours envoyer du DEFLATE brut (lorsque l'en-tête de la requête HTTP "Accept-Encoding" contient "deflate") et le navigateur pourra interpréter correctement les données encodées. Quelqu'un peut-il prouver que c'est faux?

Remarque: l'implémentation native de .NET de DEFLATE (System.IO.Compression.DeflateStream) est DEFLATE brut. Ça craint aussi. Veuillez utiliser zlib.net pour tous vos besoins de dégonflage .NET.

David Murdoch
la source
1
Pouvez-vous être plus précis sur l'utilisation de zlib.net pour le dégonflage? Comment cela correspond-il au tableau ci-dessus, où il indique que le dégonflage brut fonctionne mais que zlib ne le fait pas dans certains cas de XP IE?
David Eison
Android prend en charge la compression dégonflée depuis l'API 9. voir: developer.android.com/reference/java/util/zip/… pour plus d'informations
Stuart Blackler
1
@DavidMurdoch, le seul résultat sain de vos tests semble ne jamais utiliser deflate , vervestudios.co/projects/compression-tests/results Je pense que cette réponse devrait être modifiée pour refléter cela
Sam Saffron
Ouais, je suis d'accord. Mise à jour maintenant.
David Murdoch
6

Le navigateur Android 1.6 (v4) échoue à la fois au test zlib et au test de dégonflage sur votre page. Je l'ai ajouté à votre liste.

Josef Pfleger
la source
Merci! Quel Content-Encoding le navigateur d'Android envoie-t-il?
David Murdoch
Il envoie «Accept-Encoding: gzip».
Josef Pfleger
1

N'est-il pas vrai que l' AddOutputFilterByType DEFLATEutilisation de mod_deflate envoie par défaut gzip?

Paul irlandais
la source
1
Hé Paul, j'ai l'impression de parler à une célébrité ... tu es partout. :-) Quoi qu'il en soit, AddOutputFilertByType DEFLATEgzips la réponse au lieu de la dégonfler par défaut (pour autant que je sache). Gzipest deflate+ un en-tête de 10 octets + un pied de page de 8 octets - ce qui signifie que ce Gzipsera TOUJOURS plus grand que deflate... alors pourquoi devrions-nous utiliser gzip? (voir en.wikipedia.org/wiki/Gzip#File_format pour une description de la composition de gzip). Cela dit, je ne sais pas comment définir deflatela méthode de compression préférée dans Apache.
David Murdoch
-1

pour autant que je sache, oui - à peu près vous "pouvez toujours envoyer du DEFLATE brut et tout irait bien" ... il n'y en a pas "toujours", mais la plupart de tous les cas. sinon, c'est le problème du navigateur.

Letterman
la source
J'essaie de trouver les cas où le dégonflage brut échoue. Selon les spécifications, il devrait échouer dans tous les navigateurs.
David Murdoch
Raw deflate(c'est-à-dire pas zlib , pas d'en-tête du tout) ne fonctionnera dans IE7 que si encoding:gzipet (testé uniquement dans chrome v24) encoding:deflatedans chrome .
Scotty.NET