Warum sollten Sie deflate anstelle von gzip für Textdateien verwenden, die von Apache bereitgestellt werden?


215

Welche Vorteile bieten beide Methoden für HTML-, CSS- und Javascript-Dateien, die von einem LAMP-Server bereitgestellt werden? Gibt es bessere Alternativen?

Der Server stellt einer Kartenanwendung mithilfe von Json Informationen zur Verfügung, also ein großes Volumen kleiner Dateien.

Siehe auch Gibt es einen Leistungseinbruch bei der Auswahl von gzip anstelle von deflate für die http-Komprimierung?


akzeptierte Antworten gewechselt ... der aktuelle Konsens ist zwei zu eins zugunsten von gzip
Ken

1
mod_deflate ist für Apache 2, mod_gzip ist für Apache 1.3.
SPRBRN

Antworten:


315

Warum sollten Sie deflate anstelle von gzip für Textdateien verwenden, die von Apache bereitgestellt werden?

Die einfache Antwort lautet nicht .


RFC 2616 definiert Deflate als:

deflate Das in RFC 1950 definierte "zlib" -Format in Kombination mit dem in RFC 1951 beschriebenen "deflate" -Komprimierungsmechanismus

Das zlib-Format ist in RFC 1950 wie folgt definiert :

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

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

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

Also ein paar Header und eine ADLER32-Prüfsumme

RFC 2616 definiert gzip als:

gzip Ein vom Dateikomprimierungsprogramm "gzip" (GNU zip) erstelltes Codierungsformat, wie in RFC 1952 [25] beschrieben. Dieses Format ist eine Lempel-Ziv-Codierung (LZ77) mit einer 32-Bit-CRC.

RFC 1952 definiert die komprimierten Daten als:

Das Format verwendet derzeit die DEFLATE-Komprimierungsmethode, kann jedoch problemlos auf andere Komprimierungsmethoden erweitert werden.

CRC-32 ist langsamer als ADLER32

Im Vergleich zu einer zyklischen Redundanzprüfung gleicher Länge wird Zuverlässigkeit gegen Geschwindigkeit getauscht (wobei letztere bevorzugt wird).

Also ... wir haben zwei Komprimierungsmechanismen, die denselben Algorithmus für die Komprimierung verwenden, aber einen anderen Algorithmus für Header und Prüfsumme.

Jetzt sind die zugrunde liegenden TCP-Pakete bereits ziemlich zuverlässig , daher ist das Problem hier nicht Adler 32 gegenüber CRC-32 , das GZIP verwendet.


Es stellte sich heraus, dass viele Browser im Laufe der Jahre einen falschen Deflate-Algorithmus implementiert haben. Anstatt den zlib-Header in RFC 1950 zu erwarten, erwarteten sie einfach die komprimierte Nutzlast. In ähnlicher Weise haben verschiedene Webserver den gleichen Fehler gemacht.

Im Laufe der Jahre haben Browser damit begonnen, eine Fuzzy-Logik- Deflate-Implementierung zu implementieren. Sie versuchen, die zlib-Header- und Adler-Prüfsumme zu ermitteln. Wenn dies fehlschlägt, versuchen sie, Nutzdaten zu erhalten.

Das Ergebnis einer solchen komplexen Logik ist, dass sie oft kaputt ist. Verve Studio hat einen vom Benutzer bereitgestellten Testabschnitt , der zeigt, wie schlimm die Situation ist.

Beispiel: Deflate funktioniert in Safari 4.0, ist jedoch in Safari 5.1 fehlerhaft. Außerdem treten im IE immer Probleme auf.


Das Beste, was Sie tun können, ist, das Entleeren insgesamt zu vermeiden. Die geringfügige Geschwindigkeitssteigerung (aufgrund von Adler 32) ist das Risiko von Nutzlastbrüchen nicht wert.


Sollte es nicht einen neuen Standard geben, der adler32 mit gzip kombiniert?
Pacerier

1
@ Sam Saffron, heißt das, wenn der Webbrowser nicht im Bild ist, kann ich deflate over gzip verwenden? Zum Beispiel, wenn ich eine komprimierte Datei auf meinen FTP-Server hochladen möchte.
Xegara

