Camada Zero · 19 · HTTP/1.1 vs 2 vs 3

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.
Conexões abertas
Tempo de load (unid.)
Streams travados por HoL
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.
baixando concluído travado (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ãoTransporteChave
HTTP/1.1TCP1 req por vez, ~6 conexões
HTTP/2TCPmultiplexing + HPACK
HTTP/3QUIC/UDPstreams 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.