Apache tarafından sunulan metin dosyaları için neden gzip yerine deflate kullanıyorsunuz?


215

Her iki yöntem de bir LAMP sunucusu tarafından sunulan html, css ve javascript dosyaları için ne gibi avantajlar sağlar? Daha iyi alternatifler var mı?

Sunucu, Json kullanarak bir harita uygulamasına bilgi sağlar, bu nedenle çok sayıda küçük dosya olur.

Ayrıca bkz . Http sıkıştırması için gzip over deflate seçiminde herhangi bir performans isabeti var mı?


kabul edilen cevapları değiştirdi ... mevcut fikir birliği gzip lehine ikiye bir
Ken

1
mod_deflate Apache 2, mod_gzip Apache 1.3 içindir.
SPRBRN

Yanıtlar:


315

Apache tarafından sunulan metin dosyaları için neden gzip yerine deflate kullanıyorsunuz?

Basit cevap yok .


RFC 2616 deflasyonu şu şekilde tanımlar:

deflat RFC 1950'de tanımlanan RFC 1951'de tanımlanan "deflate" sıkıştırma mekanizması ile birlikte tanımlanan "zlib" formatı

Zlib biçimi RFC 1950'de şu şekilde tanımlanır :

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

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

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

Yani, birkaç başlık ve bir ADLER32 sağlama toplamı

RFC 2616, gzip'i şu şekilde tanımlar:

gzip Dosya sıkıştırma programı "gzip" (GNU zip) tarafından RFC 1952'de [25] açıklandığı gibi üretilen bir kodlama formatı. Bu format, 32 bit CRC'li bir Lempel-Ziv kodlamasıdır (LZ77).

RFC 1952 , sıkıştırılmış verileri şu şekilde tanımlar:

Biçim şu anda DEFLATE sıkıştırma yöntemini kullanmaktadır ancak diğer sıkıştırma yöntemlerini kullanmak için kolayca genişletilebilir.

CRC-32, ADLER32'den daha yavaş

Aynı uzunlukta bir döngüsel artıklık kontrolü ile karşılaştırıldığında, hız için güvenilirlik sağlar (ikincisini tercih eder).

Yani ... sıkıştırma için aynı algoritmayı kullanan 2 sıkıştırma mekanizmamız var , ancak başlıklar ve sağlama toplamı için farklı bir algoritma var.

Şimdi, altta yatan TCP paketleri zaten oldukça güvenilir , bu nedenle buradaki sorun Adler 32 vs GZIP'in kullandığı CRC-32 değil.


Yıllar boyunca birçok tarayıcı yanlış bir deflate algoritması uyguladı. RFC 1950'de zlib başlığını beklemek yerine sıkıştırılmış yükü beklediler. Benzer şekilde çeşitli web sunucuları da aynı hatayı yaptı.

Bu nedenle, tarayıcılar yıllar boyunca bulanık bir mantık söndürme uygulamasını uygulamaya başladılar, zlib başlığı ve adler sağlama toplamı için çalışırlar, eğer bu başarısız olursa yük için dener.

Böyle karmaşık bir mantığa sahip olmanın sonucu, genellikle kırılmış olmasıdır. Verve Studio'nun durumun ne kadar kötü olduğunu gösteren kullanıcı katkısı olan bir test bölümü var.

Örneğin: deflate Safari 4.0'da çalışır, ancak Safari 5.1'de bozulur, IE'de de her zaman sorunları vardır.


Bu nedenle, yapılacak en iyi şey, tamamen söndürülmekten kaçınmaktır, küçük hız artışı (adler 32 nedeniyle) kırık yük taşıma riskine değmez.


Adler32 ile gzip'i birleştiren yeni bir standart olmamalı mı?
Pacerier

1
@ Safran, bu web tarayıcısı resimde değilse, gzip üzerinden deflate kullanabilir miyim anlamına gelir? Örneğin, FTP sunucuma sıkıştırılmış bir dosya yükleyeceğim.
Xegara

1
Bir diğer çok küçük fark, zlib paketinin gzip için altı bayt ve 18 bayt olmasıdır. Bu nedenle, çok küçük paketler için, daha az 12 bayt gönderme avantajı olabilir. Ancak sonuç değişmez, bu da Microsoft'un IIS sunucularında sundukları "deflate" ifadesinin ne anlama geldiğini yanlış yorumlayarak herkes için vidalaması nedeniyle gzip biçimini kullanmak daha kolaydır.
Mark Adler

Ancak, TCP kullanılarak iletilirse yük kapasitesi nasıl kırılabilir? TCP'nin fikri, kesintisiz yükleri iletmektir.
user1095108

Modern tarayıcılar hala sönük algoritmaların yanlış uygulanması sorunundan muzdarip mi ya da şimdi kullanmak güvenli mi? Cevabın bu kısmı hala güncel mi?
ihebiheb

172

GZip basitçe deflate artı bir sağlama toplamı ve üstbilgi / altbilgidir. Zor yoldan öğrendiğim gibi, deflasyon daha hızlıdır .

gzip vs deflate grafiği


13
Zlib'in uzantı için desteği olmadığını ve SSE 4.2'deki CRC32 komutunun polinom 1EDC6F41'i kullandığını ve gzip formatı polinom EDB88320'yi kullanır - tamamen farklı algoritmalar, etkili bir şekilde.
Jack Lloyd

7
Söndürme daha hızlı olduğu için, SO neden gzip kullanıyor?
David Murdoch

40
Bu cevabın yanlış olduğu ortaya çıkıyor ... bkz: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... özellikle müşterinin deflate, başlıksız "yorumlayabileceği" 2 yolu var / checksumless ve zlib üstbilgisiyle. Doğru bir sönük tarayıcılar arasında uygulama kötü. deflate kaçınılmalıdır.
Sam Saffron

