Mengecilkan kompatibilitas browser kompresi dan keunggulan dibandingkan GZIP

91

UPDATE 10 Feb 2012:

zOompf telah menyelesaikan beberapa penelitian yang sangat menyeluruh tentang topik ini di sini . Ini mengalahkan semua temuan di bawah ini.


UPDATE 11 Sept 2010:

Sebuah platform pengujian telah dibuat untuk ini di sini




Definisi HTTP 1.1 dari GZIP dan DEFLATE (zlib) untuk beberapa informasi latar belakang:

"'Gzip' adalah format gzip, dan 'deflate' adalah format zlib . Mereka mungkin seharusnya memanggil yang kedua 'zlib' sebagai gantinya untuk menghindari kebingungan dengan format data terkompresi mentah deflate. Sementara HTTP 1.1 RFC 2616 dengan benar menunjuk ke spesifikasi zlib di RFC 1950 untuk pengkodean transfer 'deflate', ada laporan server dan browser yang salah menghasilkan atau mengharapkan data deflate mentah sesuai spesifikasi deflate di RFC 1951, terutama produk Microsoft . Jadi, meskipun 'deflate' transfer encoding menggunakan format zlib akan menjadi pendekatan yang lebih efisien ( dan sebenarnya untuk apa format zlib itu dirancang), menggunakan pengkodean transfer 'gzip' mungkin lebih dapat diandalkan karena pilihan nama yang tidak tepat pada bagian penulis HTTP 1.1. "(sumber: http://www.gzip.org/zlib/zlib_faq.html )

Jadi, pertanyaan saya: jika saya mengirim data deflate RAW tanpa pembungkus zlib (atau gzip, dalam hal ini) apakah ada browser modern (misalnya, IE6 dan lebih tinggi, FF, Chrome, Safari, dll) yang TIDAK dapat memahami deflate mentah data terkompresi (dengan asumsi header permintaan HTTP "Terima-Encoding" berisi "deflate")?

Deflasi data akan SELALU lebih kecil beberapa byte dari GZIP.

Jika semua browser ini berhasil memecahkan kode data, apa kerugiannya mengirim deflate RAW daripada zlib?



UPDATE 11 Sept 2010:

Sebuah platform pengujian telah dibuat untuk ini di sini

David Murdoch
sumber
1
Maukah Anda menjelaskan mengapa System.IO.Compression.DeflateStream menyebalkan dibandingkan dengan zlib.net? Google tidak menunjukkan kepada saya banyak hal yang relevan kecuali satu orang yang menyebutkan "tidak memiliki rasio kompresi yang sangat baik".
Joel Mueller
Benar, rasio kompresi untuk metode gzip dan deflate .net tampaknya tidak mendekati apa yang seharusnya. Namun, saya belum melakukan benchmark kecepatan antara keduanya (zlib.net vs. native .net).
David Murdoch
Mengapa Anda tidak mencatat hasil test case Anda saja?
Gumbo
1
Saya telah melihat-lihat di lib System.IO.Compression, dan tampaknya menggunakan pohon statis / yang telah ditentukan sebelumnya - sehingga kompresi tidak dioptimalkan untuk aliran tertentu. Harus menjadi metode tercepat, tetapi pasti akan menghasilkan rasio kompresi yang buruk.
Brady Moritz
2
@JoelMueller Ini mungkin menjelaskan: virtualdub.org/blog/pivot/entry.php?id=335
Nayuki

Jawaban:

37

UPDATE: Browser telah menjatuhkan dukungan untuk deflate mentah. zOompf telah menyelesaikan beberapa penelitian yang sangat menyeluruh tentang topik ini di sini . Sayangnya, tampaknya raw deflate TIDAK aman digunakan.


Periksa http://www.vervestudios.co/projects/compression-tests/results untuk hasil lebih lanjut.

Berikut adalah browser yang telah diuji:

/*  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 Mengirim header permintaan HTTP "Terima-Encoding: gzip". Mengempis tidak diizinkan.


Saya menyimpulkan bahwa kami selalu dapat mengirim DEFLATE mentah (ketika header permintaan HTTP "Terima-Encoding" berisi "deflate") dan browser akan dapat menafsirkan data yang disandikan dengan benar. Bisakah seseorang membuktikan ini salah?

Catatan: Implementasi asli .NET dari DEFLATE (System.IO.Compression.DeflateStream) adalah DEFLATE mentah. Itu juga menyebalkan. Harap gunakan zlib.net untuk semua kebutuhan Anda yang mengecilkan .NET.

David Murdoch
sumber
1
Bisakah Anda lebih spesifik dalam menggunakan zlib.net untuk mengempis? Bagaimana itu cocok dengan grafik di atas, di mana dikatakan deflate mentah berfungsi tetapi zlib tidak dalam beberapa kasus XP IE?
David Eison
Android mendukung kompresi deflate sejak API 9. lihat: developer.android.com/reference/java/util/zip/… untuk informasi lebih lanjut
Stuart Blackler
1
@DavidMurdoch, satu-satunya hasil yang masuk akal dari pengujian Anda tampaknya tidak pernah menggunakan deflate , vervestudios.co/projects/compression-tests/results Saya pikir jawaban ini harus diedit untuk mencerminkan bahwa
Sam Saffron
Ya, saya setuju. Memperbarui sekarang.
David Murdoch
6

Browser Android 1.6 (v4) gagal dalam uji zlib dan deflate pada halaman Anda. Saya telah menambahkannya ke daftar Anda.

Josef Pfleger
sumber
Terima kasih! Pengkodean Konten apa yang dikirimkan browser Android?
David Murdoch
Ini mengirimkan 'Terima-Enkode: gzip'.
Josef Pfleger
1

Bukankah itu kasus yang AddOutputFilterByType DEFLATEmenggunakan mod_deflate mengirim oleh gzip secara default?

Paul Irish
sumber
1
Hei Paul, aku merasa seperti sedang berbicara dengan selebriti ... kamu ada di mana-mana. :-) Pokoknya, AddOutputFilertByType DEFLATEgzips responnya dan bukan mengempiskannya secara default (sejauh yang saya tahu). Gzipadalah deflate+ header 10 byte + footer 8 byte - yang berarti GzipSELALU akan lebih besar dari deflate... jadi mengapa kita harus menggunakan gzip? (lihat en.wikipedia.org/wiki/Gzip#File_format untuk perincian tentang apa gzip dibuat). Dengan itu, saya tidak yakin bagaimana cara mengatur deflatesebagai metode kompresi yang disukai di Apache.
David Murdoch
-1

Sejauh yang saya tahu, ya - cukup banyak Anda "selalu dapat mengirim DEFLATE mentah dan semuanya akan baik-baik saja" ... tidak ada "selalu", tetapi kebanyakan dari semua kasus. jika tidak, ini adalah masalah browser.

Letterman
sumber
Saya mencoba menemukan kasus ketika deflate mentah gagal. Menurut spesifikasi itu harus gagal di semua browser.
David Murdoch
Mentah deflate(misalnya, bukan zlib , tidak ada header sama sekali) hanya akan berfungsi di IE7 jika encoding:gzipdan (hanya diuji di chrome v24) encoding:deflatedi chrome .
Scotty.NET