Como funcionam as requisições HTTP

Introdução

Se você já fez uma entrevista, pode ter sido questionado sobre o que acontece quando você digita algo na caixa de pesquisa do Google e pressiona enter.

Essa é uma das perguntas mais populares. O entrevistador só quer saber se você consegue explicar alguns conceitos básicos e se você tem alguma ideia de como a Internet realmente funciona.

Neste post, estudaremos o que acontece quando você digita uma URL na barra de endereços do seu navegador e pressiona enter.

Apesar de ser um conteúdo muito extenso para ser dissecado em apenas um artigo, pois o HTTP é uma tecnologia que raramente é alterada e alimenta um dos ecossistemas mais complexos e amplos já construídos por seres humanos, eu darei o meu melhor nessa explicação.

O protocolo HTTP

Primeiro, eu menciono o HTTP em particular, porque as coisas são diferentes de uma conexão HTTPS.

Analisando somente requisições da URL

Os navegadores modernos tem a capacidade de saber se o que você escreveu na barra de endereço é uma URL real ou um termo de pesquisa, e usam o mecanismo de pesquisa padrão se não for uma URL válida.

Quando você insere o URL e pressiona enter, o navegador primeiro cria a URL completo.

Se você acabou de inserir um domínio, como spotify.com, o navegador por padrão irá adicionar HTTP:// a ele, padronizando com protocolo HTTP.

Pesquisa do DNS

O navegador inicia a pesquisa de DNS para obter o endereço IP do servidor.

O nome de domínio é um atalho útil para nós, meros mortais, mas a Internet está organizada de tal maneira que os computadores podem procurar a localização exata de um servidor através do seu endereço IP, que é um conjunto de números como o 222.324.3.1 (IPv4).

Primeiro, ele verifica o cache local do DNS para ver se o domínio já foi consultado recentemente.

O Chrome possui visualizador de cache do DNS muito útil, que você pode ver em chrome://net-internals/#dns.

Se nada for encontrado lá, o navegador usará o resolvedor de DNS, usando a chamada de sistema gethostbyname para recuperar as informações do host.

gethostbyname

O gethostbyname procura primeiro o arquivo local de hosts, que no macOS ou Linux está localizado em /etc/hosts, para verificar se o sistema fornece as informações localmente.

Se ele não fornecer nenhuma informação sobre o domínio, o sistema fará uma requisição ao servidor DNS.

O endereço do servidor DNS é armazenado nas preferências do sistema.

Esses são os dois servidores DNS mais populares:

  • 8.8.8.8: o servidor DNS público da Google
  • 1.1.1.1: o servidor DNS da CloudFlare

A grande maioria das pessoas usa o servidor DNS fornecido pelo provedor da Internet.

O navegador executa a requisição DNS usando o protocolo UDP.

TCP e UDP são dois dos protocolos fundamentais da rede de computadores. Eles ficam no mesmo nível conceitual, mas o TCP é orientado à conexão, enquanto o UDP é um protocolo sem conexão, mais leve e usado para enviar mensagens com pouca sobrecarga.

Como a requisição UDP é realizada não é o foco deste post

O servidor DNS pode ter o IP do domínio na cache. Caso contrário, ele solicitará ao servidor DNS raiz. Esse é um sistema (composto por 13 servidores reais, distribuídos em todo o planeta) que impulsiona toda a Internet.

O servidor DNS não sabe o endereço de todo domínio do planeta.

O que ele sabe é onde estão os resolvedores de DNS de nível superior.

Um domínio de nível superior é a extensão do domínio: .com, .it, .pizza e assim por diante.

Depois que o servidor DNS raiz recebe a requisição, ele a encaminha para o servidor DNS de domínio de nível superior (TLD).

Digamos que você esteja procurando por spotify.com. O servidor DNS do domínio retorna o IP do servidor TLD .com.

Agora, nosso resolvedor de DNS armazenará em cache o IP desse servidor TLD, para que ele não precise solicitar novamente o servidor DNS raiz.

O servidor DNS do TLD terá os endereços IP dos servidores com autoridade para o domínio que estamos procurando.

Como? Quando você compra um domínio, o registrador de domínios envia os servidores TDL apropriados para o mesmo nome. Quando você atualiza os servidores de nomes (por exemplo, quando altera o provedor de hospedagem), essas informações são atualizadas automaticamente pelo seu registrador de domínio.

Esses são os servidores DNS do provedor de hospedagem. Eles geralmente são mais de 1, para servir como backup.

Por exemplo:

  • ns1.dreamhost.com
  • ns2.dreamhost.com
  • ns3.dreamhost.com

O resolvedor de DNS começa com o primeiro e tenta solicitar o IP do domínio (com o subdomínio) que você está procurando.

Essa é a melhor 'fonte de verdade' para o endereço de IP.

Agora que temos o endereço IP, posso continuar a explicação.

Requisição TCP

Com o endereço de IP do servidor disponível, agora o navegador pode iniciar uma conexão TCP.

Uma conexão TCP requer alguns ajustes antes de poder ser totalmente inicializada e você poder enviar dados.

Depois que a conexão for estabelecida, podemos enviar a requisição.

Enviando a requisição

A requisição é um documento de texto simples, estruturado de maneira precisa, determinada pelo protocolo de comunicação.

É composto por 3 partes:

  • A linha de requisição
  • O cabeçalho da requisição
  • O corpo da requisição

A linha de requisição

A linha de requisição define, em uma única linha:

  • O método HTTP
  • A localização do recurso
  • A versão do protocolo

Exemplo:

GET /HTTP/1.1

O cabeçalho da requisição

O cabeçalho da requisição é um conjunto de pares 'campo:valor' que definem determinados valores.

Todos os campos são opcionais, exceto o Host e o Connection

Host: flaviocopes.com
Connection: close

O Host indica o nome do domínio que queremos atingir, enquanto Connection é sempre definido como close, a menos que a conexão precise ser mantida aberta.

Alguns dos campos de cabeçalho mais usados são:

  • Origin
  • Accept
  • Accept-Encoding
  • Cookie
  • Cache-Control
  • Dnt

A parte do cabeçalho é finalizada por uma linha em branco.

O corpo da requisição

O corpo da requisição é opcional. Ele não é usado em requisições GET, mas muito usado em requisições POST e, as vezes, em outros tipos de requisições também.

Como agora estamos analisando uma requisição GET, o corpo está em branco e não o examinaremos mais.

A resposta

Depois que a requisição é enviada, o servidor a processa e manda de volta uma resposta.

A resposta começa com o código de status e a mensagem de status. Se a requisição for bem-sucedida e retornar um 200, ela começará com:

200 OK

A requisição pode retornar um código de status e uma mensagem, por exemplo:

  • 404 Not Found
  • 403 Forbidden
  • 301 Moved Permanently
  • 500 Internal Server Error
  • 304 Not Modified
  • 401 Unauthorized

Então, A resposta contém uma lista de cabeçalhos HTTP e o corpo da resposta (como estamos fazendo a solicitação no navegador, será em HTML).

Analisar o HTML

O navegador rcebe o HTML e começa a analisá-lo. Ele repetirá exatamente o mesmo processo que fizemos para todos os recursos exigidos pela página:

  • Arquivos CSS
  • Imagens
  • O favicon
  • Arquivos JavaScript

Como os navegadores renderizam a página, é importante entender que o processo que descrevi não é apenas para as páginas HTML, mas para qualquer item veiculado por HTTP.

Conclusão

Por hoje é isso galera, sei que esse texto pode ter sido um pouquinho longo, mas procurei trazer um resumo bem completo de como funciona uma requisição.

Se você tiverem quaisquer dúvidas relacionadas ao tema, deixem aqui nos comentários.

Comentários