1
Ein weiterer sehr kleiner Unterschied besteht darin, dass der zlib-Wrapper sechs Bytes gegenüber 18 Bytes für gzip umfasst. Für sehr kleine Pakete kann es also von Vorteil sein, 12 Bytes weniger zu senden. Die Schlussfolgerung ändert sich jedoch nicht. Da Microsoft es für alle vermasselt, indem es falsch interpretiert, was "Deflate" in dem bedeutet, was sie auf ihren IIS-Servern geliefert haben, ist es einfacher, nur das gzip-Format zu verwenden.
Mark Adler

Aber wie könnte die Nutzlast möglicherweise beschädigt werden, wenn sie über TCP übertragen wird? Die ganze Idee von TCP ist es, ungebrochene Nutzdaten zu übertragen.
user1095108

Dieses Antwortdatum stammt aus dem Jahr 2012. Leiden moderne Browser immer noch unter dem Problem der fehlerhaften Implementierung der Deflate-Algorithmen oder ist es jetzt sicher, sie zu verwenden? Ist dieser Teil der Antwort noch aktuell?
Ihebiheb

172

GZip ist einfach entleert plus eine Prüfsumme und Kopf- / Fußzeile. Das Entleeren ist jedoch schneller , wie ich auf die harte Tour gelernt habe.

gzip vs deflate graph


13
Ganz zu schweigen davon, dass zlib die Erweiterung nicht unterstützt, und selbst wenn dies der Fall ist, verwendet der CRC32-Befehl in SSE 4.2 das Polynom 1EDC6F41 und das gzip-Format das Polynom EDB88320 - völlig andere Algorithmen.
Jack Lloyd

7
Und da die Entleerung schneller ist, warum verwendet SO gzip?
David Murdoch

40
Nun, diese Antwort stellt sich als falsch heraus ... siehe: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... insbesondere hat der Client zwei Möglichkeiten, wie er Deflate ohne Header "interpretieren" kann / Prüfsummenlos und mit zlib-Header. Die Implementierung einer korrekten Deflate über alle Browser hinweg ist schlecht. Entleeren sollte vermieden werden.
Sam Saffron

4
@sam zusätzlich habe ich gerade die Benchmarks erneut ausgeführt und auf einem modernen Intel-Chip bekomme ich gzip 1441/692 und entleere 1286/531. Die zweite Zahl ist dekomprimieren, die erste ist komprimieren. Die Entleerung ist also immer noch schneller. Zeigen Ihre Benchmarks etwas anderes? (Ich bin damit einverstanden, dass es aus anderen Gründen nicht nützlich sein kann, aber die Antwort ist richtig , die Entleerung ist schneller.)
Jeff Atwood

6
@ JeffAtwood aber die Frage war nicht schneller?
Ken

16

Sie sind wahrscheinlich nicht in der Lage, Deflate als Option auszuwählen. Im Gegensatz zu dem, was Sie vielleicht erwarten, verwendet mod_deflate nicht deflate, sondern gzip. Obwohl die meisten Punkte gültig sind, ist sie für die meisten wahrscheinlich nicht relevant.


4

Ich denke, es gibt keinen großen Unterschied zwischen deflate und gzip, da gzip im Grunde nur ein Header ist, der um deflate gewickelt ist (siehe RFCs 1951 und 1952).


3

Der Hauptgrund ist, dass Deflate schneller zu codieren ist als gzip und auf einem ausgelasteten Server, der möglicherweise einen Unterschied macht. Bei statischen Seiten ist dies eine andere Frage, da sie leicht einmal vorkomprimiert werden können.


Vermutlich können Sie mit gzip erst dann mit der Übertragung des Headers beginnen, wenn Sie alle Daten erhalten, gespeichert und komprimiert haben . (weil Sie die Prüfsumme benötigen, um den Header zu erstellen)
ABl.

