Po co używać deflate zamiast gzip dla plików tekstowych obsługiwanych przez Apache?


215

Jakie zalety oferuje jedna z metod w przypadku plików HTML, CSS i javascript obsługiwanych przez serwer LAMP. Czy są lepsze alternatywy?

Serwer dostarcza informacje do aplikacji mapującej za pomocą Jsona, a więc dużej ilości małych plików.

Zobacz także Czy jest jakiś spadek wydajności związany z wyborem gzip zamiast deflacji do kompresji http?


zamieniono zaakceptowane odpowiedzi ... obecny konsensus jest dwa do jednego na korzyść gzip
Ken

1
mod_deflate dotyczy Apache 2, mod_gzip dotyczy Apache 1.3.
SPRBRN

Odpowiedzi:


315

Po co używać deflate zamiast gzip dla plików tekstowych obsługiwanych przez Apache?

Prosta odpowiedź brzmi : nie .


RFC 2616 definiuje deflację jako:

deflate Format „zlib” zdefiniowany w RFC 1950 w połączeniu z mechanizmem kompresji „deflate” opisanym w RFC 1951

Format zlib jest zdefiniowany w RFC 1950 jako:

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

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

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

Kilka nagłówków i suma kontrolna ADLER32

RFC 2616 definiuje gzip jako:

gzip Format kodowania stworzony przez program do kompresji plików „gzip” (GNU zip), jak opisano w RFC 1952 [25]. Ten format to kodowanie Lempel-Ziv (LZ77) z 32-bitowym CRC.

RFC 1952 definiuje skompresowane dane jako:

Format używa obecnie metody kompresji DEFLATE, ale można ją łatwo rozszerzyć, aby używała innych metod kompresji.

CRC-32 jest wolniejszy niż ADLER32

W porównaniu do cyklicznej kontroli redundancji o tej samej długości, zamienia niezawodność na szybkość (preferując tę ​​drugą).

Więc ... mamy 2 mechanizmy kompresji, które używają tego samego algorytmu do kompresji, ale inny algorytm dla nagłówków i sumy kontrolnej.

Teraz bazowe pakiety TCP są już dość niezawodne , więc problemem nie jest Adler 32 vs. CRC-32, którego używa GZIP.


Okazuje się, że wiele przeglądarek na przestrzeni lat zastosowało nieprawidłowy algorytm deflacji. Zamiast oczekiwać nagłówka zlib w RFC 1950, po prostu oczekiwali skompresowanego ładunku. Podobnie różne serwery internetowe popełniły ten sam błąd.

Tak więc, z biegiem lat przeglądarki zaczęły implementować rozmytą implementację deflacji logicznej , próbują uzyskać nagłówek zlib i sumę kontrolną adlera, jeśli to się nie powiedzie, próbują załadować.

Rezultatem takiej złożonej logiki jest to, że często się psuje. Verve Studio ma sekcję testową napisaną przez użytkownika, która pokazuje, jak zła jest sytuacja.

Na przykład: deflate działa w Safari 4.0, ale jest uszkodzone w Safari 5.1, zawsze ma problemy z IE.


Najlepszym rozwiązaniem jest całkowite spuszczenie powietrza, niewielkie zwiększenie prędkości (z powodu Adlera 32) nie jest warte ryzyka zepsutych ładunków.


Czy nie powinien istnieć nowy standard, który łączy adler32 z gzip?
Pacerier

1
@Sam Saffron, czy to oznacza, że ​​jeśli przeglądarki nie ma na obrazku, mogę użyć deflate nad gzip? Na przykład, jeśli mam przesłać skompresowany plik na mój serwer FTP.
Xegara,

1
Inną bardzo niewielką różnicą jest to, że opakowanie zlib ma sześć bajtów w porównaniu do 18 bajtów dla gzip. Dlatego w przypadku bardzo małych pakietów wysyłanie o 12 mniej bajtów może być korzystne. Wniosek nie zmienia się jednak, ponieważ Microsoft spieprzył go wszystkim, błędnie interpretując, co oznacza „deflacja” w tym, co dostarczali na swoich serwerach IIS, łatwiej jest po prostu użyć formatu gzip.
Mark Adler

Ale w jaki sposób ładunek może zostać uszkodzony, jeśli jest przesyłany za pomocą TCP? Cała idea TCP polega na przesyłaniu nieprzerwanych ładunków.
user1095108,

Ta odpowiedź pochodzi z 2012 r. Czy zatem współczesne przeglądarki nadal cierpią z powodu nieprawidłowej implementacji algorytmów deflacji lub czy można z niej bezpiecznie korzystać? Czy ta część odpowiedzi jest wciąż aktualna?
ihebiheb

172

GZip to po prostu deflacja plus suma kontrolna i nagłówek / stopka. Deflate jest jednak szybsze , ponieważ nauczyłem się na własnej skórze.

gzip vs deflate graph


13
Nie wspominając o tym, że zlib nie ma wsparcia dla rozszerzenia, a nawet jeśli tak, instrukcja CRC32 w SSE 4.2 używa wielomianu 1EDC6F41, a format gzip wykorzystuje wielomian EDB88320 - zupełnie inne algorytmy, skutecznie.
Jack Lloyd,

7
A ponieważ deflacja jest szybsza, dlaczego SO używa gzip?
David Murdoch,

40
Cóż, odpowiedź ta okazuje się być nieprawidłowe ... zobacz: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... w szczególności klient posiada 2 sposoby mogą „interpretować” deflate, bez nagłówków / bez sumy kontrolnej iz nagłówkiem zlib. Wdrożenie prawidłowej deflacji we wszystkich przeglądarkach jest złe. należy unikać spuszczania powietrza.
Sam Saffron

