La conexión a IP 0.0.0.0 se realiza correctamente. ¿Cómo? ¿Por qué?


41

Servimos un puerto en localhost y queremos verificar otro proceso si el puerto está disponible. Debido a un error en nuestro código, en realidad está intentando conectarse a la IP 0.0.0.0:<port>y, por alguna razón, tiene éxito, como lo demuestra Strace:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

Qué significa eso? Por que funciona


Respuestas:


68

0.0.0.0 como dirección de destino se refiere a un host no enrutable o "este host" . En la práctica, conectarse a 0.0.0.0 es equivalente a conectarse a localhost. (Estrictamente hablando, no es válido como dirección de destino, solo como dirección de origen, pero la práctica no coincide con la teoría).

Cuando se vincula, "este host" se expande a "cualquier dirección en este host", por lo que las aplicaciones comúnmente aceptan conexiones mediante la vinculación a 0.0.0.0, lo que significa que recibirán paquetes dirigidos a cualquier dirección IPv4 en el sistema.


77
Extender un poco esta respuesta: significa "cualquier dirección IP en este sistema, incluidas las IP que se han agregado después de que comenzó el proceso de escucha"
Criggie

55
localhost es una única dirección, principalmente 127.0.0.1, mientras que 0.0.0.0 significa todas las direcciones en este host.
rexkogitans

@rexkogitans localhost no es una sola dirección, sino cualquier dirección en el rango 127.0.0.0/8, es decir, cualquier dirección desde 127.0.0.0 a 127.255.255.255
Dezza

66
@Dezza No, localhost es 127.0.0.1. 127.0.0.0/8 (como usted dice, también conocido como 127.0.0.0 a 127.255.255.255) es loopback con la mayoría de los equipos, por ejemplo, documentado por RFC 5735 página 4 . (Curiosamente, algunos equipos de Cisco pueden asignar bucle invertido a cualquier dirección, pero por defecto no admiten bucle invertido. No es probable que esto afecte a otros equipos en la red). Sin embargo, localhost es un nombre, que generalmente apunta a un solo dirección que es 127.0.0.1, y comúnmente implementada mediante el uso de un archivo "hosts". Así que no estoy de acuerdo con tu intento de corrección.
TOOGAM

¿Podría aclarar lo que quiere decir con "no es válido como dirección de destino, solo como dirección de origen"? Cuando el servidor mysql escucha en 0.0.0.0, ¿la dirección es el destino o la fuente? ¿No es el destino de una solicitud enviada desde un cliente mysql?
Tim
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.