Навіщо використовувати deflate замість gzip для текстових файлів, що обслуговуються Apache?


215

Які переваги пропонує будь-який метод для файлів html, css та javascript, що обслуговуються сервером LAMP. Чи є кращі альтернативи?

Сервер надає інформацію додатку для карти за допомогою Json, тому великий обсяг невеликих файлів.

Дивіться також: Чи є якийсь ударний показник, пов'язаний із вибором gzip over deflate для стиснення http?


змінив прийняті відповіді ... поточний консенсус - два на один на користь gzip
Кен

1
mod_deflate призначений для Apache 2, mod_gzip - для Apache 1.3.
SPRBRN

Відповіді:


315

Навіщо використовувати deflate замість gzip для текстових файлів, що обслуговуються Apache?

Проста відповідь - ні .


RFC 2616 визначає дефляцію як:

дефляція Формат "zlib", визначений у RFC 1950, у поєднанні з механізмом стиснення "deflate", описаним у RFC 1951

Формат zlib визначений в RFC 1950 як:

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

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

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

Отже, кілька заголовків та контрольна сума ADLER32

RFC 2616 визначає gzip як:

gzip Формат кодування, створений програмою стиснення файлів "gzip" (GNU zip), як описано в RFC 1952 [25]. Цей формат являє собою кодування Lempel-Ziv (LZ77) з 32-бітовою CRC.

RFC 1952 визначає стислі дані як:

В даний час формат використовує метод DEFLATE стиснення, але його можна легко розширити для використання інших методів стиснення.

CRC-32 повільніше, ніж ADLER32

Порівняно з циклічною перевіркою надмірності однакової довжини, вона торгує надійністю швидкості (віддаючи перевагу останній).

Отже ... у нас є 2 механізми стиснення, які використовують один і той же алгоритм для стиснення, але інший алгоритм для заголовків і контрольної суми.

Тепер основні пакети TCP вже досить надійні , тому проблема тут не в Adler 32 vs CRC-32, яку використовує GZIP.


Виявляється, багато браузерів протягом багатьох років реалізували неправильний алгоритм спуску. Замість того, щоб очікувати заголовка zlib в RFC 1950, вони просто очікували стисненого корисного навантаження. Так само різні веб-сервери допустили ту саму помилку.

Отже, з роками браузери почали впроваджувати нечітку логічну дефляцію, вони намагаються заголовок zlib і контрольну суму Адлера, якщо це не вдається, вони намагаються отримати корисне навантаження.

Результатом такої складної логіки є те, що вона часто порушується. У Verve Studio є тестовий розділ, який бачив користувач, який показує, наскільки погана ситуація.

Наприклад: дефляція працює в Safari 4.0, але вона порушена в Safari 5.1, вона також завжди має проблеми в IE.


Таким чином, найкраще зробити це взагалі уникати спуску, незначний приріст швидкості (за рахунок Адлера 32) не варто ризикувати зламаними корисними навантаженнями.


Чи не повинен бути новий стандарт, який поєднує adler32 з gzip?
Pacerier

1
@Sam Saffron, це означає, що якщо веб-браузер відсутній на зображенні, я можу використовувати дефляцію над gzip? Наприклад, якщо я збираюся завантажити стислий файл на свій FTP-сервер.
Xegara

1
Ще одна незначна відмінність полягає в тому, що обгортка zlib становить шість байт проти 18 байт за gzip. Тому для дуже маленьких пакетів може бути перевага в надсиланні на 12 менших байтів. Висновок, однак, не змінюється. Це полягає в тому, що завдяки тому, що Microsoft скасовує це для всіх, неправильно трактуючи, що означає "дефляція" в тому, що вони отримували на своїх серверах IIS, простіше просто використовувати формат gzip.
Марк Адлер

Але як може бути зламана корисна навантаження, якщо вона передається за допомогою TCP? Вся ідея TCP полягає в передачі неперервних корисних навантажень.
користувач1095108

Ця відповідь датується 2012 р. Тож чи сучасні браузери все ще страждають від проблеми неправильної реалізації алгоритмів дефляції чи безпечно це використовувати зараз? Чи залишається ця частина відповіді актуальною?
ihebiheb

172

GZip - просто спущений плюс контрольна сума та заголовок / колонтитул. Дефляція швидше , хоча я навчився важкому шляху.

gzip vs графік спуску


13
Не кажучи вже про те, що zlib не підтримує розширення, і навіть якщо це було, інструкція CRC32 в SSE 4.2 використовує поліном 1EDC6F41, а формат gzip ефективно використовує поліном EDB88320 - абсолютно різні алгоритми.
Джек Ллойд

7
А оскільки дефляція швидша, чому ТАК використовує gzip?
Девід Мердок

40
Ну, ця відповідь виявляється невірною ... див.: Zoompf.com/blog/2012/02/lose-the-wait-http-compression ... зокрема клієнт має два способи "інтерпретувати" дефляцію, безголовні / контрольна сума та із заголовком zlib. Реалізація правильного дефляту в браузерах погана. слід уникати дефляції.
Сам Шафран

