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.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

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