# Domain Name System - DNS

Na internet as páginas web são geralmente conhecidas pelo seu apelidos ou nome de hospedeiro (hostname). Embora sejam quase que exclusivamente conhecidas por esse nome, todos os hospedeiros são identificados também pelo seu endereço IP. O endereço IP é formado por 4 octetos que constituiem 32 bits e possui uma estrutura hierárquica rígida, de forma que quando examinamos este endereço da esquerda pra direita vamos obtendo cada vez mais informações sobre sua localização na internet, coisa que não é possível examinando apenas seu nome de hospedeiro.
Enquanto as pessoas preferem identificar esses hospedeiros pelo seu nome por serem mais fáceis de serem lembrados, os roteadores preferem identificá-los pelo seu endereço IP, mais fáceis de serem processados por não possuirem caracteres alfanuméricos de tamanhos variáveis.

## História do DNS

O DNS foi criado a partir da necessidade existente de traduzir os complicados números IP para um tipo de mais alto nível, que poderia ser relembrado com facilidade por pessoas comuns. Com certeza foi um ponto de apoio para o crescimento exponencial que a rede sofreu. Sua criação data do ano de 1983 pelo americano Paul Mockapetris, que fez o trabalho a pedido de Jonathan Postel, um grande personagem que esteve presente na criação da ARPANET e foi editor dos RFCs. Paul descreveu o sistema de nomes nas RFCs 882 e 883, posteriormente o protocolo foi reformulado nas RFCs 1034 e 1035. A primeira implementação do DNS foi criada por um grupo de quatro estudantes da Universidade da Califórnia Berkeley. Essa implementação foi melhorada no ano seguinte, dando vida ao software que até hoje é mais conhecido servidor de domínios, o BIND (Berkeley Internet Name Domain).

## Serviços fornecidos pelo DNS

A tarefa de traduzir um nome de hospedeiro para endereço IP é feita pelo DNS (domain name system - sistema de nomes de domínio), que é basicamente um conjunto de servidores distribuidos de forma hierárquica que recebe o nome de hospedeiro que o usuário deseja e devolve o endereço IP correspondente. O protocolo DNS utiliza o protocolo UDP e a porta 53 para comunicação.
Além de ser identificado pelo seu nome de hospedeiro, um hospedeiro pode também ser identificado por um ou mais apelidos que simplificam um nome de hospedeiro complicado ou muito grande. O DNS pode ser chamado neste caso para obter o nome de hospedeiro (também conhecido como nome canônico) e o endereço IP correspondente ao apelido fornecido, assim como para certos servidores de correio que possuem apelido para simplificar o seu nome canônico.
O DNS também pode ser usado para fazer distribuição de carga entre servidores web ou de e-mail replicados, principalmente para sites movimentados que rodam em vários servidores e possuem endereços IP diferentes.

## Modo de funcionamento do DNS

Os servidores DNS são distribuídos de forma hierárquica entre vários servidores por todo o mundo, de forma que não concentre todo o processo em um único servidor, o que sobrecarregaria o mesmo, tornaria o processo mais lento e mais sujeito a falhas. Os servidores DNS dividem-se em três classes:
* Servidores de nomes raiz: há 13 servidores de nomes raiz no mundo, responsáveis por passar uma lista de servidores TLD correspondentes ao endereço IP desejado;
* Servidores TLD (nomes de domínio de alto nível): são responsáveis por domínios de alto nível como com, org, net ,edu, gov, uk, fr, jp, br e outros;
* Servidores de nomes com autoridade: são a parte final do processo, geralmente as próprias organizações, responsáveis por passar o endereço IP em si correspondente ao nome de hospedeiro informado.
Também há o servidor DNS local contido em cada ISP (internet service provider - provedor de serviços de internet). Este não integra a hierarquia de servidores DNS, apenas faz o repasse do nome de hospedeiro e recebe o endereço IP correspondente dos servidores que integram a hierarquia.
Para que um host acesse uma URL qualquer ("www.amazon.com", por exemplo) na internet, primeiramente ele envia uma mensagem de requisição para o servidor de nomes local. O servidor local envia uma consulta ao DNS raiz, o qual percebe o sufixo 'com' e responde uma lista de endereços IP para o DNS local contendo servidores TLD que são reponsáveis por 'com'. Em seguida, o DNS local faz requisição para um desses servidores TLD, o qual percebe o sufixo 'amazon.com' e envia ao DNS local o endereço IP do servidor DNS com autoridade para a Amazon. Finalmente, o DNS local consulta o servidor com autoridade e esse responde com o endereço do hospedeiro 'www.amazon.com'. Assim, o DNS local responde ao hospedeiro o IP do nome solicitado.
A partir do processo relatado acima, vemos que há consultas recursivas e iterativas. Entre o hospedeiro e o DNS local, a consulta é recursiva, uma vez que o hospedeiro pede que o DNS local obtenha o mapeamento em seu nome. Enquanto que as outras três consultas (DNS local com DNS raiz, TLD e autoridade) são iterativas, já que as respostas são retornadas diretamente ao DNS local. Em teoria, qualquer consulta DNS pode ser iterativa ou recursiva, porém, na prática, as consultas geralmente são feitas conforme o padrão exposto acima. A figura abaixo ilustra o caminho de uma consulta DNS para resolver o endereço IP de determinado nome, similarmente ao que foi apresentado acima:
Os servidores DNS, sejam eles de qualquer tipo, podem fazer uso de cache de DNS para agilizar o processo. Quando é feito uma requisição ao servidor, este armazena em sua memória a resposta correspondente, de forma que quando a mesma requisição é feita novamente ele dará a resposta imediatamente, não necessitando fazer toda a procura novamente. Essa informação fica armazenada por um certo período de tempo, geralmente 2 dias, até ser atualizada novamente em uma outra requisição.

