Toda página que carrega rápido hoje deve isso a três gerações de HTTP brigando com o mesmo inimigo: head-of-line blocking. Roda o mesmo carregamento nas três versões aqui embaixo, liga a perda de pacote, e veja onde cada uma trava.
Escolhe a versão e carrega. Dica: roda HTTP/2 com perda de pacote ligada, depois HTTP/3 com perda ligada, e compara quantos streams travam.
baixandoconcluídotravado (HoL)esperando
As três versões resolvem o mesmo gargalo em camadas diferentes. HTTP/1.1 manda uma request por conexão por vez, então o browser abre ~6 conexões em paralelo como gambiarra. HTTP/2 multiplexa tudo numa conexão TCP só, mas herda o head-of-line blocking do TCP: um pacote perdido segura todos os streams. HTTP/3 troca o TCP pelo QUIC sobre UDP, onde cada stream é independente, então a perda só trava o próprio stream.
No Go é transparente
// net/http já negocia a maior versão suportada (ALPN)
resp, err := http.Get("https://exemplo.com")
// HTTP/2 é automático sobre TLS no servidor padrão.// HTTP/3 (QUIC): pacote quic-go / http3.
srv := &http.Server{Addr: ":443"}
srv.ListenAndServeTLS(cert, key) // h2 ligado por padrão
As três gerações
Versão
Transporte
Chave
HTTP/1.1
TCP
1 req por vez, ~6 conexões
HTTP/2
TCP
multiplexing + HPACK
HTTP/3
QUIC/UDP
streams independentes, handshake rápido
🧠 Desafio — HTTP/1.1 vs 2 vs 3
Roda as três versões aqui de cima, com e sem perda de pacote, antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.