Por que existe uma diferença entre o ping “localhost” e o ping “endereço IP local”?

31

Usar cmd e ping no Windows me deu os seguintes resultados:

  • Ping "localhost":

  • Ping"192.168.0.10" (endereço IP local):

Asduassituaçõesnãosãoexatamenteasmesmas?

Querodizer,estoufazendoopingnamesmainterface,namesmamáquinaenomesmoendereço.Porqueobtenhoresultadostãodiferentes?

EDIT:aquiestáminhatelaipconfig/all:

    
por Diogo 18.04.2012 / 21:23

6 respostas

45

Você não está fazendo ping na mesma interface , sem interfaces físicas você ainda tem um "host local".

Seu localhost é usado para se referir ao seu computador a partir do seu IP "interno", e não de qualquer IP "externo" do seu computador. Portanto, os pacotes de ping não passam por nenhuma interface de rede física; somente através de uma interface virtual de loopback que envia diretamente os pacotes de porta a porta sem nenhum salto físico.

Você ainda pode se perguntar por que localhost está resolvendo para ::1 , enquanto tradicionalmente esperamos que ele seja resolvido 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 , veja RFC 3330 , especialmente 127.0.0.0/8).

Pesquisando localhost usando nslookup nos dá:

nslookup localhost

...
Name:    localhost
Addresses:  ::1
          127.0.0.1

Assim, o Windows prefere usar o endereço IP do loopback IPv6 ::1 (consulte RFC 2373 ) é listado primeiro.

Ok, então, de onde vem, vamos ver o arquivo hosts.

type %WINDIR%\System32\Drivers\Etc\Hosts

...
# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
...

Hmm, temos que ver as configurações de DNS do Windows.

Este artigo da base de conhecimento nos informa sobre uma configuração que afeta o que o Windows prefere, enfatizada em negrito:

  1. In Registry Editor, locate and then click the following registry subkey:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Double-click DisabledComponents to modify the DisabledComponents entry.

    Note: If the DisabledComponents entry is unavailable, you must create it. To do this, follow these steps:

    1. In the Edit menu, point to New, and then click DWORD (32-bit) Value.

    2. Type DisabledComponents, and then press ENTER.

    3. Double-click DisabledComponents.

  3. Type any one of the following values in the Value data: field to configure the IPv6 protocol to the desired state, and then click OK:

    • Type 0 to enable all IPv6 components. (Windows default setting)
    • Type 0xffffffff to disable all IPv6 components, except the IPv6 loopback interface. This value also configures Windows to prefer using Internet Protocol version 4 (IPv4) over IPv6 by modifying entries in the prefix policy table. For more information, see Source and Destination Address Selection.
    • Type 0x20 to prefer IPv4 over IPv6 by modifying entries in the prefix policy table.
    • Type 0x10 to disable IPv6 on all nontunnel interfaces (on both LAN and Point-to-Point Protocol [PPP] interfaces).
    • Type 0x01 to disable IPv6 on all tunnel interfaces. These include Intra-Site Automatic Tunnel Addressing Protocol (ISATAP), 6to4, and Teredo.
    • Type 0x11 to disable all IPv6 interfaces except for the IPv6 loopback interface.
  4. Restart the computer for this setting to take effect.

O que é essa tabela de diretivas de prefixo?

netsh interface ipv6 show prefixpolicies (or prefixpolicy on earlier versions)

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.

Observação: não há motivo para substituir esse comportamento, a menos que você esteja com 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 ...

    
por 18.04.2012 / 22:17
20

A interface de loopback existe independentemente da (s) sua (s) interface (s) Ethernet.

Mesmo sem a complicação de IPv6 , você tem dois endereços distintos.

Endereço de loopback IPv4 : 127.0.0.1
Endereço IPv4 da sua interface Ethernet: 192.168.0.10

A interface de loopback pode estar em uma camada de software diferente, mais remota do hardware real. Duvido que isso dependa de alguma forma do seu driver de interface Ethernet específico, por exemplo.

    
por 18.04.2012 / 21:34
11

Localhost e seu endereço IP não são a mesma coisa.

O localhost é um endereço IP exclusivo do software, que está vinculado ao seu sistema. Localhost, ou 127.0.0.1, é um endereço de loopback. Ele sempre aponta para o seu sistema e só é acessível pelo seu computador. Esse roteamento ocorre no nível do SO e definitivamente nunca sai da NIC ... Portanto, não há chance de ele atingir a rede ...

O ping do seu próprio endereço IP é semelhante, mas envolve potencialmente toda a pilha da rede, pois precisa detectar que é o seu endereço IP e rotear corretamente ...

O efeito deve ser o mesmo, mas pode haver diferenças.

Por exemplo, desconecte seu cabo de rede. Faça um ping no seu endereço IP estático. Você pode não obter rota para hospedar ou outros erros. Agora pingar localhost ou 127.0.0.1, e vai funcionar.

    
por 18.04.2012 / 21:53
6

Eu percebo a partir das imagens que esta pergunta não é sobre o Linux, mas talvez seja um "ponto a ponto" útil.

Nesse SO, se você executar ping em um dos endereços do adaptador local, ele será convertido no dispositivo de loopback (hack do caso especial). Isso significa que os pacotes realmente vão para o dispositivo de loopback (que tem todas as implicações que você pode pensar: por exemplo, de um ponto de vista de firewall, esses pacotes estão chegando na interface de loopback e corresponderão às regras para essa interface). p>

O dispositivo ao qual o IP está atribuído nunca verá os pacotes. (Isso é bom porque não faria a coisa certa com esses pacotes: ele iria querer mandar os otários para fora.)

No entanto, se a interface que mantém o IP cair, você perdeu essa conexão. O mapeamento para o loopback irá parar de funcionar.

Em outras palavras, é um projeto viável considerar esses endereços locais como aliases para o dispositivo de loopback.

Referências de código:

link

Dê uma olhada na função ip_route_output_slow . Isso chama fib_lookup e, se essa função retornar o código RTN_LOCAL , dev_out será reconfigurado para o loopback:

link

    
por 19.04.2012 / 05:01
5

Parece que o alias "Localhost" está resolvendo o loopback IPv6 e, quando você usa explicitamente um endereço IPv4, obviamente não o faz.

    
por 18.04.2012 / 21:25
1

@ebwhite está certo sobre o que.

Agora, o motivo pode ser que você tenha Teredo configurado (não sei dizer a partir da captura de tela, canalização para um arquivo de texto e colando toda a saída é melhor) - o comportamento do localhost sendo IPv6 é consistente com os sistemas em minha rede de IPv4 somente com o teredo instalado, mas os sistemas sem ele se comportam como você espera obter 127.0.0.1 ao pingar% código%. Eu testei isso com o Windows XP e preciso ver o que meus sistemas Windows 7 fazem e atualizar a pergunta.

Geralmente, o padrão do sistema é IPv6 se o IPv6 estiver disponível, portanto, seu sistema está funcionando como deveria por design .

    
por 19.04.2012 / 09:10