Por que existe uma diferença entre o ping "localhost" e o ping "local IP address"?

32

Usar cmde pingno Windows me deu os seguintes resultados:

  • Pingando "localhost":

Digite a descrição da imagem aqui

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

Digite a descrição da imagem aqui

As duas situações não são exatamente iguais?

Quero dizer, estou executando ping na mesma interface, na mesma máquina e no mesmo endereço. Por que obtenho resultados tão diferentes?

EDIT: Aqui está minha ipconfig /alltela:

Digite a descrição da imagem aqui

Diogo
fonte
18
Você não está executando ping na mesma interface , mesmo sem nenhuma interface física, você ainda possui um "host local".
Tamara Wijsman
Se por "a mesma interface", você quer dizer a interface de loopback, você está correto. Se você se refere à interface Ethernet, está errado por vários motivos. (Por exemplo, como :: 1 está associado à interface Ethernet? E por que a interface Ethernet - cuja tarefa é enviar pacotes Ethernet no fio e recebê-los do fio - estaria envolvida em uma operação que nunca envolve um Ethernet de pacotes ou um fio)?
David Schwartz
Estou bastante certo de esta pergunta foi feita em Stackoverflow antes, se eu posso encontrá-lo ...
Chris S
O coração deste é respondida por este SO, eu acredito: stackoverflow.com/questions/6938039/...
Dawson Toth
Eu acho que o interessante é: por que você recebe um número de bytes transferidos e um TTL ao executar ping em um host remoto, mas também não ao executar ping em host local? É provável que ninguém se preocupe com o formato do endereço IP.
dhasenan

Respostas:

46

Você não está executando ping na mesma interface , sem nenhuma interface física, você ainda possui um "host local".

Seu localhosté usado para se referir ao seu computador a partir do IP "interno", não de nenhum 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 de loop back virtual que envia diretamente os pacotes de porta em porta sem nenhum salto físico.

Você ainda pode se perguntar por que localhostestá resolvendo ::1, enquanto tradicionalmente esperamos que ele resolva para o endereço IPv4 127.0.0.1. Observe que .localhosttradicionalmente é um TLD (consulte a RFC 2606 ) que aponta para o endereço IP de loopback (para IPv4, consulte a RFC 3330 , especialmente 127.0.0.0/8).

Olhar para cima localhostusando nslookupnos fornece:

nslookup localhost

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

Portanto, o Windows prefere usar o endereço IP de retorno de loop IPv6 ::1(consulte RFC 2373 ), conforme listado primeiro.

Ok, então, de onde ele vem, vamos dar uma olhada no 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 olhar para as configurações de DNS do Windows.

Este artigo da KB nos fala sobre uma configuração que afeta o que o Windows prefere, enfatizada em negrito:

  1. No Editor do Registro, localize e clique na seguinte subchave do Registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Clique duas vezes em DisabledComponents para modificar a entrada DisabledComponents.

    Nota: Se a entrada DisabledComponents estiver indisponível, você deverá criá-la. Para fazer isso, execute as seguintes etapas:

    1. No menu Editar, aponte para Novo e clique em Valor DWORD (32 bits).

    2. Digite DisabledComponents e, em seguida, pressione ENTER.

    3. Clique duas vezes em DisabledComponents.

  3. Digite qualquer um dos seguintes valores no campo Dados do valor: para configurar o protocolo IPv6 para o estado desejado e clique em OK:

    • Digite 0para ativar todos os componentes IPv6. (Configuração padrão do Windows)
    • Digite 0xffffffffpara desativar todos os componentes IPv6, exceto a interface de loopback IPv6. Esse valor também configura o Windows para preferir usar o IPv4 (Internet Protocol versão 4) em vez do IPv6, modificando as entradas na tabela de políticas de prefixo. Para mais informações, consulte Seleção de endereço de origem e destino.
    • Digite 0x20para preferir o IPv4 sobre o IPv6, modificando as entradas na tabela de políticas de prefixo.
    • Digite 0x10para desativar o IPv6 em todas as interfaces não-túneis (nas interfaces LAN e Protocolo Ponto a Ponto [PPP]).
    • Digite 0x01para desativar o IPv6 em todas as interfaces de túnel. Isso inclui o protocolo ISATAP (6A4) e o Teredo.
    • Digite 0x11para desativar todas as interfaces IPv6, exceto a interface de loopback IPv6.
  4. Reinicie o computador para que essa configuração entre em vigor.

O que é essa tabela de política de prefixo?

netsh interface ipv6 show prefixpolicies(ou prefixpolicyem 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 a resolução do DNS.

Ah, então, usando esse KB, poderíamos 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 enfrentando problemas compatíveis. A alteração dessa configuração em nosso Windows Server interrompeu nosso servidor de correio, portanto deve ser manuseada com cuidado ...

Tamara Wijsman
fonte
Na verdade, 'localhost' não é um domínio de nível superior, mas um nome de host. A distinção é extremamente sutil, mas basicamente todo nome de domínio é um nome de host, mas nem todos os nomes de host são nomes de domínio. Por convenção, os nomes de host que terminam em uma parada completa devem ser FQDN, e a maioria dos nomes de host que não terminam em um ponto final pode ser convertida em FQDN anexando o domínio pai, voltando a anexar a raiz, se necessário. No entanto, essas são apenas convenções. O 'localhost' é reservado pela RFC 2606, para impedir que se torne um TLD, pois provavelmente não funcionará corretamente e pode até causar problemas.
precisa
2
Incorreto, como RFC 2606 menciona: The ".localhost" TLD has traditionally been statically defined in host DNS implementations as having an A record pointing to the loop back IP address and is reserved for such use. Observe o uso TLDe observe que é tradicionalmente definido . De fato, ping localhost.trabalhos que confirmam que isso é pelo menos verdadeiro no contexto desta questão. Sua última frase não é o que a RFC disse; por favor, cite se ela "impede que ela se torne um TLD" porque, pelo que diz , é tradicionalmente um TLD. Então eles não se referem athe .localhost TLD
Tamara Wijsman
Eu estava um pouco forte demais. localhostpode ser um TLD se um servidor DNS real responder por isso, mas geralmente localhost é geralmente definido como um nome de host em / etc / hosts, no qual os nomes de host são pesquisados ​​antes de tentar resolver por DNS. Como tal, dig localhostgeralmente não retorna um registro "A" para 127.0.0.1 ou um registro AAAA para :: 1. Isso significa que a RFC está enganada quando diz traditionally been statically defined in host DNS implementations, mas é retornada pelo serviço de pesquisa de nomes do sistema, que nem sempre usa o DNS.
21812 Kevin Cathcart
@ KevinCathcart: Estamos em uma pergunta do Windows aqui, e as versões do Windows mencionam que isso é feito pelo próprio DNS. nslookupretorna registros. Então, YMMV ...
Tamara Wijsman
1
@KevinCathcart meus digretornos A, AAAA e NS registra para localhost, incluindo um registro de autoridade para:localhost. IN NS localhost.
KutuluMike
20

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

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

Endereço IPv4 de loopback : 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 dependa de alguma forma do seu driver de interface Ethernet específico, por exemplo.

RedGrittyBrick
fonte
11

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

O host local é um endereço IP exclusivo de software especial, vinculado ao seu sistema. Localhost, ou 127.0.0.1, é um endereço de loop back. Ele sempre aponta para o seu sistema e só pode ser acessado no seu computador. Esse roteamento ocorre no nível do sistema operacional e, definitivamente, nunca sai da NIC ... Portanto, não há chance de atingir a rede ....

O ping do seu próprio endereço IP é semelhante, mas potencialmente envolve toda a pilha de rede, pois ele precisa detectar que é o seu endereço IP e encaminhá-lo corretamente ...

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

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

Benjamin Schollnick
fonte
Então, o ping localhost é completamente inútil? Quer dizer, se eu quero testar minha interface ....
Diogo
4
@DiogoRocha correto, o ping localhost nunca toca no hardware. Heck ping 192.168.0.10 também pode não fornecer informações confiáveis ​​se o driver da placa de rede interceptar solicitações feitas a si mesma.
Scott Chamberlain
@DiogoRocha Sua terminologia está desativada. 127.0.0.1 é uma interface, mas virtual.
barlop
@ Diego, não exatamente. O Localhost permite testar o comportamento de rede de um aplicativo ou verificar se a pilha de rede está funcionando .... Mas não testa o driver. Por exemplo, se você tiver um driver de NIC ruim, o localhost poderá ajudar a provar que é o driver correto. Sua milhagem definitivamente variará embora !!
Benjamin Schollnick 16/05
6

Percebo pelas capturas de tela que esta pergunta não é sobre Linux, mas talvez seja um "caso em questão" útil.

Nesse sistema operacional, se você executar ping em um dos endereços do adaptador local, ele será convertido para o dispositivo de loopback (caso especial hack). 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, do ponto de vista do firewall, esses pacotes estão chegando na interface de loopback e corresponderão às regras dessa interface).

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: desejaria enviar os otários para fora).

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

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

Referências de código:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

Dê uma olhada na função ip_route_output_slow. Isso chama fib_lookupe, se essa função retorna o código RTN_LOCAL, dev_outé reescrito para loopback:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769

Kaz
fonte
4

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

EBGreen
fonte
6
O sistema operacional parece discordar de você.
precisa
6
Não importa, aparentemente está configurado para o computador, o host local está atingindo o loopback do ipv6.
18712 Rob
1
@DiogoRocha Não existe esse endereço :: 1 no mundo IPV4. 127.0.0.1 é o IP reservado para o loopback lá. :: 1, no entanto, existe para o IPV6 e, como 127.0.0.1, é reservado para o loopback do IPV6.
18712 Andy
4
Como isso responde à pergunta? Você está apenas afirmando o óbvio.
Tamara Wijsman
4
Por favor elaborar sobre sua resposta, isso realmente não explica nada
Ivo Flipse
1

@ebwhite está certo sobre o que.

Agora, o motivo pode ser o fato de você ter configurado o Teredo (não sei da sua captura de tela, canalizando-o para um arquivo de texto e colando toda a saída é melhor) - o comportamento do host local sendo IPv6 é consistente com os sistemas no meu Rede IPv4 apenas com o teredo instalado, mas os sistemas sem ele se comportam conforme o esperado 127.0.0.1quando você faz ping localhost. Eu testei isso com o Windows XP e preciso ver o que meus sistemas Windows 7 fazem e atualizar a pergunta.

Geralmente, os sistemas usam o IPv6 como padrão se o IPv6 estiver disponível; portanto, seu sistema está funcionando como deveria .

Journeyman Geek
fonte
ele não transfere bytes ou TTL, com uma das capturas de tela, é IPv6? porque?
barlop
Também consistant com o que eu vejo no windows 7 - meu palpite é o tempo de ida e volta é insignificante
Journeyman Geek