Estou tentando entender os protocolos da camada de aplicativo na pilha TCP / IP. Eu sei que os protocolos HTTP e DNS ficam na camada superior (camada de aplicativo). Portanto, quando um navegador deseja acessar um recurso, ele deve enviar uma solicitação ao servidor HTTP, como por exemplo:
GET www.pippo.it/hello.htm HTTP/1.1
Fazendo essa solicitação seguindo as regras do protocolo HTTP, ele usa o URL da página, não o endereço IP.
Eu sei que a solicitação de DNS é necessária para converter o URL em IP. Então, minha pergunta é: o HTTP invoca o protocolo DNS? Parece-me impossível, pois ambos são protocolos de camada superior (portanto, o DNS não pode fornecer um serviço para HTTP). Da mesma forma, mesmo o TCP (que permanece 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 acontece a solicitação de DNS? E quem executa essa solicitação?
fonte
Respostas:
A solicitação HTTP em questão não é realmente válida, a menos que o navegador esteja conversando com um intermediário (proxy).
Seu exemplo seria um pouco mais parecido com o seguinte se o navegador estivesse conversando diretamente com um servidor da Web:
Agora, para colocar isso em perspectiva, considere o modelo OSI:
Temos 3 sistemas em ação:
Os protocolos envolvidos são, de baixo para cima (conjunto mínimo relevante para OP):
A comunicação HTTP é feita através do protocolo TCP (o TCP está no topo do protocolo IP) enquanto a comunicação DNS, neste caso, é feita no protocolo UDP (o UDP também está no topo do protocolo IP).
Aqui está a sequência de comunicação em resumo:
O cliente , executando o navegador, pede ao servidor DNS para um
A
recorde parawww.pippo.it
, utilizando o protocolo UDP.1.1 No cliente, é o sistema operacional que faz a parte de resolução e retorna ao navegador - o navegador nunca se comunica diretamente com o servidor DNS, mas pelo sistema operacional, invocando gethostbyname () ou o getaddrinfo () mais recente . No Windows, a ordem em que o sistema operacional resolve endereços é provavelmente definida por algo como isso , enquanto no Linux a precedência resolver é definida por
/etc/nsswitch.conf
O servidor DNS , usando o protocolo UDP, responde ao cliente com um endereço IP / registro, se existir
O cliente abre uma conexão TCP na porta 80 do servidor da web e grava o seguinte texto:
Solicitação HTTP:
Você pode imitar a mesma coisa fazendo algo assim no console ou no prompt de comando:
seguido por duas linhas vazias. Se o conteúdo solicitado existir, o servidor da web o imprimirá na tela. Se houver um navegador do outro lado, o texto da resposta será analisado pelo navegador e todas as tags, links, scripts e imagens serão renderizados no que chamamos de página da web.
Na realidade, existem mais alguns detalhes, por exemplo, navegadores podem armazenar em cache endereços IP se você já visitou algum domínio, para que a resolução do DNS se torne desnecessária. Além disso, os navegadores modernos podem tentar resolver antes que você realmente precise ( pré-busca de DNS ) para acelerar sua navegação.
Além disso, seu computador pode ter registros estáticos em um
hosts
arquivo. Se um registro corresponder à solicitação, a entrada estática local será usada primeiro e nenhum servidor DNS será contatado. Isso é configurável e não necessariamente verdadeiro, mas é o padrão nos sistemas operacionais com os quais estou familiarizado.fonte
GET http://www.pippo.it/hello.htm HTTP/1.1
seria uma solicitação válida, se não usual. Também seria uma solicitação válida e usual para um proxy HTTP.gethostbyname()
está um pouco desatualizado. Alguém poderia usargetaddrinfo()
...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, é necessário emitir uma solicitação DNS (geralmente a própria solicitação DNS é enviada pelo sistema operacional quando um programa chama suas funções de resolução de nomes; no entanto, nada impede que um programa envie solicitações DNS por si só ao DNS servidor). 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 vai na linha de solicitação (seria realmenteGET /hello.htm HTTP/1.1
), exceto quando a solicitação é enviada para um proxy HTTP (e, neste caso, a URL completa está presente, incluindo a parte do protocolo, por exemploGET http://www.pippo.it/hello.htm HTTP/1.1
),fonte
O procedimento é assim:
http://www.pippo.it/hello.htm
O navegador divide isso em três partes:
http
www.pippo.it
/hello.htm
(um URL mais complicado também pode ter outras partes, ignorarei essa possibilidade por enquanto)
O navegador sabe que, para criar uma conexão IP, ele precisa de um endereço IP. Para obter um endereço IP, ele precisa usar o DNS (a menos que tenha o endereço em cache).
8.8.8.8
.O navegador constrói a seguinte conexão de várias camadas:
8.8.8.8
A
registro para o nome do hostwww.pippo.it
É claro que estou omitindo muitos detalhes sobre, por exemplo, o formato exato dos pacotes envolvidos.
www.pippo.it
, digamos que seja10.11.12.13
http
consulta o protocolo em sua tabela interna e aprende que deve usar a porta 80.O navegador constrói a seguinte conexão de várias camadas:
10.11.12.13
Camada HTTP: crie uma solicitação HTTP para o URL
/hello.htm
no hostwww.pippo.it
(porque o computador10.11.12.13
pode estar hospedando vários domínios, portanto, ele precisa saber qual é o desejado)Claro que estou omitindo todos os detalhes do aperto de mão TCP e tal.
hello.htm
E, para uma boa medida, mencionarei que o navegador agora examina o conteúdo dessa resposta e identifica quaisquer recursos adicionais necessários: imagens, CSS, Javascript, etc. Em seguida, repete todo esse processo para cada recurso.
fonte
getaddrinfo
ougethostbyname
solicita ao sistema operacional que resolva o endereço. Além disso, o sistema operacional normalmente usa vários mecanismos para tentar procurar nomes, não apenas DNS. (Normalmente, pelo menos, o arquivo hosts, além de DNS.)