4
@sam ek olarak sadece kriterleri yeniden çalıştırdım ve modern bir Intel çipinde gzip 1441/692 alıyorum ve 1286/531'i söndürüyorum. İkinci sayı sıkıştırılmış, ilk önce sıkıştırılmış. Sıkıştırılmalı Yani ise hala daha hızlı, sizin kriterler aksi gösteriyor? (Başka nedenlerle yararlı olmayabileceğini kabul ediyorum, ancak cevap doğru , söndürme daha hızlı ..)
Jeff Atwood

6
@JeffAtwood ama soru daha hızlı değildi?
Ken

16

Büyük olasılıkla deflate'i bir seçenek olarak seçemezsiniz. Beklediğinizin aksine mod_deflate deflate değil gzip kullanıyor. Bu nedenle, verilen noktaların çoğu geçerli olsa da, çoğu için geçerli değildir.


4

Bence deflate ve gzip arasında büyük bir fark yok, çünkü gzip temelde sadece deflate etrafına sarılmış bir başlıktır (bkz. RFC 1951 ve 1952).


3

Bunun ana nedeni, deflate'in kodlanmasını gzip'ten daha hızlı ve fark yaratabilecek meşgul bir sunucuda olmasıdır. Statik sayfalarda bu farklı bir sorudur, çünkü bunlar bir kez kolayca önceden sıkıştırılabilir.


muhtemelen gzip ile tüm verileri elde edene, depolayana ve sıkıştırıncaya kadar başlığı iletmeye başlayamazsınız ? (çünkü başlığı oluşturmak için sağlama toplamına ihtiyacınız vardır)
OJW

8
Gzip biçiminde, sağlama toplamı dosyanın sonuna gelir, özellikle her şeyi bekletmek zorunda kalmadan işlenirken deflate blokları yazmaya başlayabilir.
Jack Lloyd

2

mod_deflate sunucunuzda daha az kaynak gerektirir, ancak sıkıştırma miktarı açısından küçük bir ceza ödeyebilirsiniz.

Çok sayıda küçük dosyaya hizmet veriyorsanız, sıkıştırılmış ve sıkıştırılmamış çözümlerinizi kıyaslama ve yük testi öneriyorum - sıkıştırmayı etkinleştirmenin tasarrufla sonuçlanmadığı bazı durumlar bulabilirsiniz.


Merak eden herkes için, deflate ile metin dosyaları 30KB'den 10KB'ye gider - bu nedenle herhangi bir tasarruf elde etmek için dosyalar bundan daha küçük olmalıdır. Ben 1KB veya benzeri bir şey daha az tahmin ediyorum.
hextech

0

Dekompresyon için gzip & deflate'te herhangi bir fark olmamalıdır. Gzip, bir sağlama toplamı da dahil olmak üzere etrafına sarılmış birkaç düzine bayt başlığıyla söndürülür. Sağlama toplamı daha yavaş sıkıştırmanın nedenidir. Ancak, milyonlarca dosyayı önceden sıkıştırdığınızda, bu sağlama toplamlarını dosya sisteminizde bir sağlık kontrolü olarak kullanmak istersiniz. Buna ek olarak, dosyadaki istatistikleri almak için komut satırı araçlarını kullanabilirsiniz. Sitemiz için bir ton statik veriyi sıkıştırıyoruz (tüm açık dizin, 13.000 oyun, milyonlarca anahtar kelime için otomatik tamamlama, vb.) Ve Alexa tarafından tüm web sitelerinden% 95 daha hızlı sıralanıyoruz. Faks Arama. Ancak, evde yetiştirilen özel bir web sunucusu kullanıyoruz. Apache / mod_deflate kesmedi. Bu dosyalar dosya sistemine sıkıştırıldığında, yalnızca minimum dosya sistemi blok boyutuyla dosyanız için bir hit yapmakla kalmaz, aynı zamanda web sunucusunun daha az önem verebileceği dosya sistemindeki dosyayı yönetmede tüm gereksiz yükü de alırsınız. Endişeleriniz toplam disk alanı ve erişim / açma süresi ve bu verileri önceden sıkıştırmak için ikincil hız olmalıdır. Ayak izi önemlidir, çünkü disk alanı ucuz olsa da, önbelleğe mümkün olduğunca sığmasını istersiniz.


GZip muhtemelen dekompresyonun kontrol toplamını kontrol eder, dolayısıyla dekompresyon için hız farkı.
Seun Osewa

-1

Apache2 ve deflate modülünün kurulu olduğu Ubuntu'da (varsayılan olarak) deflate gzip sıkıştırmasını iki kolay adımda etkinleştirebilirsiniz :

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

Ve sen uzaktasın! Adsl bağlantım üzerinden sunduğum sayfaları çok daha hızlı yükledim.

Düzenleme: @ GertvandenBerg'in yorumuna göre, bu gzip sıkıştırma, deflate değil sağlar.


6
Bunun dışında gzip'i etkinleştirir, çünkü mod_deflate kafa karıştırıcı olarak sadece gzip sıkıştırmasını uygular ...
Gert van den Berg

@GertvandenBerg cevabımı güncelledik ama kayıt için gzip olan sadece ekstra başlıkları ve bir sağlama toplamı ile, Söndür
aidan

@aiden yep ama sağlama toplamının bir performans etkisi var ... (ve ham deflate standart uyumlu değil)
Gert van den Berg

-4

Eğer doğru hatırlıyorsam

  • gzip sönükten biraz daha fazla sıkıştırır
  • deflate daha verimli

2
gzip bir başlık ile söndürülür. Ve HTTP 1.1 deflate aslında zlib (aynı zamanda deflate etrafında bir sarıcıdır)
David Murdoch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.