Совместимость браузера со сжатием Deflate и преимущества перед GZIP

91

ОБНОВЛЕНИЕ 10 февраля 2012 г .:

zOompf завершил некоторые очень тщательные исследования по этой самой теме здесь . Это превосходит любые выводы, приведенные ниже.


ОБНОВЛЕНИЕ 11 сентября 2010 г .:

Испытательная платформа была создана для этого здесь




Определения HTTP 1.1 для GZIP и DEFLATE (zlib) для некоторой справочной информации:

«'Gzip' - это формат gzip, а 'deflate' - это формат zlib . Вероятно, они должны были назвать второй формат 'zlib' вместо этого, чтобы избежать путаницы с необработанным форматом сжатых данных deflate. Хотя HTTP 1.1 RFC 2616 правильно указывает на спецификация zlib в RFC 1950 для кодирования передачи 'deflate', были сообщения о серверах и браузерах, которые неправильно производят или ожидают необработанные данные deflate в соответствии со спецификацией deflate в RFC 1951, в первую очередь продукты Microsoft . Так что даже несмотря на то, что 'deflate' кодирование передачи с использованием формата zlib было бы более эффективным подходом ( и фактически именно для того, для чего был разработан формат zlib), использование кодировки передачи 'gzip', вероятно, более надежно из-за неудачного выбора имени со стороны авторов HTTP 1.1 »(источник: http://www.gzip.org/zlib/zlib_faq.html )

Итак, мой вопрос: если я отправлю данные RAW deflate без оболочки zlib (или gzip, если на то пошло), есть ли какие-либо современные браузеры (например, IE6 и выше, FF, Chrome, Safari и т.д.), которые НЕ могут понять исходное deflate сжатые данные (при условии, что заголовок HTTP-запроса «Accept-Encoding» содержит «deflate»)?

Данные Deflate ВСЕГДА будут на несколько байтов меньше, чем GZIP.

Если все эти браузеры могут успешно декодировать данные, каковы недостатки отправки RAW deflate вместо zlib?



ОБНОВЛЕНИЕ 11 сентября 2010 г .:

Испытательная платформа была создана для этого здесь

Дэвид Мердок
источник
1
Не могли бы вы подробнее рассказать, почему System.IO.Compression.DeflateStream отстой по сравнению с zlib.net? Google не показывает мне ничего важного, кроме одного человека, который упомянул, что у него «не очень хорошая степень сжатия».
Джоэл Мюллер
Правильно, степень сжатия для методов gzip и deflate .net, похоже, далеко не такая, какой должна быть. Однако я не проводил никаких тестов скорости между ними (zlib.net и родной .net).
Дэвид Мердок
Почему бы вам просто не записать результаты своего тестового примера?
Gumbo,
1
Я ковырялся в библиотеке System.IO.Compression, и, похоже, он использует статическое / предварительно определенное дерево, поэтому сжатие не оптимизировано для конкретного потока. Это должен быть самый быстрый метод, но он определенно приведет к плохой степени сжатия.
Брэди Мориц,
2
@JoelMueller Это может объяснить: virtualdub.org/blog/pivot/entry.php?id=335
Наюки

Ответы:

37

ОБНОВЛЕНИЕ: браузеры перестали поддерживать raw deflate. zOompf завершил некоторые очень тщательные исследования по этой самой теме здесь . К сожалению, использование raw deflate НЕ безопасно.


Посетите http://www.vervestudios.co/projects/compression-tests/results для получения дополнительных результатов.

Вот протестированные браузеры:

/*  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 отправляет заголовок HTTP-запроса «Accept-Encoding: gzip». Сдутие не допускается.


Я прихожу к выводу, что мы всегда можем отправить необработанный DEFLATE (когда заголовок HTTP-запроса «Accept-Encoding» содержит «deflate»), и браузер сможет правильно интерпретировать закодированные данные. Кто-нибудь может доказать, что это не так?

примечание: собственная реализация DEFLATE (System.IO.Compression.DeflateStream) .NET является необработанной DEFLATE. Это тоже отстой. Пожалуйста, используйте zlib.net для всех ваших нужд по дефляции .NET.

Дэвид Мердок
источник
1
Не могли бы вы подробнее рассказать об использовании zlib.net для дефляции? Как это соответствует приведенной выше таблице, где говорится, что raw deflate работает, но zlib не работает в некоторых случаях XP IE?
Дэвид Эйсон
Android поддерживает сжатие deflate, начиная с API 9. см .: developer.android.com/reference/java/util/zip/… для получения дополнительной информации
Стюарт Блэклер,
1
@DavidMurdoch, единственный разумный результат ваших тестов, похоже, никогда не использует deflate , vervestudios.co/projects/compression-tests/results Я думаю, что этот ответ следует отредактировать, чтобы отразить это
Сэм Саффрон
Ага, согласен. Обновляю сейчас.
Дэвид Мердок
6

Браузер Android 1.6 (v4) не проходит ни тест zlib, ни тест deflate на вашей странице. Я добавил это в ваш список.

Йозеф Пфлегер
источник
Благодарность! Какое кодирование содержимого отправляет браузер Android?
Дэвид Мердок,
Он отправляет «Accept-Encoding: gzip».
Йозеф Пфлегер,
1

Разве это не тот случай, когда AddOutputFilterByType DEFLATEиспользование mod_deflate по умолчанию отправляется с помощью gzip?

Пол Айриш
источник
1
Привет, Пол, я чувствую себя так, будто разговариваю со знаменитостью ... ты везде. :-) В любом случае, AddOutputFilertByType DEFLATEответ сжимается , а не сдувается по умолчанию (насколько я знаю). Gzipэто deflate+ 10-байтовый заголовок + 8-байтовый нижний колонтитул - это означает, что Gzipон ВСЕГДА будет больше, чем deflate... так зачем нам использовать gzip? (см. en.wikipedia.org/wiki/Gzip#File_format, из чего состоит gzip). С учетом сказанного, я не уверен, как сделать установку deflateпредпочтительным методом сжатия в Apache.
Дэвид Мердок
-1

Насколько я знаю, да - в большинстве случаев вы «всегда можете отправить необработанный DEFLATE, и все будет в порядке» ... нет «всегда», но в большинстве случаев. в противном случае проблема в браузере.

Леттерман
источник
Я пытаюсь найти случаи, когда не удается выполнить прямую дефляцию. Согласно спецификации, он не должен работать во всех браузерах.
Дэвид Мердок
Raw deflate(т.е. не zlib , без заголовков) будет работать только в IE7, если encoding:gzipи (проверено только в chrome v24) encoding:deflateв chrome .
Scotty.NET