8
Im gzip-Format befindet sich die Prüfsumme am Ende der Datei, sodass Sie während der Verarbeitung mit dem Schreiben von Deflate-Blöcken beginnen können, ohne alles aufhalten zu müssen.
Jack Lloyd

2

mod_deflate benötigt weniger Ressourcen auf Ihrem Server, obwohl Sie möglicherweise eine kleine Strafe in Bezug auf den Komprimierungsgrad zahlen.

Wenn Sie viele kleine Dateien bereitstellen, würde ich empfehlen, Ihre komprimierten und unkomprimierten Lösungen zu vergleichen und zu testen. In einigen Fällen führt das Aktivieren der Komprimierung möglicherweise nicht zu Einsparungen.


Für alle, die sich fragen: Mit Deflate gehen meine Textdateien von 30 KB auf 10 KB - die Dateien müssen also noch kleiner sein, um keine Einsparungen zu erzielen. Ich vermute weniger als 1 KB oder ähnliches.
Hextech

0

Es sollte keinen Unterschied zwischen gzip und deflate für die Dekomprimierung geben. Gzip ist nur mit ein paar Dutzend Byte Header einschließlich einer Prüfsumme entleert. Die Prüfsumme ist der Grund für die langsamere Komprimierung. Wenn Sie jedoch zig Millionen Dateien vorkomprimieren, möchten Sie diese Prüfsummen als Überprüfung der Integrität in Ihrem Dateisystem. Darüber hinaus können Sie Befehlszeilentools verwenden, um Statistiken für die Datei abzurufen. Für unsere Website komprimieren wir eine Menge statischer Daten (das gesamte offene Verzeichnis, 13.000 Spiele, automatische Vervollständigung für Millionen von Keywords usw.) und sind von Alexa 95% schneller als alle Websites eingestuft. Faxo-Suche. Wir verwenden jedoch einen eigenen proprietären Webserver. Apache / mod_deflate hat es einfach nicht geschnitten. Wenn diese Dateien in das Dateisystem komprimiert werden, erzielen Sie nicht nur einen Treffer für Ihre Datei mit der minimalen Dateisystemblockgröße, sondern auch den unnötigen Aufwand für die Verwaltung der Datei im Dateisystem, der dem Webserver weniger wichtig sein könnte. Ihr Anliegen sollte der gesamte Speicherbedarf und die Zugriffs- / Dekomprimierungszeit sowie die Geschwindigkeit sein, mit der diese Daten vorkomprimiert werden können. Der Platzbedarf ist wichtig, denn obwohl der Speicherplatz billig ist, möchten Sie so viel wie möglich in den Cache passen.


GZip überprüft wahrscheinlich die Prüfsumme bei der Dekomprimierung, daher die Geschwindigkeitsdifferenz bei der Dekomprimierung.
Seun Osewa

-1

Unter Ubuntu mit Apache2 und dem bereits installierten Deflate-Modul (standardmäßig) können Sie die Deflate- GZIP-Komprimierung in zwei einfachen Schritten aktivieren :

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

Und du bist weg! Ich habe festgestellt, dass Seiten, die ich über meine ADSL-Verbindung bereitgestellt habe, viel schneller geladen wurden.

Bearbeiten: Gemäß dem Kommentar von @ GertvandenBerg wird die gzip-Komprimierung aktiviert und nicht die Luft abgelassen.


6
Nur dass dies gzip ermöglicht, da mod_deflate verwirrenderweise nur die gzip-Komprimierung implementiert ...
Gert van den Berg

@GertvandenBerg Ich habe meine Antwort aktualisiert, aber der Ordnung halber, gzip ist deflate, nur mit zusätzlichen Header und eine Prüfsumme
Aidan

@aiden yep, aber die Prüfsumme hat einen Einfluss auf die Leistung ... (und Rohentleerung ist nicht standardkonform)
Gert van den Berg

-4

wenn ich mich richtig erinnere

  • gzip komprimiert etwas mehr als entleert
  • Entleeren ist effizienter

2
gzip wird mit einem Header entleert. Und HTTP 1.1 Deflate ist eigentlich Zlib (was auch ein Wrapper um Deflate ist)
David Murdoch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.