## Registros e Mensagens DNS

As informações sobre o DNS são armazenadas em zonas. Em uma zona pode haver informações sobre um ou mais domínios. As informações são adicionadas em uma zona do DNS, através da criação de registros de recursos (RR). Um RR corresponde a uma tupla composta basicamente de quatro elementos (nome, valor, tipo e TTL-Tempo de vida útil do RR) e ele fornece mapeamentos de hospedeiros para endereços IP. Cada mensagem de resposta DNS carrega um ou mais registros de recursos. Abaixo segue uma descrição dos principais tipos de RRs:
A: É o tipo mais utilizado, faz o mapeamento de um nome DNS para um endereço IP versão 4, de 32 bits.
Exemplo:
host1.example.microsoft.com. IN A 127.0.0.1
AAAA: Faz o mapeamento de um nome DNS para um endereço IP versão 6, de 128 bits.
Exemplo:
ipv6_host1.example.microsoft.com. IN AAAA 4321:0:1:2:3:4:567:89ab
CNAME: (Canonical Name)- Mapeia um alias (apelido) ou nome DNS alternativo. Por exemplo, suponha que o site da empresa esteja no servidor srv01.abc.com.br. Porém na internet, os usuários irão utilizar o nome www.abc.com.br. Neste caso basta criar um alias www que faz referência ao nome srv01.abc.com.br. Pronto, quando os usuários digitarem www.abc.com.br estarão acessando, na verdade, o endereço srv01.abc.com.br. Porém para o usuário, tudo ocorre transparentemente, como se o nome fosse realmente www.abc.com.br.
Exemplo:
www.abc.com.br. CNAME srv01.abc.com.br.
NS: É utilizado para relacionar um nome DNS com o seu dono, ou seja, o servidor que é a autoridade para o nome DNS. Ou em outras palavras, o servidor DNS onde está a zona primária associada ao nome.
Exemplo:
example.microsoft.com. IN NS nameserver1.example.microsoft.com
MX: Fornece informações utilizadas pelos servidores de e-mail, para o roteamento de mensagens. Cada host definido em um registro MX deve ter um correspondente registro do tipo A em uma zona válida, no servidor DNS.
Exemplo:
example.microsoft.com. MX 10 mailserver1.example.microsoft.com
Nota : O número de dois dígitos após o MX, é um indicativo da ordem de preferência quando mais de um registro MX é configurado na mesma zona.
PTR: É utilizado em zonas reversas, para fazer o mapeamento reverso, ou seja, o mapeamento de um número IP para um nome. Ao criar um registro do tipo A, em uma zona direta, você pode criar, automaticamente, o registro PTR associado, se já houver uma zona reversa configurada.
Exemplo:
10.20.20.10.in-addr.arpa. PTR host.example.microsoft.com.
HINFO: Utilizado para armazenar informações sobre o hardware do servidor DNS, tais como tipo de CPU, tipo e versão do sistema operacional e assim por diante. Estas informações podem ser utilizadas por protocolos como por exemplo o ftp, o qual utiliza procedimentos diferentes, para diferentes sistemas operacionais
Exemplo:
my-computer-name.example.microsoft.com. HINFO INTEL-386 WIN32
As duas únicas espécies de mensagens DNS existentes são a de consulta e resposta DNS. Esses dois tipos de mensagens possuem o mesmo formato e são compostas da seguinte maneira:
* O cabeçalho é formado por 12 bytes, dos quais 16 bits são designados a identificar a consulta. Esse identificador é copiado para a mensagem de retorno à consulta da qual ele foi originado. Assim, a partir da propagação desse identificador, vemos que é possível que o cliente combine respostas recebidas com consultas enviadas. O cabeçalho é ainda composto basicamente por mais cinco campos. São eles: Flags, que indica se uma mensagem é de consulta ou resposta e também se o servidor de nomes indicado na mensagem de resposta se trata de um servidor com autoridade ou não, dentre outras funções; e quatro campos "números de" (Perguntas, Respostas, Autoridade e Informação adicional).
* A seção de pergunta contém informações a respeito de uma consulta que está sendo feita e inclui um campo para nome de quem está sendo consultado e outro que indica o tipo de pergunta que está sendo feita sobre o nome.
* Uma outra seção, chamada seção de resposta, possui os registros de recursos para os nomes referentes às consultas. Como é possível que um mesmo hospedeiro tenha diversos endereços IP (como em servidores WEB replicados), uma resposta pode retornar vários RRs.
* A seção de autoridade é aquela que, como o próprio nome induz, contém registros de servidores com autoridade.
* Já a seção adicional contém outros registros úteis, como por exemplo, conter o registro do tipo A que fornece o endereço IP para o nome canônico do servidor de correio.