Como o método HTTP GET funciona em relação ao protocolo DNS?

17

Estou tentando entender os protocolos da camada de aplicativo na pilha TCP / IP. Eu sei que os protocolos HTTP e DNS permanecem na camada superior (Application Layer). Então, quando um navegador quer acessar um recurso, ele tem que enviar uma requisição para o servidor HTTP, como por exemplo:

GET www.pippo.it/hello.htm HTTP/1.1

Fazendo essa solicitação seguindo as regras do protocolo HTTP, ela usa o URL da página, não o endereço IP.

Eu sei que a solicitação de DNS é necessária para converter URL em IP. Então, minha pergunta é: o HTTP invoca o protocolo DNS? Parece impossível para mim, já que ambos são protocolos de camada superior (então o DNS não pode fornecer um serviço para HTTP). Da mesma forma, mesmo o TCP (que fica em um nível inferior) não pode solicitar um serviço em um protocolo de nível superior, como o DNS.

Então, quando a solicitação de DNS acontece? E quem realiza esse pedido?

    
por Giancarlo Perlo 11.11.2014 / 14:08

3 respostas

36

A solicitação HTTP em questão é, na verdade, inválida, a menos que o navegador esteja falando com o intermediário (proxy).

Seu exemplo ficaria mais parecido com seguir se o navegador estivesse falando diretamente com o servidor da Web:

GET /hello.htm HTTP/1.1
Host: www.pippo.it

Agora, para colocar em perspectiva, considere o modelo de camada OSI

Portanto,temos3sistemasemação.

  • Clienteexecutandoonavegador
  • ServidordaWebatendendoaosite
  • servidorDNSsabendooendereçoIPdosite

Osprotocolosenvolvidossão;debaixoparacima(mínimorelevantedefinidoparaOP)

  • IP
  • TCP,UDP
  • HTTP,DNS

AcomunicaçãoHTTPéfeitaatravésdoprotocoloTCPeacomunicaçãoTCPestánotopodoprotocoloIP

ODNS,nestecaso,éfeitoatravésdoprotocoloUDP,eoprotocoloUDPestánotopodoprotocoloIP.

seqüênciadecomunicaçãoemresumo:

  1. Onavegadoremexecução

    CLIENTsolicitaoServidorDNSusandooprotocoloUDPparaumregistrodewww.pippo.it

    1.1.noclienteéosistemaoperacionalqueresolveparteefaladevoltaparaonavegador,onavegadornuncafaladiretamentecomoDNS,esimatravésdosistemaoperacionalinvocando gethostbyname () ou mais recente getaddrinfo () . Na ordem do Windows em que o sistema operacional resolve os endereços provavelmente é definido por algo como isto , e na precedência de resolução do Linux é definida por /etc/nsswitch.conf

  2. Servidores DNS usando o protocolo UDP responde a CLIENTE com registro / endereço IP, se existir

  3. CLIENT abre a conexão TCP à porta 80 do servidor WEB e grava o texto a seguir

Solicitação HTTP:

GET /hello.htm HTTP/1.1
Host: www.pippo.it

Você poderia imitar a mesma coisa fazendo algo parecido com isso no prompt do console / cmd

> telnet www.pippo.it 80
Trying 195.128.235.49...
Connected to www.pippo.it.
Escape character is '^]'.
GET /hello.htm HTTP/1.1
Host: www.pippo.it

Seguido por duas linhas vazias. Para este servidor web responderá, se houver conteúdo solicitado, ele será impresso na tela e, no caso do navegador, o hypertext será analisado pelo navegador e todas as tags, links, scripts e imagens serão renderizados no que chamamos de web página.

Na realidade, existem mais alguns detalhes, por ex. Os navegadores armazenam em cache os endereços IP se você já visitou algum domínio, portanto, a resolução do DNS pode não ser necessária. Os navegadores modernos também podem tentar resolver antes que você realmente precise deles ( pré-busca de DNS ) para acelerar sua experiência de navegação.

