¿Por qué hay una diferencia entre ping "localhost" y ping "dirección IP local"?

32

Usar cmdy pingen Windows me dio los siguientes resultados:

  • Pinging "localhost":

Ingrese la descripción de la imagen aquí

  • Pinging "192.168.0.10" (dirección IP local):

Ingrese la descripción de la imagen aquí

¿No son las dos situaciones exactamente iguales?

Quiero decir, estoy haciendo ping a la misma interfaz, la misma máquina y la misma dirección. ¿Por qué obtengo resultados tan diferentes?

EDITAR: Aquí está mi ipconfig /allpantalla:

Ingrese la descripción de la imagen aquí

Diogo
fuente
18
No está haciendo ping a la misma interfaz , incluso sin ninguna interfaz física todavía tiene un "host local".
Tamara Wijsman
Si por "la misma interfaz" se refiere a la interfaz de bucle invertido, está en lo correcto. Si te refieres a la interfaz Ethernet, estás equivocado por varias razones. (Por ejemplo, ¿cómo se asocia :: 1 con la interfaz de Ethernet? Y por qué la interfaz de Ethernet, cuyo trabajo es enviar paquetes de Ethernet en el cable y recibirlos desde el cable, estaría involucrada en una operación que nunca involucra un ¿Paquete Ethernet o un cable?)
David Schwartz
Estoy bastante seguro de que esta pregunta se ha hecho antes en Stackoverflow, si puedo encontrarla ...
Chris S
El corazón de esto es respondido por este SO, creo: stackoverflow.com/questions/6938039/…
Dawson Toth
Creo que lo interesante es: ¿por qué obtienes una cantidad de bytes transferidos y un TTL cuando haces ping a un host remoto, pero tampoco cuando haces ping a localhost? Es probable que a nadie le importe que el formato de la dirección IP esté un poco apagado.
dhasenan

Respuestas:

46

No está haciendo ping a la misma interfaz , sin ninguna interfaz física todavía tiene un "host local".

Su localhostse utiliza para referirse a su computadora desde su IP "interna", no desde ninguna IP "externa" de su computadora. Por lo tanto, los paquetes de ping no pasan a través de ninguna interfaz de red física; solo a través de una interfaz virtual de bucle de retorno que envía directamente los paquetes de puerto a puerto sin ningún salto físico.

Todavía puede preguntarse por qué se localhostestá resolviendo ::1, mientras que tradicionalmente esperaríamos que se resuelva en la dirección IPv4 127.0.0.1. Tenga en cuenta que .localhosttradicionalmente es un TLD (consulte RFC 2606 ) que apunta de nuevo a la dirección IP de retorno de bucle (para IPv4, consulte RFC 3330 , especialmente 127.0.0.0/8).

Buscar localhostusando nslookupnos da:

nslookup localhost

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

Por lo tanto, Windows prefiere usar la dirección IP de bucle de retorno de IPv6 ::1(consulte RFC 2373 ), ya que aparece en primer lugar.

Bien, entonces, ¿de dónde viene? Miremos el archivo de hosts.

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

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

Hmm, tenemos que mirar la configuración de DNS de Windows.

Este artículo de KB nos habla sobre una configuración que afecta lo que Windows prefiere, enfatizado en negrita:

  1. En el Editor del registro, busque y haga clic en la siguiente subclave del registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Haga doble clic en DisabledComponents para modificar la entrada DisabledComponents.

    Nota: Si la entrada DisabledComponents no está disponible, debe crearla. Para hacer esto, siga estos pasos:

    1. En el menú Edición, seleccione Nuevo y luego haga clic en Valor DWORD (32 bits).

    2. Escriba DisabledComponents y presione ENTRAR.

    3. Haga doble clic en DisabledComponents.

  3. Escriba cualquiera de los siguientes valores en el campo Información del valor: para configurar el protocolo IPv6 en el estado deseado y luego haga clic en Aceptar:

    • Escriba 0para habilitar todos los componentes de IPv6. (Configuración predeterminada de Windows)
    • Escriba 0xffffffffpara deshabilitar todos los componentes de IPv6, excepto la interfaz de bucle invertido de IPv6. Este valor también configura Windows para que prefiera usar el Protocolo de Internet versión 4 (IPv4) sobre IPv6 al modificar las entradas en la tabla de políticas de prefijo. Para obtener más información, consulte Selección de dirección de origen y destino.
    • Escriba 0x20para preferir IPv4 sobre IPv6 modificando las entradas en la tabla de políticas de prefijos.
    • Escriba 0x10para deshabilitar IPv6 en todas las interfaces que no sean de túnel (tanto en LAN como en las interfaces de protocolo punto a punto [PPP]).
    • Escriba 0x01para deshabilitar IPv6 en todas las interfaces de túnel. Estos incluyen el Protocolo de direccionamiento de túnel automático dentro del sitio (ISATAP), 6to4 y Teredo.
    • Escriba 0x11para deshabilitar todas las interfaces IPv6, excepto la interfaz de bucle invertido IPv6.
  4. Reinicie la computadora para que esta configuración surta efecto.

