La connessione a IP 0.0.0.0 ha esito positivo. Come? Perché?


41

Stiamo servendo una porta su localhost e vogliamo verificare in un altro processo se la porta è disponibile. A causa di un bug nel nostro codice, in realtà sta provando a connettersi all'IP 0.0.0.0:<port>e per qualche motivo ha successo, come dimostra Strace:

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

Cosa significa? Perché funziona


Risposte:


68

0.0.0.0 come indirizzo di destinazione si riferisce in modo diverso a un host non instradabile o a "questo host" . In pratica, la connessione a 0.0.0.0 equivale alla connessione a localhost. (A rigor di termini non è valido come indirizzo di destinazione, ma solo come indirizzo di origine, ma la pratica non corrisponde alla teoria.)

Durante l'associazione, "questo host" si espande in "qualsiasi indirizzo su questo host", pertanto le applicazioni generalmente accettano connessioni vincolando a 0.0.0.0, il che significa che riceveranno pacchetti indirizzati a qualsiasi indirizzo IPv4 sul sistema.


7
Per estendere un po 'questa risposta - significa "qualsiasi indirizzo IP su questo sistema, compresi gli IP che sono stati aggiunti dopo l'avvio del processo di ascolto"
Criggie,

5
localhost è un singolo indirizzo, principalmente 127.0.0.1, mentre 0.0.0.0 indica tutti gli indirizzi su questo host.
rexkogitans,

@rexkogitans localhost non è un singolo indirizzo, ma qualsiasi indirizzo nell'intervallo 127.0.0.0/8 - ovvero qualsiasi indirizzo da 127.0.0.0 a 127.255.255.255
Dezza,

6
@Dezza No, localhost è 127.0.0.1. 127.0.0.0/8 (come dici tu, noto anche come da 127.0.0.0 a 127.255.255.255) è un loopback con la maggior parte delle apparecchiature, ad esempio documentato da RFC 5735 pagina 4 . (È interessante notare che alcune apparecchiature Cisco possono assegnare il loopback a qualsiasi indirizzo, ma per impostazione predefinita non supporta affatto il loopback. Non è probabile che ciò influisca su altre apparecchiature sulla rete.) Tuttavia, localhost è un nome, che in genere indica solo un singolo indirizzo 127.0.0.1 e comunemente implementato utilizzando un file "hosts". Quindi non sono d'accordo con la tua tentata correzione.
TOOGAM,

Potresti chiarire cosa intendi con "non è valido come indirizzo di destinazione, ma solo come indirizzo di origine"? Quando il server mysql è in ascolto su 0.0.0.0, l'indirizzo è la destinazione o l'origine? Non è la destinazione di una richiesta inviata da un client mysql?
Tim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.