Além disso, seu computador pode ter um registro estático no arquivo hosts e nenhum servidor DNS jamais seria contatado, e a entrada estática local seria usada primeiro. Isso é configurável e não necessariamente verdadeiro, mas é o padrão para os principais sistemas operacionais com os quais estou familiarizado.

    
por 11.11.2014 / 14:14
12

O HTTP é transportado pelo TCP, que é um protocolo IP. Para fazer uma solicitação HTTP, o navegador precisa abrir uma conexão TCP e, para isso, precisa do endereço IP de destino (ou seja, o endereço IP do servidor). Para resolver o nome do host do servidor, ele deve emitir uma solicitação de DNS (geralmente a própria solicitação DNS é enviada pelo sistema operacional quando um programa chama suas funções de resolução de nome; no entanto, nada impede que um programa envie Solicitações de DNS por si só para o servidor DNS). Depois que a conexão é estabelecida, ela pode enviar sua solicitação HTTP, que contém o caminho para o recurso solicitado, e um campo Host com o nome do host do servidor (por exemplo, Host: www.pippo.it ). O nome do host não não entra na linha de solicitação (na verdade seria GET /hello.htm HTTP/1.1 ), exceto quando a solicitação é enviada a um proxy HTTP (e, nesse caso, a URL completa está presente, incluindo o parte do protocolo, por exemplo, GET http://www.pippo.it/hello.htm HTTP/1.1 ),

    
por 11.11.2014 / 14:10
7

O procedimento é assim:

  1. O usuário (você) fornece ao navegador uma URL, como http://www.pippo.it/hello.htm
  2. O navegador divide isso em três partes:

    • Protocolo http
    • Nome do host www.pippo.it
    • caminho do URL /hello.htm

    (um URL mais complicado poderia ter outras partes também, eu vou ignorar essa possibilidade por enquanto)

  3. O navegador sabe que, para criar uma conexão IP, é necessário um endereço IP. Para obter um endereço IP, ele precisa usar o DNS (a menos que tenha o endereço em cache).

    1. O navegador solicita ao sistema operacional o endereço IP de um servidor DNS; suponha que ele receba 8.8.8.8 .
    2. O navegador constrói a seguinte conexão multicamada:

      • camada IP: conecte-se a 8.8.8.8
      • Camada UDP: definir pacote para a porta de destino 53
      • Camada DNS: crie uma solicitação de DNS para um registro A do nome do host www.pippo.it

      É claro que estou omitindo muitos detalhes sobre, por exemplo, o formato exato dos pacotes envolvidos.

    3. O navegador recebe uma resposta de DNS (em camadas sobre UDP em camadas na parte superior do IP, etc.), que fornece o endereço IP para www.pippo.it , digamos que seja 10.11.12.13
  4. O navegador sabe que, para criar uma conexão TCP, ele precisa de um número de porta. Para obter um número de porta, ele procura o protocolo http em sua tabela interna e aprende que deve usar a porta 80.
  5. O navegador constrói a seguinte conexão multicamada:

    • camada IP: conecte-se a 10.11.12.13
    • Camada TCP: defina os pacotes para a porta de destino 80
    • Camada HTTP: crie uma solicitação HTTP para o URL /hello.htm no host www.pippo.it (porque o computador em 10.11.12.13 pode estar hospedando vários domínios, então é necessário saber qual deles é o desejado)

      GET /hello.htm HTTP/1.1
      Host: www.pippo.it
      ...
      

    Claro que estou omitindo todos os detalhes do handshake TCP e tal.

  6. O navegador recebe uma resposta HTTP (em camadas no topo do TCP em camadas no topo do IP, etc.) contendo o conteúdo de hello.htm

E, para uma boa medida, vou mencionar que o navegador agora examina o conteúdo dessa resposta e identifica quaisquer recursos adicionais necessários: imagens, CSS, Javascript, etc. Em seguida, ele repete todo esse processo para cada recurso.

    
por 11.11.2014 / 18:16