DEV Community

Cover image for Como funciona o encoding no protocolo HTTP?
wrongbyte
wrongbyte

Posted on

8 3

Como funciona o encoding no protocolo HTTP?

... ou: o que acontece com os bytes das requisições HTTP quando você se comunica com alguns servidores?

Antes, um pouco de contexto...

Quando temos um arquivo grande e precisamos mandá-lo para alguém, o que vem na nossa cabeça de imediato é “zipar” este arquivo.

Quando zipamos, isto é, comprimimos um arquivo, o que estamos fazendo na realidade (de forma simplificada, é claro) é aplicar um algoritmo de compressão nos seus bytes. O que esses algoritmos fazem é diminuir a redundância da sequência de bytes que compõe o arquivo, utilizando de referências como ponteiros onde ocorrem sequências que já se repetem.

Mas qual a relação entre esses algoritmos e o protocolo HTTP?

Imagine que você deseja fazer um GET request para um site, por exemplo para http://example.org.
No seu browser, você vai ver a seguinte página, interpretada pelo seu browser:
Site normal

Contudo, o que você de fato recebe do servidor é uma enorme stream contendo o código-fonte da página, após as headers:
Código fonte do site

Logo transferir o conteúdo de páginas contendo uma quantidade extensa de dados torna-se pouco efetivo, tanto para o cliente quanto para o servidor. A partir disso, podemos então "zipar" a resposta que recebemos. Ao fazer isso, diminuímos o tamanho da resposta, que vem comprimida, e assim aumentamos a eficiência da comunicação.

Como isso ocorre?

Normalmente, a resposta é comprimida utilizando-se do algoritmo gzip, mas isso vai depender do servidor.
Antes da aplicação efetiva do algoritmo de compressão, ocorre a chamada "negociação" entre o browser e o servidor: o browser envia a header accept-encoding com o algoritmo suportado (exemplo: Accept-Encoding: gzip) e o server responde com a header content-encoding com o algoritmo escolhido.
Negociação HTTTP
Obs: nesse caso, usamos a header Vary para armazenar em cache os diferentes valores para o encoding.

Dessa forma, as headers Accept-Encoding e Content-Encoding vão definir o algoritmo de compressão escolhido para diminuir o tamanho dos arquivos sendo transferidos na comunicação. Isso é de extrema importância para tornar o uso da conexão mais eficiente.

Mas é possível otimizar ainda mais a comunicação através do uso de outra header: Transfer-Encoding

Quando recebemos a resposta do servidor, recebemos o que é chamado de "payload". Isso é a resposta que pode ser, como já vimos acima, uma página HTML por exemplo.
payload

Definition of payload : The "actual data" in a packet or file minus all headers attached for transport and minus all descriptive meta-data. In a network packet, headers are appended to the payload for transport and then discarded at their destination.

Contudo, é possível "dividir" esse payload, e isso ocorre quando utilizamos da header transfer-encoding. Quando essa header não é utilizada, o payload body e message body são iguais.

Exemplo da resposta vista antes, porém com transfer-encoding:
chunked response

Ou seja, as respostas com transfer-encoding seguem a seguinte estrutura:
estrutura
Isso divide as informações recebidas em chunks, ou seja, "pedaços" de dados. Isso, além de ajudar a diminuir a carga da comunicação, ajuda o servidor a manter uma conexão mesmo para conteúdos gerados dinamicamente.
Em muitos servidores, é comum ocorrer a combinação de Content-Encoding: gzip + Transfer-Encoding: chunked, por tornarem a comunicação mais eficiente.

Image of AssemblyAI

Automatic Speech Recognition with AssemblyAI

Experience near-human accuracy, low-latency performance, and advanced Speech AI capabilities with AssemblyAI's Speech-to-Text API. Sign up today and get $50 in API credit. No credit card required.

Try the API

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay