0.0.0.0:0 e *: * rappresentano la stessa cosa?


23

Ho usato netstat (in Windows) per visualizzare le porte ascoltate per TCP e UDP:

inserisci qui la descrizione dell'immagine

Ho notato che nella colonna Indirizzo esterno viene visualizzato UDP *:*anziché 0.0.0.0:0, questi due valori rappresentano la stessa cosa? In tal caso, perché viene visualizzato UDP *:*anziché 0.0.0.0:0?


Credo che *:*sia IPv6 mentre 0.0.0.0:0è IPv4.
LPChip

Ho notato anche quanto segue: UDP 0.0.0.0:5355 *:*Significa che i dati possono essere inviati tra IPv4 e IPv6?
user612473


4
l'equivalente IPv6 di 0.0.0.0 è [::]
marsh-wiggle l'

2
@LPChip Ti sbagli. *:*non dice nulla sulla versione IP. Tuttavia, poiché l'indirizzo locale di quel socket è solo IPv4, anche l'indirizzo remoto deve essere IPv4.
Kasperd,

Risposte:


12

È stato sottolineato che la mia risposta era errata. Dal momento che non posso eliminarlo, fornirò invece quello corretto.

L'espressione *:*significa "Qualsiasi indirizzo, qualsiasi porta". Tutti i listener UDP visualizzeranno questa firma. Ciò è dovuto alla natura senza connessione di UDP.


Risposta originale (errata). Sì e no. *:*si riferisce a QUALSIASI indirizzo IPv6. La distinzione tra un indirizzo sconosciuto / non specificato è vaga in IPv4, quindi usiamo 0.0.0.0/0 per rappresentare qualsiasi host sulla rete, ma in IPv6 c'è una sottile differenza.

Per la maggior parte, tuttavia, le persone usano ::rappresentare una stringa contigua di 0.

In un indirizzo IPv6, qualsiasi sequenza di zeri contigui può essere sostituita con :: così:

  • 0.0.0.0/0=> 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0000 => ::=>*:*
  • fe80:0000:0000:0000:2000:0aff:fea7:0f7c => fe80::2000:0aff:fea7:0f7c

La rappresentazione mediante caratteri jolly consente tuttavia un controllo più preciso dei modelli di indirizzo. Ad esempio, ::non corrisponderebbe fe80::2000:0aff:fea7:0f7c, ma lo *:*farà.

Questa differenza non è davvero significativa per nessun dispositivo che non sta eseguendo il routing, ma quando arriva il momento di selezionare percorsi ottimali verso spazi di indirizzi aggregati, la notazione con caratteri jolly consente una selezione più flessibile delle reti di destinazione.


5
Ma nella tua risposta hai scritto che *:* refers to ANY IPv6 address qui dici, any..addresspresumibilmente, IPv4 o IPv6. Quindi che cos'è? Si sta *:*limitando a IPv6 o consente anche IPv4?
barlop

2
Entrambi i socket citati nella domanda sono solo IPv4. Puoi vederlo dall'indirizzo locale assegnato a ciascun socket. Pertanto, menzionare IPv6 non è rilevante per la domanda.
Kasperd,

7
IPv6 non è affatto rilevante per questa domanda.
Hobbs

8
Questa risposta è totalmente sbagliata per la domanda posta.
Brad

3
Come osserva il commento di Kasperd (e anche il commento di Hobbs ), IPv6 non è correlato alla domanda. La domanda riguarda ciò che vediamo nella colonna Indirizzo esterno, che corrisponde a ciò che si trova nelle stesse righe nella colonna Indirizzo locale, che è IPv4. (Anche se, con alcuni sistemi operativi, l'ascolto su una famiglia di indirizzi / versione IP può in genere ascoltare automaticamente su un'altra famiglia di indirizzi.)
TOOGAM

15

Si /riferisce alla maschera di rete della sottorete, che fa parte del livello IP.

Il :riferimento a una porta che fa parte del livello di trasporto.

Per TCP ha senso che esiste una fine remota per una connessione.

UDP, dato che è privo di connessione, non ha senso mostrare un indirizzo estero.

La mia impressione è che mostrerebbe sempre il carattere jolly per UDP e che sia potenzialmente lì per rendere l'analisi dell'output un po 'più amichevole, o per mostrare se stai usando IPv4 / 6:

IPV4 "*:*" vs IPV6 "[::]:*"


Lo stavo solo dicendo ad alcuni amici. È possibile visualizzare PORTS in ascolto, ma visualizzare sessioni remote effettive quando non ce n'è una è probabilmente il motivo per cui viene visualizzato come *:*per sessioni inesistenti UDP remote. Sono d'accordo con te qui.
NotAdmin Dave,

6

In entrambi i casi l'informazione è sostanzialmente insignificante, ma indica più o meno la stessa cosa.

La tua prima linea è un socket di ascolto TCP. La colonna dell'indirizzo locale indica l'indirizzo e la porta su cui accetta le connessioni e la colonna dell'indirizzo remoto non significa nulla perché un socket di ascolto non ha ancora una fine remota della connessione. Un socket TCP collegato mostrerebbe l'indirizzo dell'altra estremità della connessione in quella colonna, ma per un socket di ascolto decide di visualizzare un indirizzo e una porta tutti zero.

La tua seconda linea è un socket UDP. UDP è un protocollo senza connessione, il che significa che invia e riceve pacchetti senza alcuna idea di chi sia connesso a chi, se il pacchetto fa parte di una conversazione esistente o se i dati sono appena arrivati ​​all'improvviso. La colonna dell'indirizzo locale ha lo stesso significato che ha per il TCP e la colonna dell'indirizzo remoto non ha senso perché un socket UDP può avere un peer, molti peer o nessun peer in qualsiasi momento. (In realtà POSIX ha la nozione di "socket UDP collegato" ma si sta allontanando un po ').

Ora la domanda: perché vengono visualizzati in modo diverso? Sembra essere nient'altro che una stranezza del codice netstat di Windows. Linux (net-tools) netstat viene visualizzato 0.0.0.0:*per la fine remota di socket di ascolto TCP e socket UDP (per IPv4; viene visualizzato :::*per IPv6), che è diverso da entrambi gli esempi su Windows, ma almeno è coerente all'interno dello stesso programma. Forse Windows sta cercando una distinzione semantica tra "da compilare in seguito" nel caso di TCP e "aperto a qualsiasi cosa" nel caso di UDP, ma altrettanto probabilmente i due bit di codice sono stati scritti da due persone diverse senza particolare preoccupazione per la coerenza.


+1 per l'inizio del 4 ° paragrafo. 0.0.0.0 ha un po 'di documentazione: un indirizzo di tutti gli zeri è l'indirizzo "non specificato" (secondo l'Indirizzo IPv6 RFC 4291 sec 2.5.2 ), spesso applicato a indirizzi sconosciuti. RFC 1700 pagina 4 menziona "Può essere usato solo come indirizzo sorgente" e RFC 1122 # pagina-29 sezione "a" descrive ulteriormente l'utilizzo. (la mia risposta su ::: menziona 0.0.0.0)
TOOGAM il

Il 0.0.0.0:0valore nella colonna Indirizzo esterno indica che qualsiasi indirizzo IP e numero di porta possono inviare dati a questo socket? e se questo valore fosse ad esempio 127.0.0.0:12345, ciò significa che solo l'indirizzo IP 127.0.0.0con il numero di porta 12345può inviare dati a questo socket e nessun altro?
Tom

6

La differenza è semplicemente notazionale.

Netstat in Windows utilizza 0.0.0.0:0per rappresentare un'idea astratta di "qualsiasi indirizzo e porta remoti" per un listener TCP IPv4 locale e *:*per un listener UDP. Per IPv6, l'indirizzo remoto è indicato da [::]:0TCP e *:*UDP.

In OS X, *.*viene utilizzato sia per TCP che per UDP, sia IPv4 che IPv6 (notare che OS X utilizza punti per separare indirizzo e porta). Linux utilizza 0.0.0.0:*per IPv4 e :::*per IPv6, con i primi due due punti che rappresentano l'abbreviazione di tutti gli indirizzi IPv6 e i terzi due punti il ​​separatore tra l'indirizzo e la porta.

IIRC da qualcosa che ho sentito o letto molto tempo fa, penso che gli accoppiamenti UDP possano comparire, ma di solito non lo fanno perché vengono demoliti al completamento e le connessioni UDP sono in genere molto brevi, durano millisecondi o meno. Non l'ho mai visto da solo, quindi potrebbe essere errato.

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.