Usando vários registros A no meu domínio - os navegadores da Web tentam mais de um?

94

Se eu adicionar vários registros A ao meu domínio, eles serão retornados em uma ordem de rodízio pelos servidores DNS.

Exemplo:

192.0.2.1 A example.com
192.0.2.2 A example.com
192.0.2.3 A example.com

Mas como os navegadores da Web reagem se o primeiro host ( 192.0.2.1) estiver inativo (inacessível)? Eles tentam o segundo host ( 192.0.2.2) ou retornam uma mensagem de erro ao usuário? Existe alguma diferença entre os navegadores mais populares?

Se eu implementar meu próprio aplicativo, posso implementá-lo para que o segundo seja usado caso o primeiro esteja inativo, para que seja possível. E isso seria muito útil para criar um site tolerante a falhas.

Jonas
fonte

Respostas:

87

Sim, a maioria dos navegadores dos últimos 5 a 10 anos tentará os outros registros A se um não responder. Às vezes, isso é chamado de "nova tentativa do navegador" ou "nova tentativa do cliente" aparentemente. Você encontrará praticamente tudo sobre isso no contexto das várias explorações de navegador que esse recurso permite contra sites que não o usam (consulte Rebobinação de DNS e fixação de DNS , fixação anti-dns, fixação anti-dns, anti-anti -anti-dns fixando e assim por diante). Tipo de má reputação, mas prova que existe.

Praticamente todos os navegadores realmente recebem a lista completa de registros A e, de fato, verificam outros se o navegador que está usando falhar. Você pode esperar que cada cliente tenha uma espera de 30 segundos quando tentar acessar um site pela primeira vez quando um servidor estiver inoperante, até que ele se conecte a um endereço de trabalho. O navegador armazenará em cache o endereço que está funcionando e continuará usando esse endereço para solicitações futuras, a menos que também falhe, e terá que pesquisar na lista novamente. Então, espera de 30 segundos no primeiro pedido, tudo bem depois.

Mas não é algo que você necessariamente queira usar, ele terá muitas advertências sobre compatibilidade de navegador, compatibilidade de sistema operacional, compatibilidade de proxy, cabeçalhos de controle de cache terão efeitos estranhos sobre se ele se lembra de quais IPs estão inativos ou começa a ter Na espera de 30 segundos em cada solicitação, as pessoas que escrevem clientes personalizados para o seu site acabam usando gethostbyname em vez de getaddrinfo e não conseguem lidar com o failover, todos os tipos de problemas em potencial.

Você também não pode confiar em vários registros A para permitir servidores "mestre" e "escravo", porque nunca saberá qual endereço um navegador escolherá na lista. Todos eles precisam ser capazes de lidar com os visitantes em execução, porque qualquer um pode receber tráfego se estiver ativo. Um navegador pode pensar que seu terceiro servidor fora da lista é o mais atraente, talvez pareça o mais próximo, e ele escolherá aquele, mesmo que os três ainda estejam ativos.

Mas se você pode conviver com as limitações e possuir um sistema HTTP razoavelmente simples com o qual pode prever a interação do navegador, ele funcionará.

Ah, você também terá que lidar com muitas pessoas dizendo que isso não existe (já que isso era verdade há 15 anos). Mas você pode tentar telnetar para um nome de domínio com vários registros A, alguns com IPs mortos e outros bons, se precisar provar (sim, até o bom e velho telnet agora usa getaddrinfo e manipula vários registros A normalmente hoje em dia) - ele imprimirá uma boa lista dos IPs que está tentando até que finalmente seja bem-sucedido.

Joff
fonte
12
Aqui está um relatório do Departamento Nacional de Pesquisa Econômica que apóia a resposta de Joff.
Marco
3
Curiosamente, enquanto stackexchange.com aponta para um IP, o Google retorna vários: $ dig google.com @ ns1.google.com ;; SEÇÃO DE RESPOSTA: google.com. 300 IN A 74.125.226.6 google.com. 300 IN A 74.125.226.7 google.com. 300 IN A 74.125.226.0 google.com. 300 IN A 74.125.226.4 google.com. 300 IN A 74.125.226.8 google.com. 300 IN A 74.125.226.2 google.com. 300 IN A 74.125.226.1 google.com. 300 IN A 74.125.226.3 google.com. 300 IN A 74.125.226.5 google.com. 300 EM UM 74.125.226.14 google.com. 300 EM UM 74.125.226.9
Louis St-Amour
1
Desculpe, mas acho que não é assim que funciona. Os navegadores não têm nada a ver com a resolução de endereços IP - o que acontece no software do sistema. Se você fornecer vários registros A, deve assumir que qualquer cliente receberá um aleatório da lista.
Jan Steinman
19
Isso é como ele funciona em navegadores contemporâneos. Todos eles escolhem usar chamadas do sistema como getaddrinfo () para obter vários endereços IP e lidar com o failover internamente, em vez de obter um único endereço IP do sistema. Outros comentaristas e respondentes aqui fazem parte do "monte de gente dizendo que isso não existe" do último parágrafo de Joff - presumo que eles tenham boas intenções, mas estão divulgando informações erradas.
Robert Tupelo-Schneck
1
Para apoiar a declaração de Joff de "navegadores 5 a 10 anos atrás", aqui está um teste feito pelo National Bureau of Economic Research, que afirma que você tem esse tipo de sistema trabalhando com o IE 8. Parece justo para mim. :)
Jomar Sevillejo
5

Esteja avisado de que o Windows Vista implementa as partes estúpidas do RFC3484 (ou seja, o backport do IPV6 para o IPV4) e prefere o endereço IP que compartilha a maioria dos bits de prefixo com o endereço IP do usuário, em vez de escolher um aleatoriamente. Como a maioria dos usuários tem endereços IP que começam com 192.168, isso significa que qualquer que seja o seu endereço IP compartilhe a maioria dos bits de prefixo que obterá a maior parte do tráfego do Vista. A Microsoft corrigiu essa idiotice específica no Windows 7 e posterior, por isso não é tão problema quanto costumava ser.

Mike Scott
fonte
Vista, essa é boa!
the0ther
3

Esta é a técnica básica de distribuição de balanceamento de carga DNS: DNS Round Robin. Isso não tem nada a ver com o navegador, depende da implementação do resolvedor e do cache local / remoto do endereço DNS. As mudanças são que, se um servidor falhar, devido ao armazenamento em cache na camada DNS, seu site poderá ficar inacessível.

Veja aqui uma explicação básica sobre o DNS Round Robin na WikiPedia.

keatch
fonte
1
Bem, uma vez que o navegador é o resolvedor - depende da implementação do navegador, como eu sei.
Jonas19
2
Não, há a biblioteca do sistema que resolve o DNS usando, é claro, o servidor de nomes DNS configurado no sistema. A função faz parte da biblioteca padrão do sistema operacional.
keatch
Mas, tanto nslookup cnn.comno Windows quanto host cnn.comno Linux, retorna uma lista de endereços IP; portanto, depende definitivamente da implementação do navegador .
Jonas
5
@ iivel: Não, isso não é verdade. Se eu escrever um programa Java e resolver um nome com InetAddress.getAllByName ("example.com") , obtenho uma lista com todos os endereços IP, para poder optar por iniciar uma conexão TCP com todos eles, se desejar. E é o mesmo se você usar getaddrinfo () em C. Portanto, é definitivamente uma escolha que os desenvolvedores fazem e não o sistema operacional.
Jonas
1
@ J.Money Esta questão está pedindo exatamente sobre a implementação, não como nós pode fazê-lo.
Franklin Yu
0

O sistema operacional determina qual IP usar, não o navegador. O Windows fará o rodízio da lista retornada (na lista retornada pelo DNS), mas continuará usando o mesmo endereço até que o DNS seja liberado ou exceda o tempo limite. * As implementações ix dependem parcialmente da implementação do pacote tcp stack, mas geralmente também seguem um método round robin.

iivel
fonte
2
Não, isso está errado. Se eu escrever um programa Java e resolver um nome InetAddress.getAllByName("example.com"), recebo uma lista com todos os endereços IP, para poder optar por iniciar uma conexão TCP com todos eles, se desejar. E é o mesmo se você usar o getaddrinfo()C. Portanto, é definitivamente uma escolha que os desenvolvedores fazem e não o sistema operacional. O servidor DNS decide apenas em que ordem a lista de endereços IP é retornada.
Jonas
Ok, então você pode fazer manualmente o que quiser com a pilha - você pode até fazer o seu próprio e esquecer o winsock todos juntos. No entanto, se você escrever um aplicativo e deixar o sistema operacional fazer o que deve (abstraia) - o comportamento será o observado. Sua pergunta foi especificamente sobre o comportamento tradicional do aplicativo - não sobre o que é possível. A maioria dos desenvolvedores lida com o uso do nome não resolvido e deixa o sistema operacional fazer o que faz, em vez de unir comportamentos fortemente.
iivel
1
Não sei por que a resposta foi reduzida, mas a pergunta é sobre o que os navegadores fazem. Atualmente, todos os navegadores permitem que o sistema operacional faça a resolução (com exceção de alguns plugins para Firefox e Chrome). Se você deseja obter detalhes sobre como garantir a disponibilidade de um provedor, consulte um balanceador de carga ou cluster.
iivel
Os navegadores provavelmente fazem o que você diz - deixe o sistema operacional fazer a pesquisa de DNS, mas ele retorna uma lista com endereços IP para o navegador. E a pergunta é: o que os navegadores mais populares fazem se o primeiro endereço estiver inacessível? eles tentam o segundo?
Jonas
2
O artigo que você citou por Pete Tenereillo é conhecido por estar desatualizado (na maioria das vezes incorreto atualmente). Com o Chrome, chrome: // net-internals / # dns mostra o cache DNS atual. Não acredito que o sistema operacional sempre determine qual IP usar. Pelo menos com o Chrome, você pode optar por usar AAAA, se disponível, ou apenas A. OP está falando sobre como navegadores selecionar a partir de DNS baseia-se, não como o computador encontrar o seu servidor DNS ....
sdaffa23fdsf