A sessão de perguntas e respostas de hoje nos é oferecida por cortesia do SuperUser, uma subdivisão do Stack Exchange, um agrupamento de sites de perguntas e respostas conduzido pela comunidade.
A questão
Leitor de SuperUser O Diogo quer saber porque o comando ping trata o localhost e o endereço IP local de forma diferente quando, na superfície, parecem ser a mesma coisa:
Using cmd and ping on Windows gave me the following results:
Pinging “localhost”:
I mean, I’m pinging the same interface, the same machine and the same address. Why do I get such different results?
Obviamente, há uma diferença de algum tipo, mas o que exatamente está acontecendo quando você alterna entre os dois?
A resposta
O colaborador do SuperUser, Tom Wijsman, oferece a seguinte percepção das sutis diferenças entre os dois:
You are not pinging the same interface, without any physical interfaces you still have a “local host”.
Your
localhost
é usado para se referir ao seu computador a partir do seu IP "interno", e não de qualquer IP "externo" do seu computador. Assim, os pacotes de ping não passam por nenhuma interface de rede física; somente através de uma interface de loop back virtual que envia diretamente os pacotes de porta a porta sem nenhum salto físico.
Você ainda pode se perguntar por que
localhost
está resolvendo
::1
enquanto tradicionalmente esperávamos resolver para o endereço IPv4
127.0.0.1
. Observe que
.localhost
é tradicionalmente um TLD (consulte RFC 2606) que aponta para o endereço IP de loopback (para IPv4, consulte RFC 3330, especialmente 127.0.0.0/8).
Olhando pra cima
localhost
usando
nslookup
nos dá:
nslookup localhost
… Name: localhost Addresses:::1 127.0.0.1
Assim, o Windows prefere usar o endereço IP de loop back IPv6
::1
(veja RFC 2373) como é listado primeiro.
Ok, então, de onde vem, vamos ver o arquivo hosts.
type %WINDIR%System32DriversEtcHosts
… # localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost #::1 localhost …
Hmm, temos que olhar para as configurações de DNS do Windows.
Este artigo da KB nos informa sobre uma configuração que afeta o que o Windows prefere, enfatizada em negrito:
-
No Editor do Registro, localize e clique na seguinte subchave do Registro:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpip6Parameters
-
Clique duas vezes em DisabledComponents para modificar a entrada DisabledComponents.Nota: Se a entrada DisabledComponents não estiver disponível, você deverá criá-la. Para fazer isso, siga estas etapas:
- No menu Editar, aponte para Novo e clique em Valor DWORD (32 bits).
- Digite DisabledComponents e, em seguida, pressione ENTER.
- Clique duas vezes em DisabledComponents.
-
Digite qualquer um dos seguintes valores no campo Dados do valor: para configurar o protocolo IPv6 para o estado desejado e, em seguida, clique em OK:
-
Tipo
0
para ativar todos os componentes do IPv6. (Configuração padrão do Windows)
-
Tipo
0xffffffff
para desabilitar todos os componentes IPv6, exceto a interface de loopback IPv6. Esse valor também configura o Windows para preferir usar o Protocolo da Internet versão 4 (IPv4) sobre IPv6, modificando as entradas na tabela de diretivas de prefixo. Para mais informações, consulte Seleção de endereço de origem e destino.
-
Tipo
0x20
para preferir o IPv4 ao IPv6, modificando as entradas na tabela de diretivas de prefixo.
-
Tipo
0x10
para desabilitar o IPv6 em todas as interfaces não-centrais (nas interfaces LAN e PPP [Point-to-Point Protocol]).
-
Tipo
0x01
para desabilitar o IPv6 em todas as interfaces de túnel. Estes incluem o protocolo ISATAP, 6to4 e Teredo.
-
Tipo
0x11
para desabilitar todas as interfaces IPv6, exceto a interface de loopback IPv6.
- Reinicie o computador para que essa configuração entre em vigor.
O que é essa tabela de diretivas de prefixo?
netsh interface ipv6 show prefixpolicies
(ou
prefixpolicy
em versões anteriores)
Precedence Label Prefix ---------- ----- -------------------------------- 50 0::1/128 45 13 fc00::/7 40 1::/0 10 4::ffff:0:0/96 7 14 2002::/16 5 5 2001::/32 1 11 fec0::/10 1 12 3ffe::/16 1 10::/96
Esta tabela decide quais prefixos têm precedência sobre outros prefixos durante as resoluções de DNS.
Ah, então, usando essa KB, podemos adicionar entradas aqui que indicam que o IPv4 tem precedência mais alta que o IPv6.
Nota: Não há motivo para substituir esse comportamento, a menos que você esteja tendo problemas de compatibilidade. Mudar esta configuração no nosso Windows Server quebrou o nosso servidor de e-mail, por isso deve ser manuseado com cuidado…
Não há nada que gostemos mais do que uma resposta completa e informativa com os documentos de suporte vinculados. Claramente, o localhost e o endereço IP local são entidades distintas, servem a propósitos diferentes e agora todos sabemos por quê.
Tem algo a acrescentar à explicação? Soe fora nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui.