Conexões rápidas de Internet via UDP (QUIC) é um protocolo de camada de transporte de uso geral projetado para substituir o Protocolo de Controle de Transmissão (TCP), graças à sua flexibilidade, segurança integrada, menor incidência de problemas de desempenho e adoção mais rápida. Desenvolvido originalmente pelo Google, o QUIC usa o Protocolo de Datagrama de Usuário (UDP) como mecanismo de transporte de baixo nível para transferir pacotes entre cliente e servidor. Vale destacar que o QUIC também incorpora a Segurança da Camada de Transporte (TLS) como um componente integral, e não como uma camada adicional, como ocorre no HTTP/1.1 e no HTTP/2.

O HTTP/3, baseado no QUIC, é a terceira versão principal do Protocolo de Transferência de Hipertexto (HTTP) e foi adotado como um padrão da IETF em 2022. O QUIC e o HTTP/3 foram criados para solucionar limitações inerentes ao TCP que restringem o desempenho e a experiência do usuário.

Como as APIs funcionam?

As APIs são a “face pública” dos aplicativos, revelando as funções que eles desempenham e as informações que podem fornecer, além de definir o formato adequado das solicitações. Quando um desenvolvedor cria e disponibiliza a API de um aplicativo, ele permite que outros aplicativos se comuniquem com esse aplicativo.

Em muitos casos, as APIs poupam um tempo valioso dos desenvolvedores, pois disponibilizam prontamente funções usadas com frequência. Em vez de duplicar a funcionalidade de uma aplicação existente, os desenvolvedores podem integrá-la às suas próprias aplicações fazendo chamadas à API da aplicação existente.

Diagrama HTTP

Visão geral de alto nível das pilhas de transporte HTTP

Noções básicas de QUIC+HTTP/3

O objetivo do QUIC é fornecer um protocolo de transporte de alto desempenho, alta confiabilidade e alta segurança para o HTTP/3 (embora o QUIC também seja adequado para tráfego não HTTP).

Se o QUIC for uma novidade para você, recomendamos assistir ao vídeo introdutório abaixo.

UDP, TCP e TLS

O UDP é um protocolo simples e leve que não precisa de um handshake complexo de três vias, como o TCP, para estabelecer a conexão inicial. Essa simplicidade torna o UDP rápido e sem conexão, mas também significa que ele não conta com recursos essenciais para uma comunicação confiável e segura quando comparado ao TCP.

O QUIC é único porque combina os benefícios dos protocolos UDP e TCP. Embora não seja orientado a conexão e utilize o UDP como protocolo de transporte de baixo nível para reduzir os atrasos de conexão e transporte, ele é orientado a conexão nas camadas superiores devido à reimplementação dos recursos de estabelecimento de conexão e detecção de perdas do TCP, que garantem a entrega dos pacotes. Ele identifica dados perdidos e realiza retransmissões para garantir uma experiência de usuário fluida.

O QUIC também incorpora o TLS como um componente integral, e não como uma camada adicional, como ocorre com o HTTP/1.1 e o HTTP/2. Essa incorporação garante que as mensagens sejam criptografadas por padrão.

Visão geral de uma rede QUIC

O diagrama abaixo mostra a estrutura básica de uma rede QUIC. Como pode ser visto no diagrama, os objetos lógicos que contêm solicitações e respostas HTTP/3 ou quaisquer dados de aplicativos são os fluxos QUIC. Para a transmissão entre endpoints de rede, os fluxos QUIC são encapsulados em várias camadas lógicas.

Diagrama da anatomia de rede do QUIC

Anatomia de um fluxo QUIC

De fora para dentro, as camadas lógicas e os objetos são:

  • Datagrama UDP – Contém um cabeçalho que especifica as portas de origem e destino (além dos dados de comprimento e soma de verificação), seguido por um ou mais pacotes QUIC. O datagrama é a unidade de informação transmitida do cliente para o servidor pela rede.
  • Pacote QUIC – Contém um cabeçalho QUIC e um ou mais quadros QUIC.
  • Cabeçalho QUIC – Contém metadados sobre o pacote. Há dois tipos de cabeçalho:
    • O cabeçalho longo, usado durante o estabelecimento da conexão.
    • O cabeçalho curto, usado após o estabelecimento da conexão. Ele contém, entre outros dados, o ID da conexão, o número do pacote e a fase da chave (usada para identificar quais chaves foram utilizadas para criptografar o pacote, permitindo a rotação de chaves). Os números dos pacotes são únicos (e sempre crescentes) para uma determinada conexão e fase da chave.
  • Quadro – Contém o tipo, o ID do fluxo, o deslocamento e os dados do fluxo. Os dados do fluxo são distribuídos entre vários quadros, mas podem ser reunidos usando o ID da conexão, o ID do fluxo e o deslocamento, que é usado para apresentar os blocos de dados na ordem correta.
  • Stream – Um fluxo de dados unidirecional ou bidirecional em uma única conexão QUIC. Cada conexão QUIC pode comportar vários streams independentes, cada um com seu próprio ID de stream. Se um pacote QUIC contendo alguns streams for perdido, isso não afetará o andamento dos streams que não estejam no pacote perdido (isso é fundamental para evitar o bloqueio de início de fila observado no HTTP/2). Os streams podem ser bidirecionais e criados por qualquer um dos endpoints.

