Mengapa menggunakan deflate alih-alih gzip untuk file teks yang dilayani oleh Apache?


215

Apa kelebihan yang ditawarkan metode baik untuk file html, css dan javascript yang dilayani oleh server LAMP. Apakah ada alternatif yang lebih baik?

Server memberikan informasi ke aplikasi peta menggunakan Json, sehingga volume tinggi file kecil.

Lihat juga Apakah ada kinerja yang terlibat dalam memilih gzip atas deflate untuk kompresi http?


beralih jawaban yang diterima ... konsensus saat ini adalah dua banding satu mendukung gzip
Ken

1
mod_deflate adalah untuk Apache 2, mod_gzip adalah untuk Apache 1.3.
SPRBRN

Jawaban:


315

Mengapa menggunakan deflate alih-alih gzip untuk file teks yang dilayani oleh Apache?

Jawaban sederhananya adalah jangan .


RFC 2616 mendefinisikan deflate sebagai:

deflate Format "zlib" yang didefinisikan dalam RFC 1950 dalam kombinasi dengan mekanisme kompresi "deflate" yang dijelaskan dalam RFC 1951

Format zlib didefinisikan dalam RFC 1950 sebagai:

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

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

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

Jadi, beberapa header dan sebuah checksum ADLER32

RFC 2616 mendefinisikan gzip sebagai:

gzip Format penyandian yang dihasilkan oleh program kompresi file "gzip" (GNU zip) seperti yang dijelaskan dalam RFC 1952 [25]. Format ini adalah coding Lempel-Ziv (LZ77) dengan CRC 32 bit.

RFC 1952 mendefinisikan data terkompresi sebagai:

Format saat ini menggunakan metode kompresi DEFLATE tetapi dapat dengan mudah diperluas untuk menggunakan metode kompresi lainnya.

CRC-32 lebih lambat dari ADLER32

Dibandingkan dengan pemeriksaan redundansi siklik dengan panjang yang sama, ini memperdagangkan keandalan untuk kecepatan (lebih memilih yang terakhir).

Jadi ... kami memiliki 2 mekanisme kompresi yang menggunakan algoritma yang sama untuk kompresi, tetapi algoritma yang berbeda untuk header dan checksum.

Sekarang, paket TCP yang mendasarinya sudah cukup andal , jadi masalahnya di sini bukan Adler 32 vs CRC-32 yang digunakan GZIP.


Ternyata banyak browser selama bertahun-tahun menerapkan algoritma deflate yang salah. Alih-alih mengharapkan header zlib di RFC 1950 mereka hanya mengharapkan payload terkompresi. Demikian pula berbagai server web membuat kesalahan yang sama.

Jadi, selama bertahun-tahun browser mulai menerapkan implementasi fuzzy logic deflate, mereka mencoba zlib header dan adler checksum, jika gagal mereka mencoba payload.

Hasil dari memiliki logika yang kompleks seperti itu adalah sering rusak. Verve Studio memiliki bagian uji kontribusi pengguna yang menunjukkan seberapa buruk situasinya.

Sebagai contoh: deflate bekerja di Safari 4.0 tetapi rusak di Safari 5.1, ia juga selalu memiliki masalah pada IE.


Jadi, hal terbaik yang harus dilakukan adalah menghindari mengempis sama sekali, dorongan kecepatan minor (karena adler 32) tidak sebanding dengan risiko rusaknya muatan.


Tidakkah seharusnya ada standar baru yang menggabungkan adler32 dengan gzip?
Pacerier

1
@ Sam Saffron, apakah ini berarti jika browser web tidak ada dalam gambar, saya dapat menggunakan deflate di atas gzip? Misalnya, jika saya akan mengunggah file terkompresi ke server FTP saya.
Xegara

1
Perbedaan lain yang sangat kecil adalah pembungkus zlib adalah enam byte vs 18 byte untuk gzip. Jadi untuk paket yang sangat kecil, mungkin ada keuntungan mengirim 12 byte lebih sedikit. Kesimpulannya tidak berubah, yaitu karena Microsoft mengacaukannya untuk semua orang dengan salah mengartikan apa yang dimaksud "deflate" dalam apa yang mereka sampaikan di server IIS mereka, lebih mudah menggunakan format gzip saja.
Mark Adler

Tapi bagaimana mungkin payloadnya bisa rusak, jika ditransmisikan menggunakan TCP? Seluruh gagasan TCP adalah untuk mengirimkan muatan yang tidak terputus.
user1095108

Ini tanggal jawaban dari 2012. Jadi apakah browser modern masih menderita dari masalah implementasi yang salah dari algoritma deflate atau apakah aman untuk menggunakannya sekarang? Apakah bagian dari jawaban ini masih mutakhir?
ihebiheb

172

GZip hanya mengempis ditambah checksum dan header / footer. Mengempis lebih cepat , karena saya belajar dengan cara yang sulit.

gzip vs grafik deflate


13
Belum lagi bahwa zlib tidak memiliki dukungan untuk ekstensi, dan bahkan jika itu, instruksi CRC32 di SSE 4.2 menggunakan polinom 1EDC6F41, dan format gzip menggunakan polinomial EDB88320 - algoritma yang sama sekali berbeda, secara efektif.
Jack Lloyd

7
Dan karena deflate lebih cepat, mengapa SO menggunakan gzip?
David Murdoch

