Riduci la compatibilità del browser di compressione e i vantaggi rispetto a GZIP


91

AGGIORNAMENTO 10 febbraio 2012:

zOompf ha completato alcune ricerche molto approfondite su questo argomento qui . Supera qualsiasi risultato di seguito.


AGGIORNAMENTO 11 settembre 2010:

Una piattaforma di test è stato creato per questo qui




Definizioni HTTP 1.1 di GZIP e DEFLATE (zlib) per alcune informazioni di base:

"" Gzip "è il formato gzip e " deflate "è il formato zlib . Probabilmente avrebbero dovuto chiamare il secondo" zlib "per evitare confusione con il formato di dati compressi deflate grezzo. Mentre HTTP 1.1 RFC 2616 punta correttamente a la specifica zlib in RFC 1950 per la codifica di trasferimento "deflate", sono stati segnalati server e browser che producono in modo errato o si aspettano dati di deflazione non elaborati secondo la specifica deflate in RFC 1951, in particolare i prodotti Microsoft . Quindi, anche se il "deflate" trasferire la codifica utilizzando il formato zlib sarebbe l'approccio più efficiente ( e in effetti esattamente per cosa è stato progettato il formato zlib), l'uso della codifica di trasferimento "gzip" è probabilmente più affidabile a causa di una scelta sfortunata del nome da parte degli autori di HTTP 1.1. "(fonte: http://www.gzip.org/zlib/zlib_faq.html )

Quindi, la mia domanda: se invio dati RAW deflate senza zlib wrapper (o gzip, se è per questo) ci sono browser moderni (ad esempio, IE6 e versioni successive, FF, Chrome, Safari, ecc.) Che NON possono comprendere il raw deflate dati compressi (supponendo che l'intestazione della richiesta HTTP "Accept-Encoding" contenga "deflate")?

I dati di deflate saranno SEMPRE di qualche byte più piccoli di GZIP.

Se tutti questi browser riescono a decodificare i dati con successo, quali svantaggi ci sono nell'inviare RAW deflate invece di zlib?



AGGIORNAMENTO 11 settembre 2010:

Una piattaforma di test è stato creato per questo qui


1
Ti dispiacerebbe espandere il motivo per cui System.IO.Compression.DeflateStream fa schifo rispetto a zlib.net? Google non mi mostra molto di rilevante, tranne una persona che lo menziona "non ha un rapporto di compressione particolarmente buono".
Joel Mueller

Esatto, il rapporto di compressione per entrambi i metodi gzip e deflate di .net non sembra essere affatto vicino a quello che dovrebbero essere. Tuttavia, non ho eseguito alcun benchmark di velocità tra i due (zlib.net vs. native .net).
David Murdoch

Perché non registri solo i risultati del tuo caso di test?
Gumbo

1
Ho frugato nella libreria System.IO.Compression e sembra utilizzare un albero statico / predefinito, quindi la compressione non è ottimizzata per il flusso specifico. Dovrebbe essere il metodo più veloce, ma sicuramente produrrà rapporti di compressione scadenti.
Brady Moritz

2
@JoelMueller Questo potrebbe spiegare: virtualdub.org/blog/pivot/entry.php?id=335
Nayuki

Risposte:


37

AGGIORNAMENTO: i browser hanno abbandonato il supporto per la deflazione non elaborata. zOompf ha completato alcune ricerche molto approfondite su questo argomento qui . Sfortunatamente, sembra che Raw deflate NON sia sicuro da usare.


Controlla http://www.vervestudios.co/projects/compression-tests/results per ulteriori risultati.

Ecco i browser che sono stati testati:

/*  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 invia l'intestazione della richiesta HTTP "Accept-Encoding: gzip". Lo sgonfiaggio non è consentito.


Concludo che possiamo sempre inviare DEFLATE grezzo (quando l'intestazione della richiesta HTTP "Accept-Encoding" contiene "deflate") e il browser sarà in grado di interpretare correttamente i dati codificati. Qualcuno può dimostrare che questo è sbagliato?

nota: l'implementazione nativa di DEFLATE (System.IO.Compression.DeflateStream) di .NET è DEFLATE grezzo. Fa anche schifo. Utilizza zlib.net per tutte le tue esigenze di deflazione .NET.


1
Puoi essere più specifico sull'uso di zlib.net per lo sgonfiaggio? In che modo questo corrisponde al grafico sopra, dove si dice che raw deflate funziona ma zlib non lo fa in alcuni casi di XP IE?
David Eison

Android supporta la compressione Deflate dall'API 9. vedere: developer.android.com/reference/java/util/zip/… per ulteriori informazioni
Stuart Blackler

1
@DavidMurdoch l'unico risultato sano dei tuoi test sembra non usare mai deflate , vervestudios.co/projects/compression-tests/results Penso che questa risposta dovrebbe essere modificata per riflettere questo
Sam Saffron

Sì, sono d'accordo. Aggiornalo ora.
David Murdoch

6

Il browser Android 1.6 (v4) non supera il test zlib e deflate sulla tua pagina. L'ho aggiunto alla tua lista.


Grazie! Quale codifica dei contenuti invia il browser di Android?
David Murdoch,

Invia "Accept-Encoding: gzip".
Josef Pfleger

1

Non è il caso che l' AddOutputFilterByType DEFLATEutilizzo di mod_deflate invia tramite gzip per impostazione predefinita?


1
Ehi Paul, mi sento come se stessi parlando con una celebrità ... tu sei ovunque. :-) Comunque, AddOutputFilertByType DEFLATEgzips la risposta invece di sgonfiarla per impostazione predefinita (per quanto ne so). Gzipè deflate+ un'intestazione di 10 byte + un piè di pagina di 8 byte - il che significa che Gzipsarà SEMPRE più grande di deflate... quindi perché dovremmo mai usare gzip? (vedi en.wikipedia.org/wiki/Gzip#File_format per una ripartizione di cosa è fatto gzip). Detto questo, non sono sicuro di come impostare deflatecome metodo di compressione preferito in Apache.
David Murdoch

-1

per quanto ne so, sì - praticamente "puoi sempre inviare DEFLATE grezzo e tutto andrebbe bene" ... non c'è "sempre", ma soprattutto. in caso contrario, questo è il problema del browser.


Sto cercando di trovare i casi in cui lo sgonfiaggio grezzo non riesce. Secondo le specifiche dovrebbe fallire in tutti i browser.
David Murdoch

Raw deflate(cioè non zlib , niente intestazioni) funzionerà solo in IE7 se encoding:gzipe (testato solo in chrome v24) encoding:deflatein chrome .
Scotty.NET
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.