¿Qué es esta tabla de políticas de prefijo?

netsh interface ipv6 show prefixpolicies(o prefixpolicyen versiones 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 tabla decide qué prefijos tienen prioridad sobre otros prefijos durante la resolución de DNS.

Ah, entonces usando esa KB podríamos agregar entradas aquí que denotan que IPv4 tiene mayor prioridad que IPv6.

Nota: No hay ninguna razón para anular este comportamiento, a menos que tenga problemas de compatibilidad. Cambiar esta configuración en nuestro servidor de Windows rompió nuestro servidor de correo, por lo que debe manejarse con cuidado ...

Tamara Wijsman
fuente
En realidad, 'localhost' no es un dominio de nivel superior, sino un nombre de host. La distinción es extremadamente sutil, pero básicamente cada nombre de dominio es un nombre de host, pero no todos los nombres de host son nombres de dominio. Por convención, los nombres de host que terminan en una parada completa deben ser FQDN, y la mayoría de los nombres de host que no terminan en una parada completa se pueden convertir a FQDN agregando el dominio principal, volviendo a agregar la raíz si es necesario. Sin embargo, esas son solo convenciones. 'localhost' está reservado por RFC 2606, para evitar que se convierta en un TLD, ya que es probable que no funcione correctamente e incluso puede causar problemas.
Kevin Cathcart
2
Incorrecto, como menciona RFC 2606: tenga en 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.cuenta el uso TLDy la nota que se define tradicionalmente . De hecho, ping localhost.funciona lo que confirma que esto es al menos cierto en el contexto de esta pregunta. Su última oración no es lo que dijo el RFC, sírvase citar si "evita que se convierta en un TLD" porque, por lo que dice , es tradicionalmente un TLD. De lo contrario no se referiríanthe .localhost TLD
Tamara Wijsman
Yo era un poco demasiado fuerte. localhostpuede ser un TLD si un servidor DNS real responde por él, pero generalmente localhost se define generalmente como un nombre de host en / etc / hosts, en el que se buscan los nombres de host antes de intentar resolver a través de DNS. Como tal, dig localhostgeneralmente no devuelve un registro "A" para 127.0.0.1, o un registro AAAA para :: 1. Eso significa que el RFC se equivoca cuando dice traditionally been statically defined in host DNS implementations, sino que es devuelto por el servicio de búsqueda de nombres del sistema, que no siempre utiliza el DNS.
Kevin Cathcart
@KevinCathcart: Aquí tenemos una pregunta de Windows, y las versiones de Windows mencionan que esto lo hace el propio DNS. nslookupdevuelve registros. Entonces, YMMV ...
Tamara Wijsman
1
@KevinCathcart mis digdeclaraciones Registros A, AAAA y NS para localhost, incluido un registro de autoridad para:localhost. IN NS localhost.
KutuluMike
20

La interfaz de bucle invertido existe independientemente de su (s) interfaz (es) Ethernet.

Incluso sin la complicación de IPv6 , tendría dos direcciones distintas.

Dirección IPv4 de bucle invertido : 127.0.0.1 Dirección IPv4 de
su interfaz Ethernet: 192.168.0.10

La interfaz de bucle invertido podría estar en una capa de software diferente, más remota que el hardware real. Dudo que dependa de alguna manera de su controlador de interfaz Ethernet específico, por ejemplo.

RedGrittyBrick
fuente
11

Localhost y su dirección IP no son lo mismo.

El localhost es una dirección IP de software especial que está vinculada a su sistema. Localhost, o 127.0.0.1, es una dirección de bucle de retorno. Siempre apunta a su sistema, y ​​solo es accesible desde su computadora. Este enrutamiento se produce a nivel del sistema operativo y definitivamente nunca abandona la NIC ... Por lo tanto, no hay posibilidad de que llegue a la red ...

Hacer ping a su propia dirección IP es similar, pero potencialmente involucra a toda la pila de redes, ya que necesita detectar que es su dirección IP y enrutarla correctamente ...

El efecto debería ser el mismo, pero puede haber diferencias.

Por ejemplo, desconecte su cable de red. Haga ping a su dirección IP estática. Es posible que no obtenga una ruta al host u otros errores. Ahora haga ping localhost o 127.0.0.1, y funcionará.

Benjamin Schollnick
fuente
Entonces, ¿ping localhost es completamente inútil? Quiero decir, si quiero probar mi interfaz ...
Diogo
44
@DiogoRocha correcto, ping localhost no toca el hardware nunca. Es posible que Heck Ping 192.168.0.10 no le brinde información confiable si el controlador de la tarjeta de red intercepta las solicitudes que se le han dado.
Scott Chamberlain
@DiogoRocha Su terminología está desactivada. 127.0.0.1 es una interfaz, pero virtual.
barlop
@Diogo, no del todo. Localhost le permite probar el comportamiento de red de una aplicación, o verificar que la pila de red funciona ... Pero no prueba el controlador. Entonces, por ejemplo, si tiene un mal controlador NIC, localhost podría ayudarlo a demostrar que es el mejor controlador. ¡Sin embargo, su kilometraje definitivamente variará!
Benjamin Schollnick
6

De las capturas de pantalla me doy cuenta de que esta pregunta no se trata de Linux, pero tal vez sea un "caso práctico" útil.

En ese sistema operativo, si hace ping a una de sus direcciones de adaptador local, se traduce al dispositivo de bucle invertido (pirateo de casos especiales). Esto significa que los paquetes realmente van al dispositivo de bucle invertido (que tiene todas las implicaciones que pueda pensar: por ejemplo, desde un punto de vista de firewall, esos paquetes están llegando a la interfaz de bucle invertido y coincidirán con las reglas para esa interfaz).

El dispositivo al que está asignada la IP nunca verá los paquetes. (Esto es bueno porque no haría lo correcto con esos paquetes: querría enviar los retoños).

Sin embargo, si la interfaz que contiene esa IP debería fallar, ha perdido esa conexión. La asignación a loopback dejará de funcionar.

En otras palabras, es un diseño viable considerar esas direcciones locales como alias para el dispositivo de bucle invertido.

Código de referencias:

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

Echa un vistazo a la función ip_route_output_slow. Esto llama fib_lookup, y si esta función devuelve el código RTN_LOCAL, dev_outse reescribe en loopback:

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

Kaz
fuente
4

Parece que el alias "Localhost" se está resolviendo en el bucle invertido de IPv6 y, obviamente, cuando utiliza una dirección IPv4, obviamente no lo hace.

EBGreen
fuente
66
El sistema operativo parece estar en desacuerdo con usted.
EBGreen
66
No importa, aparentemente está configurado para la computadora, localhost está golpeando el loopback ipv6.
Rob
1
@DiogoRocha No existe tal dirección :: 1 en el mundo IPV4. 127.0.0.1 es la IP reservada para el loopback allí. :: 1, sin embargo, EXISTE para IPV6 y, al igual que 127.0.0.1, está reservado para el bucle invertido de IPV6.
Andy
44
¿Cómo responde esto a la pregunta? Solo estás diciendo lo obvio.
Tamara Wijsman
44
Explique su respuesta, esto realmente no explica nada
Ivo Flipse
1

@ebwhite tiene razón sobre qué.

Ahora, el motivo podría ser que tengas configurado Teredo (no puedo distinguirlo de tu captura de pantalla, es mejor conectarlo a un archivo de texto y pegar todo el resultado): el comportamiento de localhost siendo IPv6 es consistente con los sistemas en mi IPv4 solo red con Teredo instalado, pero los sistemas sin él se comportan como espera que llegue 127.0.0.1cuando hace ping localhost. He probado esto con Windows XP y necesito ver qué hacen mis sistemas Windows 7 y actualizar la pregunta.

En general, los sistemas predeterminan a IPv6 si IPv6 está disponible, por lo que su sistema funciona como debería .

Journeyman Geek
fuente
no transfiere Bytes o TTL, con una de las capturas de pantalla, ¿es IPv6? ¿por qué?
barlop
también es consistente con lo que veo en Windows 7 - supongo que el tiempo de ida y vuelta es insignificante
Journeyman Geek