4
@sam dodatkowo ponownie uruchomiłem testy i na nowoczesnym układzie Intela otrzymuję gzip 1441/692 i spuszczam powietrze z wersji 1286/531. Druga liczba to dekompresja, pierwsza to kompresja. Deflate jest więc jeszcze szybszy, czy twoje testy porównawcze pokazują inaczej? (Zgadzam się, że może to nie być przydatne z innych powodów, ale odpowiedź jest prawidłowa , deflacja jest szybsza ..)
Jeff Atwood

6
@JeffAtwood, ale pytanie nie było szybsze?
Ken

16

Prawdopodobnie nie jesteś w stanie wybrać opcji deflacji jako opcji. Wbrew oczekiwaniom mod_deflate nie używa deflacji, ale gzip. Tak więc, chociaż większość z podanych punktów jest poprawna, prawdopodobnie nie ma to znaczenia dla większości.


4

Myślę, że nie ma dużej różnicy między deflate a gzip, ponieważ gzip to po prostu nagłówek owinięty wokół deflate (patrz RFC 1951 i 1952).


3

Głównym powodem jest szybsze kodowanie deflacji niż gzip na zajętym serwerze, co może mieć znaczenie. W przypadku stron statycznych jest to inne pytanie, ponieważ można je łatwo skompresować raz.


prawdopodobnie przy pomocy gzip nie możesz rozpocząć przesyłania nagłówka, dopóki nie uzyskasz, nie zapiszesz i nie skompresujesz wszystkich danych? (ponieważ potrzebujesz sumy kontrolnej, aby utworzyć nagłówek)
OJW

8
W formacie gzip suma kontrolna znajduje się na końcu pliku, szczególnie po to, aby można było pisać bloki deflate podczas ich przetwarzania bez konieczności zatrzymywania wszystkiego.
Jack Lloyd,

2

mod_deflate wymaga mniej zasobów na twoim serwerze, chociaż możesz zapłacić niewielką karę za ilość kompresji.

Jeśli udostępniasz wiele małych plików, zalecam testy porównawcze i testowanie obciążenia skompresowanych i nieskompresowanych rozwiązań - możesz znaleźć przypadki, w których włączenie kompresji nie przyniesie oszczędności.


Dla każdego, kto się zastanawia, z deflacją moje pliki tekstowe zwiększają się z 30 KB do 10 KB - więc pliki muszą być jeszcze mniejsze, aby nie uzyskać żadnych oszczędności. Zgaduję, że mniej niż 1 KB lub coś podobnego.
hextech,

0

Nie powinno być żadnej różnicy w gzip i deflate do dekompresji. Gzip jest po prostu opróżniany z kilkadziesiąt nagłówków bajtów owiniętych wokół niego, łącznie z sumą kontrolną. Suma kontrolna jest przyczyną wolniejszej kompresji. Jednak gdy kompresujesz zilliony plików, chcesz, aby te sumy kontrolne były sprawdzeniem poprawności w twoim systemie plików. Ponadto można użyć narzędzi wiersza polecenia, aby uzyskać statystyki dotyczące pliku. W przypadku naszej witryny wstępnie kompresujemy masę danych statycznych (cały otwarty katalog, 13 000 gier, autouzupełnianie milionów słów kluczowych itp.) I jesteśmy w rankingu 95% szybciej niż wszystkie strony internetowe autorstwa Alexa. Wyszukiwanie faksu. Korzystamy jednak z własnego, zastrzeżonego serwera internetowego. Apache / mod_deflate po prostu tego nie wyciął. Kiedy te pliki są kompresowane do systemu plików, nie tylko trafiasz w plik z minimalnym rozmiarem bloku systemu plików, ale cały niepotrzebny narzut związany z zarządzaniem plikiem w systemie plików, na którym serwer sieciowy mógłby się mniej przejmować. Twoje obawy powinny dotyczyć całkowitego miejsca na dysku i czasu dostępu / dekompresji, a po drugie szybkości w uzyskaniu wstępnego skompresowania tych danych. Ślad jest ważny, ponieważ chociaż miejsce na dysku jest tanie, chcesz jak najwięcej zmieścić się w pamięci podręcznej.


GZip prawdopodobnie sprawdza sumę kontrolną podczas dekompresji, stąd różnica prędkości dla dekompresji.
Seun Osewa,

-1

W systemie Ubuntu z Apache2 i już zainstalowanym modułem deflacji (który jest domyślnie), możesz włączyć kompresję gzip podczas deflacji w dwóch łatwych krokach:

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

I ciebie nie ma! Znalazłem strony wyświetlane przez moje połączenie ADSL ładowane znacznie szybciej.

Edycja: Zgodnie z komentarzem @ GertvandenBerg umożliwia to kompresję gzip, a nie deflację.


6
Tyle że włącza to gzip, ponieważ mod_deflate mylnie implementuje tylko kompresję gzip ...
Gert van den Berg

@GertvandenBerg Zaktualizowałem swoją odpowiedź, ale dla przypomnienia, gzip jest spuszczany, tylko z dodatkowymi nagłówkami i sumą kontrolną
aidan

@aiden tak, ale suma kontrolna ma wpływ na wydajność ... (a surowa deflacja nie jest zgodna ze standardem)
Gert van den Berg

-4

Jeżeli dobrze pamiętam

  • gzip skompresuje trochę więcej niż deflate
  • deflacja jest bardziej wydajna

2
gzip jest deflowany przy pomocy nagłówka. A deflacja HTTP 1.1 jest w rzeczywistości zlib (która jest również opakowaniem do deflacji)
David Murdoch,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.