Was ist der Vorteil der GZIP- gegenüber der DEFLATE-Komprimierung?

Lesezeit: 3 Minuten

Benutzer-Avatar
GibboK

Ich habe eine Website in asp.NET 4 (C#).

Ich versuche, eine Möglichkeit zu finden, die Bandbreite für meine Website besser zu optimieren.

Ich habe viele Artikel gelesen, die besagen, dass DEFLATE schneller und kleiner als GZIP ist, weil GZIP (basierend auf DEFLATE) einige zusätzliche Daten hinzufügt.

Wenn Sie die Header von bing.com und google.com überprüfen, scheinen beide GZIP-codierte Daten zu senden.

Angenommen, was ich lese, vermisse ich in diesem Fall den Vorteil von GZIP. Ich vermute also, dass es einen guten Grund geben sollte, GZIP DEFLATE vorzuziehen.

Meine Fragen:

  • Bietet GZIP Vorteile gegenüber DEFLATE, die mir nicht bekannt sind?
  • Irgendeine Ahnung, warum große Suchmaschinen GZIP verwenden?

Hier ist der Code, den ich verwende, um DEFLATE (von Global.asax) zu senden:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {

        HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (!(app.Context.CurrentHandler is Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (acceptEncoding == null || acceptEncoding.Length == 0)
            return;

        acceptEncoding = acceptEncoding.ToLower();

        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
            // defalte
            app.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
        else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
    }

  • Siehe stackoverflow.com/questions/388595/…

    – Sebastian Paaske Torholm

    30. August 2011 um 13:19 Uhr

  • Danke Paul für deine Überarbeitung.

    – GibboK

    30. August 2011 um 13:21 Uhr

  • Alle Antworten sind falsch / unvollständig, außer dieser: stackoverflow.com/a/9856879/632951

    – Schrittmacher

    4. Juli 2012 um 2:18 Uhr

Benutzer-Avatar
Peter

Gzip ist zuverlässiger, weil es entleert ist, plus ein paar Header und eine Prüfsumme. Mit anderen Worten, gzip ist entleert und enthält zusätzliche Header und Prüfsummen. Deflate wird mit adler32 geprüft, das ebenfalls Teil von gzip ist. Weil die gzip-Nutzlast eine DEFLATE-komprimierte Nutzlast ist.

Informationen entleeren

Gzip-Info

eine gzip-Datei/Stream enthält:

- a 10-byte header, containing a magic number, a version number and a time stamp
- optional extra headers, such as the original file name,
- a body, containing a DEFLATE-compressed payload
- an 8-byte footer, containing a CRC-32 checksum and the length of the original uncompressed data

  • Zusammenfassend … meinst du, GZIP ist browserkompatibeler?

    – GibboK

    30. August 2011 um 13:28 Uhr


  • GZip ermöglicht dem Browser, nach Fehlern zu suchen, Deflate nicht

    – Petrus

    30. August 2011 um 13:30 Uhr

  • @peer Das ist falsch, deflate sucht mit adler32 nach Fehlern.

    – Schrittmacher

    4. Juli 2012 um 2:18 Uhr


  • @Pacerier Sie haben Recht, die DEFLATE-Nutzlast wird durch eine Prüfsumme überprüft.

    – Petrus

    4. Juni 2013 um 9:42 Uhr

Benutzer-Avatar
ZachB

Die andere Antwort ist meistens falsch. Der „Deflation“-Wert für die Content-Encoding HTTP-Header ist eine Fehlbezeichnung, die eigentlich ZLIB bedeutet. In Anbetracht dessen haben beide Prüfsummen und den gleichen komprimierten Inhalt. Sie unterscheiden sich nur in ihrer Kopf-/Fußzeile und der verwendeten Prüfsumme.

gzip “ablassen” (zlib)
Kopfzeilengröße 10 Byte 2 Byte
Fußzeilengröße 4 Bytes 0
Prüfsumme CRC32 Adler-32
Komprimierungsalgorithmus ENTLEEREN ENTLEEREN
Spezifikation RFC1952 RFC1950

In der Vergangenheit war “deflation” problematisch, da frühe Microsoft IIS-Server rohe Deflate-Daten anstelle von zlib-Daten sendeten (siehe https://stackoverflow.com/a/9186091/1218408). Um dies zu umgehen, wurde es üblich, einfach gzip zu verwenden.

Deflate ist etwas schneller, da Adler-32 normalerweise schneller zu berechnen ist als CRC32, aber die meiste Zeit wird tatsächlich damit verbracht, Daten zu komprimieren und nicht die Prüfsumme zu berechnen.

  • meinst du nicht adler-32 ist etwas schneller als crc32?

    – david_adler

    24. August 2021 um 12:02 Uhr

  • Ich denke, Sie haben DEFLATE mit ZLIB verwechselt. ZLIB ist RFC1950, Ihre Referenz, und entspricht größtenteils Ihrer Beschreibung. DEFLATE ist RFC1951.

    – Phil P

    30. November 2021 um 22:17 Uhr

  • @PhilP Das habe ich nicht. Ich habe das Wort „Deflation“ verwendet, weil das der schlecht benannte Wert von ist Content-Encoding Header in der HTTP-Spezifikation. Sie haben Recht, dass es eigentlich ZLIB ist, und darin liegt das Problem, das ich mit Microsoft IIS-Servern besprochen habe. Ich habe die Antwort bearbeitet, um dies hervorzuheben.

    – ZachB

    2. Dezember 2021 um 20:15 Uhr

1246840cookie-checkWas ist der Vorteil der GZIP- gegenüber der DEFLATE-Komprimierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy