Esvazie a compatibilidade do navegador de compressão e vantagens sobre GZIP

91

ATUALIZAÇÃO em 10 de fevereiro de 2012:

zOompf concluiu algumas pesquisas muito completas sobre este mesmo tópico aqui . Ele supera qualquer descoberta abaixo.


ATUALIZAÇÃO 11 de setembro de 2010:

Uma plataforma de teste foi criada para isso aqui




Definições HTTP 1.1 de GZIP e DEFLATE (zlib) para algumas informações básicas:

"'Gzip' é o formato gzip e 'deflate' é o formato zlib . Eles provavelmente deveriam ter chamado o segundo de 'zlib' para evitar confusão com o formato de dados compactados de deflate bruto. Enquanto o HTTP 1.1 RFC 2616 aponta corretamente para a especificação zlib no RFC 1950 para a codificação de transferência 'deflate', houve relatos de servidores e navegadores que produzem incorretamente ou esperam dados deflate brutos de acordo com a especificação deflate no RFC 1951, mais notavelmente produtos da Microsoft . Portanto, embora o 'deflate' codificação de transferência usando o formato zlib seria a abordagem mais eficiente ( e de fato exatamente para o que o formato zlib foi projetado), usar a codificação de transferência 'gzip' é provavelmente mais confiável devido a uma escolha infeliz de nome por parte dos autores do HTTP 1.1. "(fonte: http://www.gzip.org/zlib/zlib_faq.html )

Então, minha pergunta: se eu enviar dados de deflate RAW SEM wrapper zlib (ou gzip, nesse caso), existem navegadores modernos (por exemplo, IE6 e superior, FF, Chrome, Safari, etc) que NÃO conseguem entender o deflate bruto dados compactados (assumindo que o cabeçalho de solicitação HTTP "Aceitar-Codificação" contém "deflate")?

Os dados de esvaziamento SEMPRE serão alguns bytes menores do que GZIP.

Se todos esses navegadores puderem decodificar os dados com sucesso, quais são as desvantagens de enviar RAW deflate em vez de zlib?



ATUALIZAÇÃO 11 de setembro de 2010:

Uma plataforma de teste foi criada para isso aqui

David Murdoch
fonte
1
Você se importaria de explicar por que System.IO.Compression.DeflateStream é uma droga em comparação com zlib.net? O Google não está me mostrando muito que seja relevante, exceto uma pessoa mencionando que "não tem uma taxa de compressão particularmente boa".
Joel Mueller
Certo, a taxa de compactação dos métodos gzip e deflate de .net não parece estar nem perto do que deveria ser. No entanto, não fiz nenhum benchmark de velocidade entre os dois (zlib.net vs. .net nativo).
David Murdoch,
Por que você simplesmente não registra os resultados do seu caso de teste?
Gumbo
1
Eu tenho pesquisado na biblioteca System.IO.Compression e parece usar uma árvore estática / predefinida - portanto, a compactação não é otimizada para o fluxo específico. Deve ser o método mais rápido, mas definitivamente resultará em taxas de compressão baixas.
Brady Moritz
2
@JoelMueller Isso pode explicar: virtualdub.org/blog/pivot/entry.php?id=335
Nayuki

Respostas:

37

ATUALIZAÇÃO: os navegadores estão deixando de oferecer suporte para o deflate bruto. zOompf concluiu algumas pesquisas muito completas sobre este mesmo tópico aqui .Infelizmente, parece que o esvaziamento bruto NÃO é seguro para uso.


Verifica http://www.vervestudios.co/projects/compression-tests/results para obter mais resultados.

Aqui estão os navegadores que foram testados:

/*  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 Envia o cabeçalho da solicitação HTTP "Accept-Encoding: gzip". Esvaziar não é permitido.


Concluo que sempre podemos enviar DEFLATE bruto (quando o cabeçalho da solicitação HTTP "Accept-Encoding" contém "deflate") e o navegador será capaz de interpretar corretamente os dados codificados. Alguém pode provar que isso está errado?

observação: a implementação nativa do .NET de DEFLATE (System.IO.Compression.DeflateStream) é DEFLATE bruto. Também é uma merda. Use zlib.net para todas as suas necessidades de deflação .NET.

David Murdoch
fonte
1
Você pode ser mais específico sobre o uso de zlib.net para esvaziar? Como isso corresponde ao gráfico acima, onde diz que o esvaziamento bruto funciona, mas o zlib não em alguns casos de IE do XP?
David Eison
O Android suporta compactação deflate desde a API 9. consulte: developer.android.com/reference/java/util/zip/… para obter mais informações
Stuart Blackler
1
@DavidMurdoch o único resultado lógico de seus testes parece nunca usar deflate , vervestudios.co/projects/compression-tests/results Acho que esta resposta deve ser editada para refletir que
Sam Saffron
Sim, eu concordo. Atualizando agora.
David Murdoch
6

O navegador Android 1.6 (v4) falha nos testes zlib e deflate em sua página. Eu adicionei à sua lista.

Josef Pfleger
fonte
Obrigado! Qual codificação de conteúdo o navegador do Android envia?
David Murdoch,
Ele envia 'Aceitar Codificação: gzip'.
Josef Pfleger
1

Não é o caso que AddOutputFilterByType DEFLATEusar mod_deflate envia por gzip por padrão?

Paul irlandês
fonte
1
Ei, Paul, parece que estou falando com uma celebridade ... você está em toda parte. :-) De qualquer forma, AddOutputFilertByType DEFLATEgzips a resposta ao invés de esvaziá-la por padrão (até onde eu sei). Gzipé deflate+ um cabeçalho de 10 bytes + rodapé de 8 bytes - o que significa que GzipSEMPRE será maior que deflate... então por que devemos usar o gzip? (veja en.wikipedia.org/wiki/Gzip#File_format para uma análise da composição do gzip). Com isso dito, não tenho certeza de como definir deflatecomo o método de compactação preferido no Apache.
David Murdoch de
-1

pelo que eu sei, sim - praticamente você "sempre pode enviar DEFLATE bruto e tudo ficaria bem" ... não há "sempre", mas acima de todos os casos. caso contrário, esse é o problema do navegador.

Letterman
fonte
Estou tentando encontrar os casos em que o esvaziamento bruto falha. De acordo com as especificações, deve falhar em todos os navegadores.
David Murdoch,
Raw deflate(ou seja, não zlib , sem cabeçalhos) só funcionará no IE7 se encoding:gzipe (testado apenas no chrome v24) encoding:deflateno chrome .
Scotty.NET