Verbindung zu IP 0.0.0.0 erfolgreich. Wie? Warum?

41

Wir bedienen einen Port auf localhost und möchten einen anderen Prozess einchecken, ob der Port verfügbar ist. Aufgrund eines Fehlers in unserem Code wird tatsächlich versucht, eine Verbindung zur IP 0.0.0.0:<port>herzustellen, und aus irgendeinem Grund gelingt dies - wie strace beweist:

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

Was heißt das? Warum funktioniert es?

erikbwork
quelle

Antworten:

68

0.0.0.0 als Zieladresse bezieht sich auf einen nicht routbaren Host oder auf „diesen Host“ . In der Praxis entspricht das Herstellen einer Verbindung mit 0.0.0.0 dem Herstellen einer Verbindung mit localhost. (Genau genommen ist es nicht als Zieladresse gültig, sondern nur als Quelladresse, aber die Praxis stimmt nicht mit der Theorie überein.)

Beim Binden wird „dieser Host“ zu „einer beliebigen Adresse auf diesem Host“ erweitert. Daher akzeptieren Anwendungen Verbindungen in der Regel durch Binden an 0.0.0.0. Dies bedeutet, dass sie Pakete erhalten, die an eine beliebige IPv4-Adresse im System gerichtet sind.

Stephen Kitt
quelle
7
Um diese Antwort ein wenig zu erweitern: "Jede IP-Adresse auf diesem System, einschließlich der IPs, die nach dem Start des
Abhörvorgangs
5
localhost ist eine einzelne Adresse, meistens 127.0.0.1, während 0.0.0.0 alle Adressen auf diesem Host bedeutet.
rexkogitans
@rexkogitans localhost ist keine einzelne Adresse, sondern eine beliebige Adresse im Bereich 127.0.0.0/8 - dh eine beliebige Adresse von 127.0.0.0 bis 127.255.255.255
Dezza
6
@Dezza Nein, localhost ist 127.0.0.1. 127.0.0.0/8 (wie Sie sagen, auch bekannt als 127.0.0.0 bis 127.255.255.255) ist ein Loopback mit den meisten Geräten, z. B. dokumentiert durch RFC 5735, Seite 4 . (Interessanterweise können einige Cisco-Geräte jeder Adresse ein Loopback zuweisen, unterstützen jedoch standardmäßig überhaupt kein Loopback. Dies hat jedoch wahrscheinlich keine Auswirkungen auf andere Geräte im Netzwerk.) Localhost ist jedoch ein Name, der in der Regel nur auf eine einzelne Adresse verweist Die Adresse lautet 127.0.0.1 und wird normalerweise mithilfe einer "Hosts" -Datei implementiert. Deshalb bin ich mit Ihrem Korrekturversuch nicht einverstanden.
TOOGAM
Können Sie klarstellen, was Sie unter "Es ist nicht als Zieladresse, sondern nur als Quelladresse gültig" verstehen? Wenn der MySQL-Server auf 0.0.0.0 lauscht, ist dies das Ziel oder die Quelle der Adresse? Ist es nicht das Ziel einer Anfrage, die von einem MySQL-Client gesendet wurde?
Tim