Você digita um endereço, aperta Enter e espera a página aparecer. Quando o JavaScript da aplicação começa a rodar, o navegador já tomou várias decisões: o que solicitar, se precisa acessar a rede e como chegar ao servidor com segurança.
Esse trabalho ajuda a explicar por que uma página parece lenta antes de renderizar o primeiro componente, ou por que uma pessoa vê a versão nova do site enquanto outra continua vendo a de ontem.
Este artigo abre a série Browser e Web Platform com o caminho entre uma URL e uma resposta HTTP. Vamos acompanhar a busca de um documento HTML, relacionando DNS, TLS, HTTP, cache e CDN às demoras que você pode investigar no DevTools. A transformação desse HTML em pixels fica para o próximo artigo.
O navegador não repete todos os passos a cada visita. Respostas em cache, conexões existentes e trabalho antecipado podem encurtar o caminho.
Uma navegação por dentro
A barra aceita endereços e pesquisas. Aqui, a entrada é uma URL HTTPS explícita, mesmo sem visita anterior. O navegador identifica esquema, host e caminho; o fragmento fica no cliente.
Uma resposta fresca atende à navegação sem rede no cenário de cache local. Nos demais cenários, não há uma resposta local aproveitável e precisamos buscar o documento.
Sem um endereço em cache, o resolvedor consulta raiz · .com · autoritativo e devolve os endereços IP. Aqui, eles apontam para a CDN.
Cliente e borda estabelecem uma conexão TCP. Este exemplo usa HTTP/2 sobre TLS e TCP; HTTP/3 usa QUIC, com TLS integrado, sobre UDP.
Na negociação completa, o navegador verifica o certificado e o nome do servidor. Os dois lados estabelecem chaves para proteger o tráfego. HTTPS é HTTP protegido por TLS.
Dentro da conexão segura, o navegador envia a requisição do documento. Estes são dois dos pseudocabeçalhos usados pelo HTTP/2.
A borda verifica seu próprio cache. Um hit pode atender ao pedido aqui; um miss leva a requisição ao servidor de origem.
A origem produz a resposta, lendo um arquivo ou executando a aplicação. Pode consultar banco de dados e outros serviços. A conexão entre CDN e origem é separada da conexão do navegador.
Status, cabeçalhos e corpo chegam ao navegador. A chegada dos primeiros bytes encerra o TTFB; o download do corpo continua. Regras de cache orientam a reutilização futura.
O HTML pode ser interpretado enquanto chega, disparando requisições de CSS, JavaScript e imagens. A renderização se sobrepõe à rede. Esse é o ponto de partida do próximo artigo.
Antes da rede: endereço ou pesquisa?
A barra de endereços também é um campo de busca. Ao digitar um texto e apertar Enter, você pode estar escolhendo um endereço, uma sugestão do histórico ou uma pesquisa. O navegador interpreta a entrada; as regras e sugestões variam entre navegadores e configurações. Não é preciso já ter visitado um site para que seu endereço seja reconhecido.
Uma entrada como “como funciona DNS” normalmente vira uma busca no mecanismo configurado. Nesse caso, o navegador navega para a URL de pesquisa desse serviço. Já um endereço explícito como https://example.com/products?id=123#reviews indica uma navegação para esse host. Se você omitir o esquema, o navegador precisa defini-lo, conforme suas políticas e configurações.
Vamos seguir esse endereço HTTPS como se não houvesse resposta HTTP armazenada, conexão aberta ou informações DNS aproveitáveis. É um cenário didático de partida do zero: na prática, mesmo sua primeira visita pode aproveitar o cache de um resolvedor compartilhado ou de uma CDN. O computador já tem conectividade com a rede; configurar Wi-Fi e obter essa conectividade ficam fora do percurso.
O que o endereço diz ao navegador
Definido o destino, o navegador interpreta as partes da URL. Explore o exemplo:
HTTPS indica HTTP protegido por TLS. O navegador precisa de uma conexão segura para acessar este endereço.
O servidor decide como interpretar o caminho e os parâmetros; eles não precisam corresponder a um arquivo em disco. Já o fragmento fica no navegador: pode orientar a rolagem até um elemento ou ser usado pela aplicação, mas não é enviado no destino da requisição HTTP.
Para uma URL HTTPS, o navegador também determina a origem a partir do esquema, do nome do host e da porta. Neste caso, a origem é https://example.com, com a porta padrão 443. Escrever essa porta explicitamente resulta na mesma origem; trocar HTTPS por HTTP, usar um subdomínio ou escolher a porta 8443 resulta em outra.
Essa distinção importa porque a segurança do navegador usa origens como fronteiras. A política de mesma origem, por exemplo, restringe como um script pode acessar recursos de outra origem. Dois endereços podem pertencer à mesma empresa e ainda assim ter origens diferentes.
Esta navegação precisa da rede?
O navegador pode já ter uma resposta aproveitável no cache HTTP. Dependendo das regras de cache, ele pode reutilizá-la imediatamente ou perguntar ao servidor se a versão armazenada continua atual. No segundo caso, o cache economiza o download, mas ainda exige uma ida à rede.
Um service worker acrescenta outra possibilidade. Se o site tiver um service worker ativo cujo escopo abranja essa navegação, seu código pode tratar a requisição e responder com conteúdo armazenado, acessar a rede ou combinar as duas estratégias. Em uma primeira visita de fato, esse worker ainda não estará instalado para atender à navegação inicial.
Service workers costumam usar a Cache API para armazenar pares de requisição e resposta. Esse armazenamento é separado do cache HTTP: o código da aplicação gerencia suas entradas, e elas não expiram automaticamente conforme os cabeçalhos de cache HTTP. Essa diferença ajuda a investigar sites que continuam exibindo conteúdo antigo mesmo depois de uma mudança nas configurações de cache HTTP.
Existe também o back-forward cache, ou bfcache. Ele pode preservar uma página inteira, incluindo o estado do JavaScript, para restaurá-la quando você volta ou avança no histórico. Sua função é diferente da de um cache de respostas, e ele não é o mecanismo usado em uma navegação comum para um novo endereço digitado na barra.
Daqui em diante, vamos considerar que o navegador precisa buscar o documento pela rede.
Encontrando um servidor com DNS
Para abrir uma nova conexão com example.com, o navegador precisa de um endereço IP. O DNS, sigla de Domain Name System, fornece registros que podem levar a um ou mais endereços IPv4 ou IPv6.
A resposta pode estar no cache do navegador, do sistema operacional ou de um resolvedor recursivo. Esse resolvedor é o serviço que faz consultas DNS em nome do cliente. Dependendo da configuração, o navegador pode acessá-lo por meio do sistema operacional ou diretamente, por exemplo usando DNS sobre HTTPS.
Sem as informações em cache, o resolvedor consulta a hierarquia do DNS a partir dos servidores raiz cujos endereços já conhece pela sua configuração. Veja quem participa de cada troca:
O navegador conversa com o resolvedor. O resolvedor consulta os outros servidores até encontrar o endereço.
O navegador pede ao resolvedor o IP de example.com. O resolvedor faz as consultas seguintes em nome do navegador.
Se o nome não existir ou a resolução falhar, o navegador não terá um endereço para essa conexão e poderá exibir um erro. Com os endereços em mãos, pode tentar uma conexão. O destino também pode ser uma CDN, em vez da máquina que executa a aplicação.
O DNS ganha relevância quando uma página depende de muitos hosts externos. Fontes, ferramentas de analytics, imagens e widgets podem exigir novas conexões. Uma indicação de DNS-prefetch permite pedir ao navegador que resolva um nome antecipadamente; uma de preconnect também pode preparar a conexão. Elas ajudam em requisições futuras durante o carregamento, mas não têm efeito retroativo sobre a navegação que trouxe o HTML em que foram declaradas.
Abrindo uma conexão segura
Se já houver uma conexão adequada, o navegador pode reutilizá-la. Caso contrário, precisa abrir uma. Os passos dependem da versão do HTTP.
Para HTTPS com HTTP/1.1 ou HTTP/2, o navegador abre uma conexão TCP, normalmente por uma negociação em três etapas: o cliente envia SYN, o servidor responde com SYN/ACK e o cliente confirma o recebimento. O TCP oferece entrega confiável e ordenada de bytes.
Em seguida, o TLS protege essa conexão. Em uma negociação completa típica, o navegador verifica se o certificado do servidor corresponde ao nome solicitado e se sua cadeia de certificados é confiável. Cliente e servidor estabelecem chaves criptográficas para proteger o tráfego e detectar alterações. A autenticação por certificado permite verificar com quem o navegador está se comunicando; só criptografar os dados não comprovaria essa identidade.
O HTTP/3 segue outro caminho. Ele funciona sobre QUIC, que usa UDP e integra o TLS 1.3 ao estabelecimento da conexão. O QUIC fornece os fluxos confiáveis de que o HTTP precisa, portanto o uso de UDP não torna a entrega do HTTP/3 não confiável.
O custo prático está na latência: abrir uma conexão exige trocas pela rede antes que a resposta possa chegar. Reutilizá-la evita repetir essa preparação, e HTTP/2 e HTTP/3 permitem conduzir várias trocas de requisição e resposta simultaneamente na mesma conexão.
Pedindo o documento
Com uma conexão disponível, o navegador pode solicitar nossa página. Uma requisição HTTP/1.1 abreviada seria assim:
GET /products?id=123 HTTP/1.1
Host: example.com
Accept: text/html
Accept-Language: pt-BR
Accept-Encoding: gzip, br
A primeira linha solicita o recurso usando GET. Repare que o caminho e os parâmetros estão presentes, mas #reviews ficou de fora.
Os cabeçalhos detalham a requisição. Accept indica os tipos de mídia aceitos, Accept-Language informa preferências de idioma e Accept-Encoding anuncia os formatos de compressão suportados. O navegador também pode incluir cookies quando seus atributos e as políticas do navegador permitem.
HTTP/2 e HTTP/3 usam uma estrutura binária e pseudocabeçalhos como :method e :path no lugar dessa primeira linha textual. O significado da requisição HTTP permanece o mesmo.
O destino pode responder com um redirecionamento e um cabeçalho Location. Nesse caso, o navegador segue a nova URL, possivelmente fazendo outra consulta DNS ou abrindo outra conexão. Mesmo quando reutiliza a conexão, o redirecionamento acrescenta uma requisição antes da chegada do documento final.
De onde vem a resposta
Nossa requisição saiu do navegador, mas pode ser atendida antes de chegar à aplicação. Muitos sites colocam uma rede de distribuição de conteúdo, ou CDN, à frente dos seus servidores. A requisição chega a um servidor de borda, idealmente próximo do usuário em termos de rede. Se ele puder servir uma resposta em cache, não precisará buscar o documento no servidor de origem.
O cache da CDN fica na infraestrutura do site, separado do cache local do navegador. No exemplo, cache hit significa que a borda tem uma resposta que pode reutilizar; cache miss, que precisa buscá-la na origem. Compare os dois caminhos:
Aqui, servidor de origem significa o servidor responsável pelo conteúdo por trás da CDN. É um uso diferente de “origem” daquele conceito de segurança do navegador que vimos antes.
Quando a borda precisa buscar uma resposta, o servidor de origem pode ler um arquivo, renderizar HTML, consultar um banco de dados ou chamar outro serviço. Tudo isso pode contribuir para a espera. Arquivos estáticos são candidatos comuns ao cache da CDN; o HTML também pode ser armazenado quando seus requisitos de personalização e atualização permitem.
É nesse ponto que o tempo até o primeiro byte, ou TTFB, ajuda. Para uma navegação, ele mede a espera desde seu início até a chegada dos primeiros bytes da resposta. Esse intervalo pode incluir redirecionamentos, DNS, abertura da conexão e trabalho no servidor. Ele não isola o tempo de processamento da aplicação.
Um TTFB alto indica onde investigar. Sozinho, não revela se a causa é um servidor distante, uma resposta ausente no cache ou uma consulta lenta ao banco de dados.
Lendo a resposta
A resposta traz um código de status, cabeçalhos e, quando aplicável, um corpo. Na nossa página, o corpo é HTML. Estes são alguns cabeçalhos possíveis, representados no formato HTTP/1.1:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
ETag: "products-v42"
Content-Encoding: br
O status indica que a requisição foi bem-sucedida. Content-Type identifica HTML codificado em UTF-8. Content-Encoding informa que o corpo transferido usa compressão Brotli, que o navegador desfaz antes de interpretar o HTML.
Os campos de cache orientam uma próxima visita. no-cache permite armazenar a resposta, mas exige validá-la antes de reutilizá-la; no-store instrui os caches a não armazená-la. O ETag é um validador. Em uma requisição posterior, o navegador pode enviá-lo no cabeçalho If-None-Match. Se a representação não mudou, uma resposta 304 Not Modified permite reutilizar o corpo armazenado sem baixá-lo novamente.
Outros cabeçalhos afetam a página além desse download. Set-Cookie pede ao navegador que armazene um cookie, sujeito às suas políticas. Content-Security-Policy pode restringir quais scripts e outros recursos a página pode carregar. Essas instruções ajudam a entender por que receber o HTML com sucesso não garante que tudo na página funcionará.
O navegador pode começar a interpretar o HTML enquanto ele chega. Não precisa esperar a resposta inteira para descobrir folhas de estilo, scripts e imagens e iniciar suas requisições. Download e renderização, portanto, se sobrepõem: o navegador pode trabalhar na página enquanto mais partes do documento ainda estão chegando.
Acompanhando o caminho no DevTools
Para observar o processo no Chrome, abra o DevTools antes de navegar e selecione o painel Network. Ative Preserve log se quiser manter os redirecionamentos visíveis entre navegações. Depois, carregue a página e selecione a requisição do documento principal.
Comece por três lugares:
- Headers mostra a URL, o status e os cabeçalhos da requisição e da resposta. Procure redirecionamentos, o tipo de conteúdo e as instruções de cache.
- Timing separa a requisição em fases como consulta DNS, conexão, espera e download. Fases ausentes podem indicar informações DNS em cache ou reutilização de conexão.
- As colunas Protocol e Size ajudam a identificar a versão do HTTP e se a resposta veio de um cache local. Você pode habilitar Protocol pelo menu dos títulos das colunas.
- DNSEncontrar o IP
- ConexãoTCP + TLS
- EnvioRequest sent
- EsperaWaiting (TTFB)
- DownloadReceber o corpo
Compare uma visita com um recarregamento. Para testar sem o cache HTTP do navegador, marque Disable cache e mantenha o DevTools aberto. Isso não limpa caches DNS, não garante uma conexão nova, não ignora o cache da CDN e não desativa respostas de service workers. Para ignorar um service worker no Chrome, use Application > Service Workers > Bypass for network.
Também é possível consultar os tempos de navegação do documento atual no Console, depois que a página terminar de carregar:
const [navigation] = performance.getEntriesByType("navigation");
if (navigation) {
console.table({
dnsMs: navigation.domainLookupEnd - navigation.domainLookupStart,
connectionMs: navigation.connectEnd - navigation.connectStart,
navigationTtfbMs: navigation.responseStart - navigation.startTime,
requestToFirstByteMs: navigation.responseStart - navigation.requestStart,
downloadMs: navigation.responseEnd - navigation.responseStart,
});
}
Os valores estão em milissegundos. O intervalo de conexão inclui a preparação da conexão segura quando aplicável. O TTFB da navegação abrange mais etapas do que o intervalo entre a requisição e o primeiro byte, então não se deve somar essas linhas. Valores zerados podem indicar etapas dispensadas ou reutilizadas, e restrições de privacidade do navegador podem limitar o detalhamento.
No painel Network, Waiting (TTFB) representa a espera pela resposta depois do envio da requisição. É um intervalo mais restrito que o TTFB da navegação calculado acima. Distinguir esses pontos de partida evita atribuir toda a espera ao processamento do servidor.
Quando você consegue localizar a demora, pode escolher uma correção pertinente: remover um redirecionamento, ajustar uma política de cache ou investigar o servidor. O próximo artigo, Do HTML aos pixels: DOM, CSSOM e a árvore de renderização, acompanha o HTML dentro do navegador: como ele constrói as estruturas do documento e dos estilos, combina essas informações e calcula o layout que prepara a página para a pintura.
Para se aprofundar
- Omnibox do Chromium: a barra que combina navegação, busca e sugestões.
- WHATWG URL Standard: interpretação de URLs e origens.
- Especificação de Service Workers e back-forward cache: interceptação de requisições e restauração de páginas.
- RFC 1034: conceitos e resolução DNS.
- RFC 8446 e RFC 9114: TLS 1.3 e HTTP/3.
- RFC 9110 e RFC 9111: semântica HTTP e cache.
- Referência do painel Network do Chrome e TTFB: inspeção de requisições e interpretação da espera.
- Navigation Timing Level 2: os campos de tempo usados no exemplo.