4
@sam додатково я просто перекомпонував орієнтири і на сучасному мікросхемі Intel отримую gzip 1441/692 і знижую 1286/531. Друге число - декомпресія, перше - стиснення. Тож дефляція все ще швидша, чи показують ваші орієнтири інакше? (Я згоден, це може бути не корисно з інших причин, але відповідь правильна , дефляція швидша ..)
Джефф Етвуд

6
@JeffAtwood, але питання було не швидше?
Кен

16

Ви, ймовірно, не можете фактично вибрати дефляцію як варіант. На відміну від того, що ви можете очікувати, mod_deflate не використовує deflate, а gzip. Тож, хоча більшість викладених балів є дійсними, це, мабуть, не стосується більшості.


4

Я думаю, що між дефлятом та gzip немає великої різниці, оскільки gzip в основному є лише заголовком, обгорнутим дефлятом (див. RFC 1951 та 1952).


3

Основна причина полягає в тому, що дефляцію швидше кодувати, ніж gzip, і на зайнятому сервері, що може змінити ситуацію. Зі статичними сторінками це вже інше питання, оскільки їх легко можна попередньо стиснути один раз.


мабуть, за допомогою gzip ви не можете розпочати передачу заголовка, поки не отримаєте, зберігаєте та стискаєте всі дані? (тому що вам потрібна контрольна сума для створення заголовка)
OJW

8
У форматі gzip контрольна сума надходить у кінці файлу, зокрема, можна починати записувати блоковані блоки при їх обробці, не затримуючи все.
Джек Ллойд

2

mod_deflate вимагає менше ресурсів на вашому сервері, хоча ви можете заплатити невелику пеню за розмір стиснення.

Якщо ви обслуговуєте багато невеликих файлів, я рекомендую тестування та завантаження тестування своїх стислих та нестиснених рішень - ви можете виявити деякі випадки, коли включення стиснення не призведе до економії.


Тому, хто цікавиться, мої текстові файли спущені від 30 КБ до 10 КБ - тому файли повинні бути навіть меншими, ніж щоб не отримати економії. Я здогадуюсь менше 1 КБ або щось подібне.
hextech

0

Не повинно бути різниці в gzip & deflate для декомпресії. Gzip просто знищений, загорнутий навколо нього кілька десятків байт-заголовка, включаючи контрольну суму. Контрольна сума є причиною більш повільного стиснення. Однак, коли ви попередньо стискаєте мільйони файлів, ви хочете, щоб ці контрольні суми були перевіреними у вашій файловій системі. Крім того, ви можете використовувати інструменти командного рядка, щоб отримати статистику у файлі. Для нашого сайту ми попередньо стискаємо тону статичних даних (весь відкритий каталог, 13000 ігор, автозаповнення мільйонів ключових слів тощо), і ми займаємо 95% швидше, ніж усі веб-сайти Alexa. Пошук факсів. Однак ми використовуємо власницький власний веб-сервер. Apache / mod_deflate просто не вирізав. Коли ці файли стискаються у файловій системі, ви не лише вдаритесь по файлу з мінімальним розміром блоку файлової системи, але й усіма непотрібними накладними витратами на управління файлом у файловій системі, про який веб-сервер міг би менше піклуватися. Вашими проблемами повинні бути повний слід диска, час доступу / декомпресії та, в першу чергу, швидкість можливості попереднього стиснення цих даних. Слід важливий, оскільки, хоча дисковий простір дешевий, ви хочете якомога більше вмістити в кеш.


GZip, ймовірно, перевіряє контрольну суму на декомпресію, отже, різниця швидкостей для декомпресії.
Seun Osewa

-1

В Ubuntu з Apache2 і викачати модуль вже встановлено (яка за замовчуванням), ви можете включити викачати стиснення GZIP в два простих кроки:

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

І ти геть! Я знайшов сторінки, які я розміщував над моїм рекламним з'єднанням, завантажуючись набагато швидше.

Редагувати: Відповідно до коментаря @ GertvandenBerg, це дозволяє стиснути gzip, а не дефлювати.


6
За винятком того, що це дозволяє gzip, оскільки mod_deflate незрозуміло реалізує лише стиснення gzip ...
Герт ван ден Берг

@GertvandenBerg Я оновив свою відповідь, але для запису, gzip - знижений, просто із додатковими заголовками та контрольною сумою
допоміжною

@aiden yep, але контрольна сума має вплив на продуктивність ... (а сирий дефлят не відповідає стандартам)
Герт ван ден Берг

-4

якщо я правильно пам’ятаю

  • gzip стисне трохи більше, ніж дефляція
  • дефляція є більш ефективною

2
gzip - дефляція із заголовком. А дефлят HTTP 1.1 насправді zlib (який також є обгорткою навколо дефляту)
Девід Мердок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.