# Sistema de Nomes de Domínio

O Sistema de Nomes de Domínio, mais conhecido pela nomenclatura em Inglês Domain Name System (DNS), é um sistema hierárquico e distribuído de gestão de nomes para computadores, serviços ou qualquer máquina conectada à Internet ou a uma rede privada. Faz a associação entre várias informações atribuídas a nomes de domínios e cada entidade participante. A sua utilização mais convencional associa nomes de domínios mais facilmente memorizáveis a endereços IP numéricos, necessários à localização e identificação de serviços e dispositivos, processo esse denominado por: resolução de nome. O desempenho não se degrada substancialmente quando se adicionam mais servidores. Por padrão, o DNS usa o protocolo User Datagram Protocol (UDP) na porta 53 para servir as solicitações e as requisições.
O DNS apresenta uma arquitetura cliente/servidor, podendo envolver vários servidores DNS na resposta a uma consulta. O servidor DNS resolve nomes para os endereços IP e de endereços IP para os nomes respectivos, permitindo a localização de hosts num determinado domínio.
Num sistema livre, o serviço é normalmente implementado pelo software BIND. Este serviço geralmente encontra-se localizado no servidor DNS primário. O servidor DNS secundário é uma espécie de cópia de segurança do servidor DNS primário. Assim, é uma parte necessária para quem quer usar a internet de uma forma mais fácil, evita que hackers roubem dados pessoais.
Existem centenas de servidores-raiz DNS (root servers) no mundo todo, agrupados em 13 zonas DNS raiz, das quais sem elas a Internet não funcionaria. Destes, dez estão localizados nos Estados Unidos da América, dois na Europa e um na Ásia. Para aumentar a base instalada destes servidores foram criadas réplicas localizadas por todo o mundo, inclusive no Brasil desde 2003.

## História

A implementação do DNS-Berkeley, foi desenvolvida originalmente para o sistema operacional BSD UNIX 4.3. A implementação do Servidor de DNS Microsoft se tornou parte do sistema operacional Windows NT na versão Server 4.0. O DNS passou a ser o serviço de resolução de nomes padrão a partir do Windows 2000 Server como a maioria das implementações de DNS teve suas raízes nas RFCs 882 e 883, e foi atualizado nas RFCs 1034 e 1035.

## Visão geral

Um recurso da internet, por exemplo um site da Web, pode ser identificado de duas maneiras: pelo seu nome de domínio, por exemplo, “www.wikipedia.org” ou pelo endereço de IP dos equipamentos que o hospedam (por exemplo, 208.80.152.130 é o IP associado ao domínio www.wikipedia.org). Endereços IP são usados pela camada de rede para determinar a localização física e virtual do equipamento. Nomes de domínio, porém, são mais mnemônicos para o usuário e empresas. É então necessário um mecanismo para resolver um nome de domínio em um endereço IP. Esta é a principal função do DNS.
Ocasionalmente, presume-se que o DNS serve apenas o objetivo de mapear nomes de hosts da Internet a dados e mapear endereços para nomes de host. Porém, o DNS pode armazenar uma grande variedade de tipo de dados, para praticamente qualquer finalidade.

## Hierarquia

Devido ao tamanho da Internet, armazenar todos os pares domínio - endereço IP em um único servidor DNS seria inviável por questões de escalabilidade, que incluem:
* Disponibilidade: se o único servidor de DNS falhasse, o serviço se tornaria indisponível para o mundo inteiro;
* Volume de tráfego: o servidor deveria tratar os pedidos DNS do planeta inteiro;
* Distância: grande parte dos usuários estaria muito distante do servidor, onde quer que ele fosse instalado, gerando grandes atrasos para resolver pedidos DNS;
* Manutenção do banco de dados: o banco de dados deveria armazenar uma quantidade de dados enorme e teria que ser atualizado com uma frequência muito alta (assim que um novo domínio fosse associado a um endereço IP).
A solução encontrada foi usar uma base de dados distribuída e hierárquica. Os servidores DNS se dividem nas seguintes categorias:
* Servidores-raiz;
* Servidores de domínio de topo;
* Servidores com autoridade.

### Servidores-raiz

