DEV Community

Cover image for HTTP/3: Evolução histórica e diferenças nas versões existentes.
Lucas Gabriel
Lucas Gabriel

Posted on

HTTP/3: Evolução histórica e diferenças nas versões existentes.

Os protocolos HTTP são os mais utilizados quando se fala de desenvolvimento web, troca de informação entre sistemas distintos, todos já utilizamos ou mesmo atuamos com algumas das especificações definidas por estes protocolos. Por exemplo, se você já utilizou em algum momento, com sua framework preferida, fez algo parecido com:

Route::get("/home", [HomeController::class, "home"]);
Enter fullscreen mode Exit fullscreen mode

O código acima usa algumas das especificações semânticas do HTTP, nesse caso o método GET, que foi definido nas primeiras versões do protocolo. Sem contar que a maioria dos frameworks de desenvolvimento web utiliza servidores HTTP.

Antes de apresentar alguma implementação do protocolo, primeiro vamos apresentar as diferenças entre as versões. Vamos focar nos pontos principais para ser fácil identificar as diferenças.

Camada de Transportes: UDP e TCP

Para falar sobre o HTTP, primeiro precisamos entrar no assunto da camada de transportes, a camada do modelo TCP/IP, que fica antes de onde estão os protocolos HTTP. Nessa camada se encontram os protocolos TCP e UDP, a base para a comunicação das camadas superiores.

A imagem acima mostra de forma breve a estrutura de camadas do modelo TCP/IP.

De forma simples, podemos trazer o protocolo TCP como protocolo seguro, ou seja, um protocolo que garante a entrega dos dados de um servidor para um cliente, tanto garante a entrega, quanto garante a integridade dos mesmos. Para isso, o TCP manda mensagens de confirmação de entrega da mensagem e somente envia os dados de forma ordenada.

Em contrapartida, o UDP é conhecido por ser um protocolo mais simples, que não garante a entrega dos dados, nem garante sua integridade. De forma que o foco dele está na eficiência e velocidade. Geralmente indicado em cenários onde a latência importa muito, como em streaming e transmissões ao vivo, já que nesses casos a perda de um pacote não interfere na transmissão.

HTTP/1.0

A primeira versão, definida em 1996, pela RFC 1945, foi o ponto de partida no que tange à comunicação de aplicações e servidores na web. Foi projetado como um protocolo de requisição e resposta baseado em texto, utilizando o protocolo TCP como camada de transporte.

Uma das principais características que esse protocolo tem é que as conexões TCP, abertas, finalizam logo após a resposta ser recebida. O que fazia com que cada informação recuperada do servidor precisasse de uma nova conexão. Além deste ponto, aqui foram criadas algumas das semânticas que usamos, como: GET, POST e HEAD.

Na web dos anos 90, o protocolo era suficiente, porém, conforme foram se evoluindo as estruturas de páginas web, a limitação imposta pelas conexões não persistentes fez necessário melhorias no protocolo.

HTTP/1.1

O HTTP/1.1 foi inicialmente normalizado pela RFC 2616. Esta versão trouxe melhorias significativas quando se trata da comunicação que teve seu início com a versão 1.0, manteve a comunicação via TCP, porém introduziu a manutenção de conexões persistentes, de forma que a mesma conexão poderia requisitar mais de um recurso do servidor.

Foi com este protocolo onde se definiram as semânticas que utilizamos até hoje, como os métodos: PUT, DELETE, OPTIONS, TRACE e CONNECT.

HTTP/2

O protocolo HTTP/2, formalizado pela RFC 7540, representa uma evolução significativa do HTTP/1.1, propondo uma reestruturação completa de sua arquitetura de transferência para enfrentar problemas históricos de desempenho.

Uma das mudanças mais fundamentais no HTTP/2 é a adoção de um formato binário em substituição ao textual utilizado nas versões anteriores. Essa mudança permite uma análise mais rápida e menos sujeita a ambiguidades por parte dos parsers dos navegadores e servidores, além de favorecer a compressão e a otimização do tráfego. Outro ponto relevante é a multiplexação de streams, que, com ela, múltiplas requisições e respostas podem ser enviadas de forma paralela.

Além das melhorias de desempenho, o protocolo adicionou o suporte a server push, para que o servidor pudesse ativamente enviar informações ao cliente, de forma a antecipar requisições.

Apesar das várias evoluções, alguns pontos ainda mantinham o HTTP/2 enraizado nas versões antigas, uma delas, a utilização do protocolo TCP.

HTTP/3

Definido pela RFC 9114, é a terceira geração do protocolo HTTP, projetado para superar limitações herdadas da versão anterior, particularmente aquelas associadas à dependência do protocolo TCP. Para superar estas limitações, o protocolo muda seu protocolo de camada de transporte, do TCP para o UDP, e para que as funcionalidades importantes do TCP sejam mantidas, é criado na camada de aplicação o protocolo QUIC, para que funções de integridade e confiabilidade nas conexões sejam mantidas.

Uma das inovações mais importantes foi o suporte a múltiplos fluxos de dados independentes na mesma conexão, sem interferência mútua. Essa abordagem permite que dados de fluxos distintos sejam entregues fora de ordem, sem aguardar a retransmissão de segmentos perdidos, reduzindo a latência e aumentando a resiliência frente a falhas de rede. Com isso, a perda de pacotes em um fluxo não bloqueia os demais, resolvendo definitivamente o problema do head-of-line blocking no transporte, que para que os pacotes fossem entregues de forma íntegra, o envio deveria ser feito de forma ordenada pelo protocolo TCP e caso um fosse perdido, todos os outros pacotes ficariam esperando este ser retransmitido.

Conclusão

A partir das explicações sobre o protocolo, suas versões e suas diferenças e melhorias, espero que fique claro ou pelo menos mais simples a percepção das diferenças de cada protocolo. Obviamente, este artigo serve apenas como uma introdução simples e direta do tema. Para quem pretende ou gostaria de se aprofundar mais, recomendo muito “perder” algumas horas lendo sobre o tema internet afora.

Top comments (0)