Uma página de 14 kB pode carregar muito mais rápido do que uma página de 15 kB (2022)
(endtimes.dev)- Manter o tamanho do site em até 14 kB pode reduzir muito o tempo de carregamento em comparação com 15 kB
- Esse fenômeno ocorre por causa do algoritmo de slow start do TCP, e a diferença de velocidade percebida aparece por causa do limite da quantidade de dados na primeira transmissão
- 14 kB correspondem à capacidade dos 10 pacotes TCP que a maioria dos servidores envia inicialmente
- Em ambientes de alta latência, como internet via satélite, uma volta adicional de ida e volta (RTT) pode causar mais de 612 ms de atraso
- Na prática, colocar o conteúdo principal abaixo de 14 kB ou posicionar recursos críticos dentro dos primeiros 14 kB é eficaz para otimizar a performance web
Visão geral e princípios principais
- É um fato bem conhecido que, quanto menor o tamanho de um site, mais rápido ele carrega
- Mas o fato de que, ao passar de 14 kB para 15 kB, surge uma diferença drástica na velocidade da primeira resposta é algo menos intuitivo
- A diferença de velocidade entre uma página de 15 kB e uma de 16 kB é pequena, mas entre 14 kB e 15 kB pode haver uma diferença de até 612 ms
O que é TCP
- Transmission Control Protocol (TCP) funciona sobre o IP (Internet Protocol) e é responsável por garantir a confiabilidade dos pacotes
- Ao fazer uma requisição HTTP, o navegador envia vários pacotes TCP
- Se usasse apenas IP, não haveria como confirmar se os pacotes chegaram, então o TCP fornece a função de confirmação de recebimento de pacotes (ACK)
- O servidor envia primeiro uma pequena quantidade de pacotes e, ao receber um ACK do navegador, transmite mais pacotes
- Se não houver ACK, entra em ação o procedimento de retransmissão de pacotes
O que é o slow start do TCP
- O slow start do TCP é um algoritmo em que o servidor aumenta gradualmente a quantidade de pacotes enviados para descobrir a qualidade da conexão de rede (largura de banda)
- No início da conexão, o servidor envia apenas uma pequena quantidade de pacotes, normalmente 10
- Se o computador do visitante enviar o ACK corretamente, a quantidade de pacotes transmitidos dobra
- Se houver perda de ACK, depois disso os pacotes passam a ser enviados em velocidade mais lenta
- O algoritmo real varia em detalhes conforme a implementação, mas o conceito é o mesmo
Base para o limite de 14 kB
- Na maioria dos servidores, o slow start envia de uma vez 10 pacotes TCP
- O tamanho máximo de um pacote TCP é 1500 bytes, mas, excluindo o cabeçalho (40 bytes), sobram 1460 bytes de dados úteis
- Portanto, 10 x 1460 = 14600 bytes (cerca de 14 kB) é o limite da primeira transmissão
- Se o site ou os recursos importantes ficarem abaixo de 14 kB (com compressão, isso pode significar dezenas de kB no dado original), eles podem ser exibidos sem atraso adicional de ida e volta no início
Quanto atraso uma única ida e volta pode causar
Exemplo de internet via satélite
- Um exemplo representativo de ambiente de alta latência é o usuário de internet via satélite (plataformas de perfuração de petróleo, navios de cruzeiro etc.)
- Ao solicitar a página inicial no celular, o trajeto roteador → antena satelital → satélite no espaço → estação terrestre → servidor consome dezenas a centenas de ms em cada trecho
- A ida e volta total da transmissão inclui dois trajetos espaciais de ida e volta, deslocamento pelos trechos de rede e processamento no servidor, resultando em cerca de 612 ms de atraso adicional
- Ao usar HTTPS, isso pode aumentar para 1836 ms por causa do handshake adicional
Latência em redes terrestres
- Mesmo em redes móveis como 2G e 3G, a latência pode chegar a 100~1000 ms
- Em situações de congestionamento, sobrecarga do servidor, perda de pacotes e outros cenários, atrasos adicionais também podem surgir
Estratégias de otimização de sites com a regra dos 14 kB
- O ponto principal é tornar o site ou página o menor possível
- O ideal é projetar cada página para que o volume comprimido transmitido fique em até 14 kB
- Com compressão, o conteúdo real pode chegar a ~50 kB
- Isso costuma ser perfeitamente viável ao reduzir vídeos em autoplay, pop-ups, rastreadores e JS/CSS desnecessários, entre outros elementos supérfluos
- Se for difícil implementar a página inteira em 14 kB, é importante priorizar, nos primeiros 14 kB, os recursos críticos e o conteúdo principal (CSS, JS, texto principal etc.)
- Cabeçalhos HTTP (não comprimíveis) e imagens (carregando só o mínimo necessário/a parte visível ou usando placeholders) também entram nesses 14 kB
Exceções da regra dos 14 kB e questões dos protocolos mais novos
- A regra dos 14 kB não é um exagero, mas há algumas exceções
- Alguns servidores ampliam a janela inicial para 30 pacotes
- O handshake TLS pode permitir uma janela maior
- O número de pacotes transmissíveis por rota pode ser armazenado em cache, permitindo enviar mais na conexão seguinte
- Mesmo no HTTP/2, a prática de o servidor começar com 10 pacotes por causa do slow start do TCP em geral não muda
- Em HTTP/3 e QUIC, a regra dos 14 kB também é oficialmente recomendada
Resumo e materiais de referência
- Os fundamentos técnicos e materiais adicionais de explicação podem ser conferidos em cada link
- Publicação inicial: 2022-08-25, última revisão: 2022-08-26, autor: Nathaniel, tags relacionadas: performance web, HTTP, TCP
Links de referência
- Estrutura de frame Ethernet e cabeçalho TCP, materiais adicionais sobre latência e largura de banda, especificações de TCP/QUIC etc.
1 comentários
Comentários do Hacker News
Desenvolvedores de software precisam prestar mais atenção à camada de mídia, especialmente aos pontos que o autor destacou sobre confiabilidade e latência em 3G/5G. No rádio, quase sempre há retransmissão, e na maioria das comunicações HTTP os pacotes precisam chegar em ordem para a UI ser atualizada. Na prática, até uma única requisição REST só cabe de fato em um único pacote quando requisição e resposta têm menos de 1400 bytes. Acima disso, essa requisição “única” na verdade é dividida em vários pacotes. Se qualquer um deles tiver problema, a tela só será atualizada corretamente quando todos chegarem em ordem. Se quiser testar, ative o modo 3G e perda de pacotes nas ferramentas de desenvolvedor do Chrome; você verá que até uma pequena otimização já melhora bastante a responsividade da UI. Por isso faz muito sentido manter API e UI o menores possível
Minha homepage transfere 7,0 kB comprimidos
A meta de 14 kB é um pouco agressiva, mas a ideia de limitar à janela inicial de 10 pacotes também é interessante. Há um projeto focado em tamanho de site como o meu, o 512kb.club. É um lugar que compara tamanhos de sites como se fossem placares de golfe. Meu site(anderegg.ca) deu 71 kB somando todos os recursos antes do cadastro. Graças a esse projeto descobri também o Cloudflare Radar, que tem uma boa ferramenta para análise de sites e medição de tamanho de página. O foco principal é um dashboard da internet como um todo, mas ele também inclui uma ferramenta de análise de tamanho de página
Se quiser experimentar isso de forma mais divertida, o tamanho da janela inicial (IW) pode ser configurado no lado do servidor. Por exemplo, dá para ajustar assim
O que foi explicado no texto abaixo também se aplica: Blog da Cloudflare - o fenômeno em que ISPs russos passaram a permitir só até 16 KB, tornando a maior parte da navegação impossível. Segundo a análise da Cloudflare, ISPs da Rússia estão limitando a internet de usuários locais para que apenas os primeiros 16 KB de cada recurso web sejam carregados
A interseção entre quem não sabe o que é TCP Slow Start e quem se importa o bastante com atraso no carregamento de sites para pensar nisso em detalhe é muito pequena. Startup tem que focar primeiro em ser startup, e só empresas grandes têm folga para ficar obcecadas com esse tipo de otimização
Minha homepage tem 17,2 KB! (sem contar dependências) Otimizei muito minha página pessoal e consegui até nota máxima 100 no Lighthouse. Antes eu achava que era impossível, mas consegui. E, para referência, foi feita em Rails. Esse tipo de otimização realmente vale a pena. A sensação de uma página aparecer como um relâmpago, sem parecer travada, é muito satisfatória por si só
Acho que o texto tem duas fraquezas lógicas
A geração atual tende a fazer até site estático simples com frameworks como Next.js. Dá uma certa tristeza ver a era de HTML+CSS+js desaparecendo
Além da latência, minimizar consumo de recursos é condição essencial para um futuro sustentável. O impacto ambiental da rede também está longe de ser pequeno. É uma pena que o tom dos comentários pareça meio sarcástico. Talvez essa otimização não seja a solução definitiva, mas eu gostaria que o efeito de redução de consumo de energia fosse mais enfatizado