Como o QUIC funciona com um handshake TLS

Um handshake TLS estabelece uma conexão segura entre o cliente e o servidor. A criptografia fornecida pelo QUIC requer TLS v1.3. Como mostra o diagrama abaixo, o QUIC mantém a “Camada de Conteúdo” do TLS, que fornece as chaves criptográficas, mas substitui a “Camada de Registro” por seu próprio mecanismo de transporte.

camadas QUIC e camadas TLS

O QUIC também depende do TLS para autenticação e negociação de parâmetros essenciais à segurança e ao desempenho. Em vez de seguirem uma estrutura rígida de camadas, os dois protocolos trabalham em conjunto: o QUIC usa o handshake do TLS para estabelecer uma conexão segura, enquanto o TLS utiliza a confiabilidade, a entrega ordenada e a camada de registros fornecidas pelo QUIC.

Em linhas gerais, há duas interações principais entre os componentes TLS e QUIC:

  • O componente TLS envia e recebe mensagens por meio do componente QUIC, que fornece ao TLS uma abstração de fluxo confiável.
  • O componente TLS fornece uma série de atualizações ao componente QUIC, incluindo (a) novas chaves de proteção de pacotes a serem instaladas e (b) alterações de estado, como a conclusão do handshake, o certificado do servidor etc.

Opções de suporte a HTTP/3 para QUIC TLS

O QUIC TLS é uma variante do TLS projetada especificamente para o protocolo QUIC. Atualmente, há duas opções para usuários que buscam suporte a HTTP/3 no QUIC TLS:

  • Implementação de QUIC do OpenSSL – Atualmente, o OpenSSL está trabalhando na implementação de uma pilha QUIC completa própria. Esse desenvolvimento incorporará todas as funcionalidades do QUIC à implementação, facilitando muito o uso da API TLS do OpenSSL por usuários de HTTP/3, sem que precisem se preocupar com funcionalidades específicas do QUIC.
  • Bibliotecas compatíveis com a API QUIC do BoringSSL – Várias bibliotecas SSL, como BoringSSL, quicTLS e LibreSSL (que começou como uma bifurcação do OpenSSL), agora oferecem funcionalidade QUIC TLS por meio da implementação da API QUIC do BoringSSL. Atualmente, essa é a única opção para usuários que desejam usar HTTP/3, pois a implementação QUIC TLS do OpenSSL ainda não está pronta.

Vantagens do QUIC+HTTP/3

O QUIC e o HTTP/3 visam melhorar o desempenho das aplicações web, reduzindo a latência e aprimorando a entrega de dados em redes não confiáveis. Entre suas vantagens estão:

  • Latência reduzida – Protocolos tradicionais, como o TCP, apresentam latência devido ao processo de estabelecimento da conexão. Os recursos de multiplexação do QUIC+HTTP/3 permitem estabelecer conexões com mais eficiência, reduzindo a latência no estabelecimento de conexões e na transmissão de dados.
  • Estabelecimento de conexão mais rápido – O QUIC+HTTP/3 combina o handshake TLS e a configuração da criptografia em uma única etapa, reduzindo o número de idas e voltas necessárias para estabelecer uma conexão segura.
  • Multiplexação – Ao processar vários fluxos de dados em uma única conexão, o QUIC+HTTP/3 permite usar os recursos de rede com mais eficiência e ajuda a evitar o problema de bloqueio de início de fila, no qual um fluxo lento pode atrasar os demais em conexões TCP tradicionais.
  • Correção de erros aprimorada – O QUIC incorpora técnicas de correção antecipada de erros, que podem ajudar a recuperar pacotes perdidos sem a necessidade de retransmissões, reduzindo o impacto da perda de pacotes no desempenho.
  • Impacto reduzido da perda de pacotes – O UDP não utiliza conexão e permite uma transmissão mais rápida sem a necessidade da rigorosa verificação de erros do TCP. Isso é particularmente vantajoso em cenários nos quais as condições da rede são menos estáveis.
  • Controle de congestionamento adaptativo – O QUIC e o HTTP/3 foram projetados para serem mais eficientes e responsivos do que o controle de congestionamento do TCP, proporcionando melhor desempenho em diferentes ambientes de rede.
  • Suporte à migração – QUIC+HTTP/3 podem alternar perfeitamente entre diferentes conexões de rede (por exemplo, de Wi-Fi para rede celular) sem prejudicar o desempenho do aplicativo.
  • Segurança aprimorada – QUIC+HTTP/3 integram criptografia por padrão, aumentando a segurança e a privacidade na transmissão de dados. Essa criptografia impede a interceptação e a adulteração dos dados em trânsito.
  • Travessia de NAT – o uso de UDP pelo QUIC+HTTP/3 pode ajudar na travessia de Tradução de Endereços de Rede (NAT), facilitando o estabelecimento de conexões em cenários nos quais as conexões TCP tradicionais poderiam enfrentar problemas.
  • Evolução constante – Como o QUIC+HTTP/3 foram projetados para serem implementados e atualizados por software, sem exigir alterações na infraestrutura de rede subjacente, eles podem ser atualizados e aprimorados com mais rapidez para se adaptar às mudanças nas condições da rede e às preocupações de segurança.