40
Baiklah, jawaban ini ternyata salah ... lihat: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... khususnya klien memiliki 2 cara mereka dapat "mengartikan" mengempis, tanpa kepala. / checksumless dan dengan header zlib. Implementasi lintas browser dari deflate yang benar buruk. mengempis harus dihindari.
Sam Saffron

4
@ Sam juga saya hanya menjalankan kembali benchmark dan pada chip Intel modern, saya mendapatkan gzip 1441/692 dan mengempiskan 1286/531. Angka kedua adalah dekompresi, pertama adalah kompres. Jadi mengempis adalah masih lebih cepat, jangan benchmark Anda menunjukkan sebaliknya? (Saya setuju itu mungkin tidak berguna karena alasan lain, tetapi jawabannya benar , mengempis lebih cepat ..)
Jeff Atwood

6
@ Jeff Jtff tetapi pertanyaannya tidak lebih cepat?
Ken

16

Anda kemungkinan tidak dapat memilih deflate sebagai opsi. Bertentangan dengan apa yang Anda harapkan mod_deflate tidak menggunakan deflate tetapi gzip. Jadi, sementara sebagian besar poin yang dibuat valid, kemungkinan besar tidak relevan untuk sebagian besar.


4

Saya pikir tidak ada perbedaan besar antara deflate dan gzip, karena gzip pada dasarnya hanyalah sebuah header yang dililitkan deflate (lihat RFCs 1951 dan 1952).


3

Alasan utamanya adalah deflate lebih cepat untuk dikodekan daripada gzip dan pada server yang sibuk yang mungkin membuat perbedaan. Dengan halaman statis, ini adalah pertanyaan yang berbeda, karena mereka dapat dengan mudah dikompres sekali.


mungkin dengan gzip Anda tidak dapat mulai mengirimkan tajuk sampai Anda mendapatkan, menyimpan dan mengompres semua data? (karena Anda memerlukan checksum untuk membuat header)
OJW

8
Dalam format gzip, checksum muncul di akhir file, khususnya sehingga seseorang dapat mulai menulis blok deflate ketika mereka diproses tanpa harus menahan semuanya.
Jack Lloyd

2

mod_deflate membutuhkan sumber daya yang lebih sedikit di server Anda, meskipun Anda mungkin membayar penalti kecil dalam hal jumlah kompresi.

Jika Anda menyajikan banyak file kecil, saya akan merekomendasikan benchmark dan memuat pengujian solusi terkompresi dan tidak terkompresi Anda - Anda mungkin menemukan beberapa kasus di mana memungkinkan kompresi tidak akan menghasilkan penghematan.


Bagi siapa pun yang bertanya-tanya, dengan mengempis file teks saya pergi dari 30KB ke 10KB - jadi file harus lebih kecil dari itu untuk tidak mendapatkan penghematan. Saya menebak kurang dari 1KB atau yang serupa.
hextech

0

Seharusnya tidak ada perbedaan dalam gzip & deflate untuk dekompresi. Gzip hanya mengempis dengan header beberapa lusin byte melilitnya termasuk checksum. Checksum adalah alasan untuk kompresi yang lebih lambat. Namun ketika Anda mengkompres zillions file yang Anda inginkan checksum tersebut sebagai pemeriksaan kewarasan di sistem file Anda. Selain itu, Anda dapat menggunakan alat commandline untuk mendapatkan statistik pada file. Untuk situs kami, kami mengkompres satu ton data statis (seluruh direktori terbuka, 13.000 game, pelengkapan otomatis untuk jutaan kata kunci, dll.) Dan kami peringkat 95% lebih cepat dari semua situs web oleh Alexa. Pencarian Faxo. Namun, kami memanfaatkan server web milik rumah yang dikembangkan. Apache / mod_deflate tidak memotongnya. Ketika file-file tersebut dikompres ke dalam sistem file tidak hanya Anda mengambil hit untuk file Anda dengan ukuran blok sistem file minimum tetapi semua overhead yang tidak perlu dalam mengelola file dalam sistem file yang webserver tidak peduli. Kekhawatiran Anda harus total footprint disk dan waktu akses / dekompresi dan kecepatan kedua untuk mendapatkan data ini terkompresi. Tapak penting karena meskipun ruang disk murah Anda ingin sebanyak mungkin masuk dalam cache.


GZip mungkin memeriksa checksum pada dekompresi, maka perbedaan kecepatan untuk dekompresi.
Seun Osewa

-1

Pada Ubuntu dengan Apache2 dan modul deflate sudah terpasang (yang secara default), Anda dapat mengaktifkan deflate gzip kompresi dalam dua langkah mudah:

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

Dan kamu pergi! Saya menemukan halaman yang saya layani melalui koneksi adsl saya dimuat jauh lebih cepat.

Sunting: Sesuai komentar @ GertvandenBerg, ini memungkinkan kompresi gzip, bukan mengempis.


6
Kecuali itu memungkinkan gzip, karena mod_deflate membingungkan hanya menerapkan kompresi gzip ...
Gert van den Berg

@ GertvandenBerg Saya sudah memperbarui jawaban saya, tetapi sebagai catatan, gzip sudah mengempis, hanya dengan header tambahan dan sebuah checksum
aidan

@ aiden ya tapi checksum memiliki dampak kinerja ... (dan deflate mentah tidak sesuai standar)
Gert van den Berg

-4

jika saya ingat dengan benar

  • gzip akan memampatkan lebih dari mengempis
  • deflate lebih efisien

2
gzip dikempiskan dengan tajuk. Dan HTTP 1.1 deflate sebenarnya zlib (yang juga merupakan pembungkus deflate)
David Murdoch
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.