No topo da hierarquia estão os 13 servidores raiz. Um servidor-raiz (root name server) é um servidor de nome para a zona raiz do DNS (Domain Name System). A sua função é responder diretamente às requisições de registros da zona raiz e responder a outras requisições retornando uma lista dos servidores de nome designados para o domínio de topo apropriado. Os servidores raiz são parte crucial da Internet porque são o primeiro passo em resolver nomes para endereços IP, esses últimos usados para comunicação entre hosts.$^[$

### Servidores de domínio de topo (top-level domain)

Cada domínio é formado por nomes separados por pontos. O nome mais à direita é chamado de domínio de topo. Exemplos de domínios de topo são .com, .org, .net, .edu, .inf, .gov.
Cada servidor de domínio de topo conhece os endereços dos servidores autoritativos que pertencem àquele domínio de topo, ou o endereço de algum servidor DNS intermediário que conhece um servidor autoritativo.
Há também terminações orientadas a países, chamadas de Código de País para Domínios de Topo/Primeiro Nível (Country Code Top Level Domains). Por exemplo: .br para o Brasil, .ar para a Argentina, .fr para a França e assim por diante. Há também combinações, como .com.br e .blog.br.

### Servidores com autoridade

O servidor com autoridade de um domínio possui os registros originais que associam aquele domínio a seu endereço de IP. Toda vez que um domínio adquire um novo endereço, essas informações devem ser adicionadas a pelo menos dois servidores autoritativos. Um deles será o servidor autoritativo principal e o outro, o secundário. Isso é feito para minimizar o risco de, em caso de erros em um servidor DNS, perder todas as informações originais do endereço daquele domínio.

## Métodos de resolução: iterativo e recursivo

Com as três classes de servidores DNS, já é possível resolver qualquer requisição DNS. Basta fazer uma requisição a um servidor raiz, e esse retornará o endereço do servidor de topo responsável. Então repete-se a requisição para o servidor de topo, que retornará o endereço do servidor autoritativo ou algum intermediário. Repete-se a requisição aos servidores intermediários (se houver) até obter o endereço do servidor autoritativo, que finalmente retornará o endereço IP do domínio desejado.
Repare que essa solução não resolve um dos problemas de escalabilidade completamente: os servidores raiz tem que ser acessados uma vez para cada requisição que for feita em toda a internet. Esses servidores também podem estar muito longe do cliente que faz a consulta. Além disso, para resolver cada requisição, são precisas várias consultas, uma para cada servidor na hierarquia entre o raiz e o autoritativo.
Esta forma de resolver consultas é chamada de iterativa ou não-recursiva: cada servidor retorna ao cliente (ou ao servidor local requisitante, como explicado adiante) o endereço do próximo servidor no caminho para o autoritativo, e o cliente ou servidor local fica encarregado de fazer as próximas requisições.
Há também o método recursivo: o servidor pode se responsabilizar por fazer a requisição ao próximo servidor, que fará a requisição ao próximo, até chegar ao autoritativo, que retornará o endereço desejado, e esse endereço será retornado para cada servidor no caminho até chegar ao cliente. Esse método faz com que o cliente realize apenas uma consulta e receba diretamente o endereço desejado, porém aumenta a carga dos servidores no caminho. Por isso, servidores podem se recusar a resolver requisições recursivas.

## Melhorias de performance

Dois recursos são usados em conjunto para reduzir a quantidade de requisições que os servidores raiz devem tratar e a quantidade de requisições feitas para resolver cada consulta: cache e servidor local.

### Cache

Toda vez que um servidor retorna o resultado de uma requisição para a qual ele não é autoridade (método de resolução recursivo), ele armazena temporariamente aquele registro. Se, dentro do tempo de vida do registro (TTL, Time to Live), alguma requisição igual for feita, o servidor DNS pode retornar o resultado sem a necessidade de uma nova consulta. Note que isso pode provocar inconsistência, já que se um domínio mudar de endereço durante o tempo de vida do cache, o registro estará desatualizado. Apenas o servidor autoritativo tem a garantia de ter a informação correta. É possível exigir, na mensagem de requisição DNS, que a resposta seja dada pelo servidor autoritativo.

### Servidor local

Esse tipo de servidor não pertence à hierarquia DNS, mas é fundamental para o seu bom funcionamento. Em vez de fazer requisições a um servidor raiz, cada cliente faz sua requisição a um servidor local, que geralmente localiza-se fisicamente muito próximo do cliente, por exemplo um servidor proxy. Este se encarrega de resolver a requisição. Com o uso de cache, o servidor local pode ter a resposta pronta, ou ao menos conhecer algum servidor mais próximo ao autoritativo que o raiz (por exemplo, o servidor de topo), reduzindo a carga dos servidores raiz.

## DNS reverso (reverse lookup)

Normalmente o DNS atua resolvendo o nome do domínio de um host qualquer para seu endereço IP correspondente. O DNS Reverso resolve o endereço IP, procurando o nome de domínio associado ao host. Ou seja, quando temos disponível o endereço IP de um host e não sabemos o endereço do domínio (nome dado à máquina ou outro equipamento que acesse uma rede), tentamos resolver o endereço IP através do DNS reverso que procura qual nome de domínio está associado àquele endereço. Os servidores que utilizam o DNS Reverso conseguem verificar a autenticidade de endereços, verificando se o endereço IP atual corresponde ao endereço IP informado pelo servidor DNS. Isto evita que alguém utilize um domínio que não lhe pertence para enviar spam, por exemplo.

## Registros de recurso

O Domain Name System especifica um banco de dados de elementos de informação para recursos de rede. Os tipos de elementos de informação são categorizados e organizados com uma lista de tipos de registros DNS, os registros de recursos (RRs). Cada registro tem um tipo (nome e número), um tempo de expiração (tempo de vida), uma classe e dados específicos do tipo. Os registros de recursos do mesmo tipo são descritos como um conjunto de registros de recursos (RRset), sem ordenação especial. Os resolvedores de DNS retornam todo o conjunto sob consulta, mas os servidores podem implementar a ordenação round-robin para atingir o balanceamento de carga. Em contraste, as Extensões de Segurança do Sistema de Nomes de Domínio (DNSSEC) funcionam no conjunto completo de registros de recursos em ordem canônica.
Quando enviados por uma rede de protocolo da Internet, todos os registros usam o formato comum especificado na RFC 1035:
Campos de registro de recurso (RR) :
| Campo | Descrição | Comprimento (octetos) |
| NOME | Nome do nó ao qual este registro pertence | Variável |
| TIPO | Tipo de RR em forma numérica (e.g., 15 para MX RRs) | 2 |
| CLASSE | Código da classe | 2 |
| TTL | Contagem dos segundos que o RR permance válido (O máximo é 2$^{31}$−1, que é em torno de 68 anos) | 4 |
| RDLENGTH | Comprimento do campo RDATA (especificado em octetos) | 2 |
| RDATA | Dados adicionais específicos do RR | Variável, como por RDLENGTH |
NOME é o nome de domínio totalmente qualificado do nó na árvore. Na transmissão, o nome pode ser encurtado usando compactação de rótulo, onde as extremidades dos nomes de domínio mencionados anteriormente no pacote podem ser substituídas pelo final do nome de domínio atual.
TIPO é o tipo de registro. Ele indica o formato dos dados e dá uma dica do uso pretendido. Por exemplo, o registro A é usado para traduzir de um nome de domínio para um endereço IPv4, o registro NS lista quais servidores de nome podem responder a pesquisas em uma zona DNS e o registro MX especifica o servidor de e-mail usado para manipular e-mails de um domínio especificado em um endereço de e-mail.
RDATA são dados de relevância específica de tipo, como o endereço IP para registros de endereço ou a prioridade e o nome do host para registros MX. Os tipos de registro bem conhecidos podem usar compactação de rótulo no campo RDATA, mas os tipos de registro "desconhecidos" não (RFC 3597).
A CLASSE de um registro é definida como IN (para Internet) para registros DNS comuns envolvendo nomes de host, servidores ou endereços IP da Internet. Além dessa, existem as classes Chaos (CH) e Hesiod (HS). Cada classe é um espaço de nome independente com delegações potencialmente diferentes de zonas DNS.
Além dos registros de recursos definidos em um arquivo de zona, o sistema de nomes de domínio também define vários tipos de solicitação que são usados ​​apenas na comunicação com outros nós DNS (na rede), como ao realizar transferências de zona (AXFR/IXFR) ou para EDNS (OPT).

## Registro de nome de domínio

A organização responsável por atribuir nomes de domínio e endereços IP em nível global é a ICANN.