2009-05-19 12 views
57

Wir kennen bereits deflate encoding is a winner über gzip in Bezug auf die Geschwindigkeit der Codierung, Decodierung und Komprimierungsgröße.Warum bevorzugen echte Server die gzip over deflate-Codierung?

Warum also keine großen Websites (die ich finden kann) senden (wenn ich einen Browser verwende, der es akzeptiert)?

Yahoo claims deflate ist "weniger effektiv". Warum?

Ich pflege HTTP-Server-Software, die deflate bevorzugt, also würde ich gerne wissen, ob es einen wirklich guten Grund gibt, dies nicht weiter zu tun.

Antwort

66

gibt es einige Verwirrung über das Namens zwischen den Daten und dem HTTP:

  • DEFLATE wie durch RFC 1951 definiert ist ein komprimiertes Datenformat .
  • ZLIB wie durch RFC 1950 definiert ist ein komprimiertes Datenformat, das dasDEFLATE Datenformat verwendet.
  • GZIP wie durch RFC 1952 definiert ist ein Dateiformat, das dieDEFLATE komprimierten Datenformat verwendet.

Aber die HTTP uses a different naming:

  • gzip ein Codierungsformat durch das Dateikomprimierungsprogramm "gzip" (GNU zip) hergestellt, wie in RFC 1952 [25] beschrieben. Dieses Format ist eine Lempel-Ziv-Codierung (LZ77) mit einem 32-Bit-CRC.

  • deflate Die "zlib" Format definiert in RFC 1950 [31] in Verbindung mit dem beschrieben in RFC "entlüften" Kompressionsmechanismus 1951 [29].

So zusammenzufassen:

  • gzip das Format GZIP Datei ist.
  • deflate ist eigentlich das ZLIB Datenformat. (Aber einige Kunden nehmen auch das tatsächliche DEFLATE Datenformat für deflate.)

Siehe auch this answer on the question What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?:

Was ist der Unterschied zwischen dem "gzip" ist und "deflate" HTTP 1.1 Kodierungen ?

"gzip" ist das gzip-Format und "deflate" ist das zlib-Format. Sie sollten die zweite stattdessen "zlib" genannt haben, um eine Verwechslung mit dem komprimierten Datenformat zu vermeiden. Während der HTTP 1.1 RFC 2616 korrekt auf die zlib-Spezifikation in RFC 1950 für die "deflate" Transfer-Codierung verweist, gab es Berichte von Servern und Browsern, die unformatierte Daten per deflate-Spezifikation in RFC 1951, vor allem Microsoft, produzieren oder erwarten . Obwohl die "deflate" - Transfercodierung mit dem zlib - Format der effizientere Ansatz wäre (und genau das, für das das zlib - Format entworfen wurde), ist die Verwendung der "gzip" - Transfercodierung wahrscheinlich aufgrund einer unglücklichen Wahl von Name seitens der HTTP 1.1-Autoren.

5

Soweit ich weiß (Disclaimer: und ich bin kein Experte hier, genau das, was ich gehört habe), gzip verwendet den gleichen Algorithmus wie deflate, aber es hat mehr Header-Zeug, die es größer machen (relativ zu deflate). Ich denke jedoch, deflate wird von weniger Clients und Proxies unterstützt.

+1

Dies auch mit meinem Wissen in Einklang steht. Der Unterschied sollte nicht größer als ein paar Dutzend Bytes sein ... – ephemient

+1

@ephemient: Ja, aus der Größe Perspektive sollte es nicht viel Unterschied sein, aber es scheint, dass diese Bytes Prüfsummen sind, die Taktzyklen generiert werden müssen und überprüft, dass gzip langsamer als deflate macht. –

+2

Seit 6/08 akzeptieren weniger Bots es: http://www.computec.ch/projekte/browserrecon/?s=database&t=&f=accept-encoding Einige erkenne ich: Apache Lucene Nutch, Google Search Appliance Crawler (nicht Googlebot), einige Versionen von Yahoo! Schlürfen (Stand 08. Juni). Aber jeder Proxy/Client, der Deflate nicht unterstützt, wird es nicht in Accept-Encoding auflisten, also sollte es keinen Schaden verursachen, indem man einfach Deflate sendet, wenn man die Wahl hat. Ich könnte das auf einer Apache-Dev-Liste vorstellen. –

1

Ich fragte mich das Gleiche :). Ich denke, es könnte mit der Kompatibilität älterer (möglicherweise alter) Browser zu tun haben. Ich habe irgendwo gelesen, dass ältere Browser sich bei deflationierten Inhalten, die in bestimmten Fällen mod_gziped sind (?), Eher aus dem Staub machen, aber das Googeln hat mich zu der Schlussfolgerung geführt, dass es wahrscheinlich am besten ist, mit dem Googlen aufzuhören.

9

Aus meinen minimal Tests scheint es die meisten HTTPds entweder:

  1. unterstützt on-the-fly nicht abzulassen: Apache mod_deflate (a suprise), GWS
  2. oder bevorzugt gzip senden: IIS, lighttpd des mod_compress

Also auf der beliebtesten Server abzulassen zu senden (Apache), müssen Sie vorcodierten Dateien pflegen und verwenden mod_negotiate (man könnte sogar deflate vorziehen müssen Typ-Karten verwenden).

Ich denke, aufgrund dieser Schwierigkeiten, Deflate ist nur selten verwendet, und daher Fehler sind eher in Client-Deflate-Unterstützung als in gzip Unterstützung existieren.

+2

Und um es hinzuzufügen, habe ich gelesen, dass in einigen Fällen Server die Codierung mit der Bezeichnung "Deflate" senden und es wirklich gezippt wird, oder umgekehrt, und Clients haben sich angepasst, um mit diesem Fehler umzugehen. – Cheeso

7

Aktivieren Sie diese Website für weitere Informationen: http://web.archive.org/web/20120321182910/http://www.vervestudios.co/projects/compression-tests


Deflate, pro spec, ist eigentlich zlib (ein Kompressionsformat, das speziell für das Streaming von Inhalten über das Web entwickelt wurde) ..., die um ein Wrapper ist abzulassen .

Der Internet Explorer implementiert jedoch HTTP 1.1 deflate (zlib) fälschlicherweise als Raw Deflate. Wenn Ihr Server also den korrekten Inhalt von HTTP 1.1 deflate (zlib) an IE sendet, erstickt er.

Ich habe das Thema ein wenig recherchiert und es sieht immer sicher zu modernen Browsern roh abzulassen sendet ... nur sicherstellen, dass sein ist in der Tat, roh und nicht zlib.

Überprüfen Sie diesen Artikel für weitere Informationen > Gzip vs Deflate (zlib) revisited.

Also ich denke, dass es einen guten Grund gibt, weiterhin deflate über gzip zu senden.

+0

Siehe auch Zoompf Artikel in Ihrem SO-Thread hier verwiesen https://zoompf.com/blog/2012/02/lose-the-wait-http-compression mit Problemen mit (roh) Deflate erwähnt. – rhand

+0

Meine Empfehlung ist jetzt gzip, da viele Browser seit 2010 die Deflate-Unterstützung ablehnen. –

0

Actionscript 3 bietet native deflate Unterstützung, aber für gzip benötigen Sie eine externe Bibliothek verwenden