# HTTP/3

HTTP/3 é a terceira e a próxima versão principal do Protocolo de Transferência de Hipertexto usado para trocar informações na World Wide Web, junto com HTTP/1.1 e HTTP/2.
A semântica HTTP é consistente em todas as versões: os mesmos métodos de solicitação, códigos de estado e campos de mensagem são normalmente aplicáveis a todas as versões. As diferenças estão no mapeamento dessas semânticas para transportes subjacentes. HTTP/1.1 e HTTP/2 usam o TCP como o transporte deles. O HTTP/3 usa o QUIC, um protocolo de rede da camada de transporte que usa o controle de congestionamento no espaço de usuário sobre o User Datagram Protocol (UDP). A mudança para o QUIC visa corrigir um grande problema do HTTP/2 chamado "bloqueio de cabeça de fila": como a natureza paralela da multiplexação do HTTP/2 não é visível aos mecanismos de recuperação de perda do TCP, um pacote perdido ou reordenado faz com que todas as transações ativas sejam paralisadas, independentemente de qual transação ter sido impactada pelo pacote perdido. Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas os fluxos onde os dados foram perdidos.
Em junho de 2021, o protocolo HTTP/3 ainda é oficialmente um Internet Draft, mas já é suportado por 71% dos navegadores web ativos e, de acordo com a W3Techs, 19,6% dos 10 milhões de sites principais. Tem sido suportado pelo Google Chrome (incluindo Chrome para Android e Microsoft Edge, que é baseado nele) desde abril de 2020 e pelo Mozilla Firefox desde maio de 2021. Safari 14 (no macOS Big Sur) também implementou o protocolo, mas o suporte está escondido por trás de um sinalizador de recurso.

## História

HTTP/3 é um Internet Draft adotado pelo QUIC working group. A proposta original foi denominada "HTTP/2 Semantics Using The QUIC Transport Protocol", e posteriormente denominada "Hypertext Transfer Protocol (HTTP) over QUIC".
Em 28 de outubro de 2018, em discussão numa lista de correio, Mark Nottingham, presidente dos Working Groups do HTTP e do QUIC do IETF, propôs renomear HTTP-sobre-QUIC para HTTP/3 para "identificá-lo claramente como outra ligação da semântica HTTP para o protocolo de ligação ... para que as pessoas entendam sua separação do QUIC". A proposta de Nottingham foi aceita por outros membros da IETF alguns dias depois. O HTTP working group é autorizado a auxiliar o QUIC working group durante o projeto do HTTP/3 e, em seguida, assumir a responsabilidade pela manutenção após a publicação.
O suporte ao HTTP/3 foi adicionado ao Chrome (versão Canary) em setembro de 2019 e finalmente chegou nas versões estáveis, mas foi desabilitado por um sinalizador de recurso. Ele foi ativado por padrão em abril de 2020. O Firefox adicionou suporte para HTTP/3 em novembro de 2019 por meio de um sinalizador de recurso e ele foi habilitado por padrão em abril de 2021 no Firefox 88. O suporte experimental para HTTP/3 foi adicionado ao Safari Technology Preview em 8 de abril de 2020 e foi programado para ser lançado oficialmente com o Safari 14 que vem com o macOS 11, mas ele ainda está desabilitado por padrão.

## Implementações
### Cliente
#### Navegador

Suporte de navegador para o HTTP/3 :
| Navegador | Versão implementada (desabilitado por padrão) | Versão implementada (desabilitado por padrão) | Versão lançada (habilitado por padrão) | Versão lançada (habilitado por padrão) |
| Chrome | Estável (79) | Dezembro de 2019 | 87 | Abril de 2020 |
| Firefox | Estável (72.0.1) | Janeiro de 2020 | 88 | Abril de 2021 |
| Safari | Safari Technology Preview 104 | Abril de 2020 | | |
| Edge | | | 87 | Abril de 2020 |

### Bibliotecas

Bibliotecas de código aberto que implementam lógica de cliente ou servidor para QUIC e HTTP/3 incluem
Suporte de biblioteca para o HTTP/3 :
| Nome | Cliente | Servidor | Linguagem de programação | Organização | Repositório |
| http | Sim | Sim | Rust | | https://github.com/hyperium/http |
| quiche | Sim | Sim | Rust | Cloudflare | https://github.com/cloudflare/quiche |
| neqo | Sim | Sim | Rust | Mozilla | https://github.com/mozilla/neqo |
| quinn | Sim | Sim | Rust | | https://github.com/quinn-rs/quinn |
| proxygen | Não | Sim | C++ | Facebook | https://github.com/facebook/proxygen#quic-and-http3 |
| Cronet | Sim | Sim | C++ | Google | https://github.com/chromium/chromium/tree/master/net/quic |
| lsquic | Sim | Sim | C | LiteSpeed | https://github.com/litespeedtech/lsquic |
| nghttp3 | Sim | Sim | C | | https://github.com/ngtcp2/nghttp3 |
| h2o | Não | Sim | C | | https://github.com/h2o/h2o |
| libcurl | Sim | Não | C | | https://github.com/curl/curl |
| MsQuic | Sim | Sim | C | Microsoft | https://github.com/microsoft/msquic |
| Quic.NET | Sim | Sim | C# | | https://github.com/Vect0rZ/Quic.NET |
| Flupke | Sim | Não | Java | | https://bitbucket.org/pjtr/flupke |
| aioquic | Sim | Sim | Python | | https://github.com/aiortc/aioquic |
| quic-go | Sim | Sim | Go | | https://github.com/lucas-clemente/quic-go |
| http3 | Sim | Sim | Haskell | | https://github.com/kazu-yamamoto/http3 |

### Servidor

* O Litespeed Web Server suporta HTTP/3 draft 32.
* O suporte do nginx para o HTTP/3 está sendo desenvolvido. Uma prévia da tecnologia do nginx com suporte a HTTP/3 foi lançada em junho de 2020.
* A Cloudflare distribui um patch para nginx que integra a biblioteca HTTP/3 quiche nele.
* O servidor web Caddy tem suporte experimental para o HTTP/3 a partir de 2.0 beta 17.
Existem várias bibliotecas que implementam um rascunho mais antigo do protocolo ou as versões do Google do QUIC(por exemplo, Q046 usado no Chrome 76), como nghttp3.