Percebi que, quando faço ping em uma URL, mais de um endereço IP pode ser retornado pelo DNS: acho que isso significa que há dois servidores da Web atendendo ao mesmo FQDN.
Eu me pergunto qual dos dois seria usado por um navegador. Existe alguma regra para isso?
Qualquer esclarecimento muito apreciado.
Não existe uma regra rígida, pois todos os endereços são equivalentes e o programa pode utilizá-los em qualquer ordem. Normalmente, os programas tentam todos os endereços da lista até que um responda.
Os valores no DNS não têm uma ordem inerente (e o próprio registro A não tem campo de prioridade), portanto, o servidor DNS pode retornar os registros A em qualquer ordem; a expectativa é que todos os endereços listados para um determinado nome estejam fornecendo serviços idênticos. Frequentemente, a resposta é deliberadamente embaralhada para fornecer algum balanceamento de carga básico¹. Isso pode ser feito pelo servidor autoritativo e/ou pelo resolvedor local.
¹ (Existem alguns motivos pelos quais até mesmo um único servidor com vários endereços pode ter um desempenho melhor do que exatamente a mesma configuração com apenas um endereço.)
O programa geralmente usará qualquer ordem obtida do sistema operacional, mas o sistema operacional pode embaralhar a lista novamente antes de retorná-la (caso o servidor DNS não o tenha feito).
Na verdade, existem duas listas no nível do DNS – uma para endereços IPv4 (registros A) e outra para IPv6 (AAAA). Alguns programas (principalmente navegadores da web) tentam ambos os tipos em paralelo, enquanto outros mesclam ambos em uma única lista que é classificada em categorias amplas (endereços IPv6 globais nativos, IPv4 nativo, IPv6 privado etc.).
Programas muito antigos podem tentar apenas o "primeiro" endereço IPv4 (qual endereço é "primeiro" é imprevisível), pois as funções mais antigas de "pesquisa de nome de host" fornecidas pelo sistema operacional não podiam retornar mais de um. Esses programas geralmente não suportam nada além de IPv4.
Em poucas palavras, existem dois mecanismos principais:
Quando um servidor DNS retorna uma lista de endereços IP para uma consulta DNS, ele tenta um método round-robin para reordenar a lista em cada consulta sucessiva. Isso se baseia no fato de que a maioria das aplicações, ao receber uma lista de IPs, irá apenas pegar o primeiro, passando para o próximo apenas se o anterior falhar.
O DNS round-robin é descrito em RFC 1794 - DNS Support for Load Balancing .
Para IPv4, a seleção do endereço de destino é bastante simples e geralmente feita selecionando o primeiro endereço IP retornado pelo servidor DNS. Isso funciona bem com DNS Round Robin, pois permite que o servidor decida qual endereço o cliente usará, colocando-o no topo da lista.
O IPv6 introduz uma mudança neste comportamento por RFC 3484 :
A comparação par a par de endereços de destino consiste em dez regras que devem ser aplicadas em ordem. Se uma regra determinar um resultado, as regras restantes serão ignoradas, pois as regras subsequentes agem apenas como desempate para as regras anteriores.
Existem 10 regras, mas a regra 9 deve ser considerada:
A correspondência mais longa é usada, não apenas o primeiro endereço IP da lista. Há uma mudança no comportamento quando o IPv6 é instalado, portanto, o sistema operacional não extrai apenas o primeiro endereço IP da lista.
Referência: DNS Round Robin avançado e seleção de endereço IP de destino em clientes Windows .
Aqui está o que eu testei por volta de 2016:
Espero que agora todas as máquinas com Windows 10/11 escolham aleatoriamente um IP.