¿0.0.0.0:0 y *: * representan lo mismo?

23

Usé netstat (en Windows) para ver los puertos escuchados para TCP y UDP:

ingrese la descripción de la imagen aquí

Noté que en la columna Dirección extranjera , las pantallas UDP en *:*lugar de 0.0.0.0:0, ¿representan estos dos valores la misma cosa? Si es así, ¿por qué se muestra UDP en *:*lugar de 0.0.0.0:0?

usuario612473
fuente
Creo que *:*es IPv6 mientras que 0.0.0.0:0es IPv4.
LPChip 01 de
También he notado lo siguiente: UDP 0.0.0.0:5355 *:*¿eso significa que se pueden enviar datos entre IPv4 e IPv6?
user612473
44
el equivalente de IPv6 de 0.0.0.0 es [::]
marsh-wiggle
2
@LPChip Estás equivocado. *:*no dice nada sobre la versión IP. Sin embargo, dado que la dirección local de ese socket es solo IPv4, entonces la dirección remota también debe ser IPv4.
kasperd 01 de

Respuestas:

12

Se ha señalado que mi respuesta fue un error. Como no puedo eliminarlo, en su lugar proporcionaré el correcto.

La expresión *:*significa "Cualquier dirección, cualquier puerto". Todos los oyentes UDP mostrarán esta firma. Esto se debe a la naturaleza sin conexión de UDP.


Respuesta original (incorrecta). Si y no. *:*se refiere a CUALQUIER dirección IPv6. La distinción entre una dirección desconocida / no especificada es vaga en IPv4, por lo que usamos 0.0.0.0/0 para representar cualquier host en la red, pero en IPv6 hay una sutil diferencia.

Sin embargo, en su mayor parte, las personas usan ::para representar una cadena contigua de ceros.

En una dirección IPv6, cualquier secuencia de ceros contiguos se puede reemplazar por :: lo siguiente:

  • 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

Sin embargo, la representación mediante comodines permite un control más preciso de los patrones de dirección. Por ejemplo, ::no coincidiría fe80::2000:0aff:fea7:0f7c, pero lo *:*hará.

Esta diferencia no es realmente significativa para ningún dispositivo que no esté realizando enrutamiento, pero cuando llega el momento de seleccionar rutas óptimas para espacios de direcciones agregados, la notación comodín permite una selección más flexible de las redes de destino.

Frank Thomas
fuente
55
Pero escribió en su respuesta que *:* refers to ANY IPv6 address Aquí dice, es decir, any..addresspresumiblemente IPv4 o IPv6. Entonces cual es? ¿Se *:*limita a IPv6, o también permite IPv4?
barlop
2
Ambos sockets mencionados en la pregunta son solo para IPv4. Puede ver eso desde la dirección local asignada a cada socket. Como tal, mencionar IPv6 no es relevante para la pregunta.
kasperd 01 de
77
IPv6 no es relevante para esta pregunta en absoluto.
hobbs
8
Esta respuesta es totalmente incorrecta para la pregunta formulada.
Brad
3
Como señala el comentario de kasperd (y el comentario de hobbs también), IPv6 no está relacionado con la pregunta. La pregunta es sobre lo que vemos en la columna Dirección extranjera, que corresponde a lo que está en la (s) misma (s) fila (s) en la columna Dirección local, que es IPv4. (Aunque, con algunos sistemas operativos, escuchar en una familia de direcciones / versión IP generalmente puede escuchar automáticamente en otra familia de direcciones.)
TOOGAM
15

Se /refiere a la máscara de red de subred, que forma parte de la capa de IP.

El se :refiere a un puerto que es parte de la capa de transporte.

Para TCP tiene sentido que haya un extremo remoto para una conexión.

UDP, dado que no tiene conexión, no tiene ningún sentido que muestre una dirección extranjera.

Mi intuición es que siempre mostraría el comodín para UDP y que potencialmente está ahí para hacer que el análisis de la salida sea un poco más amigable, o para mostrar si está utilizando IPv4 / 6:

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

Luke Exton
fuente
Solo les decía esto a algunos amigos. Puede mostrar PUERTOS que escuchan, pero para mostrar sesiones remotas reales cuando no hay una, es probable que la razón por la que se muestre sea *:*para sesiones remotas UDP no existentes. Estoy de acuerdo contigo aquí.
NotAdmin Dave
6

En ambos casos, la información básicamente no tiene sentido, pero indica más o menos lo mismo.

Su primera línea es un socket de escucha TCP. La columna de dirección local indica la dirección y el puerto en el que está aceptando conexiones, y la columna de dirección remota no significa nada porque un socket de escucha aún no tiene un extremo remoto de la conexión. Un socket TCP conectado mostraría la dirección del otro extremo de la conexión en esa columna, pero para un socket de escucha decide mostrar una dirección y un puerto todos cero.

Su segunda línea es un socket UDP. UDP es un protocolo sin conexión, lo que significa que envía y recibe paquetes sin ninguna noción de quién se conectó a quién, si el paquete es parte de una conversación existente o si los datos acaban de llegar de la nada. La columna de dirección local tiene el mismo significado que para TCP, y la columna de dirección remota no tiene sentido porque un socket UDP podría tener un par, muchos pares o ningún par en cualquier momento. (En realidad, POSIX tiene la noción de un "socket UDP conectado", pero eso está un poco lejos).

Ahora la pregunta: ¿por qué se muestran de manera diferente? Parece que no es más que una peculiaridad del código netstat de Windows. Linux (herramientas de red) netstat se muestra 0.0.0.0:*para el extremo remoto de los sockets de escucha TCP y los sockets UDP (para IPv4; se muestra :::*para IPv6), que es diferente de cualquier ejemplo en Windows, pero al menos es consistente dentro del mismo programa. Tal vez Windows esté buscando una distinción semántica entre "que se completará más adelante" en el caso de TCP y "abierto a cualquier cosa" en el caso de UDP, pero igual de probable que los dos bits de código fueron escritos por dos personas diferentes sin preocupación particular por la consistencia.

hobbs
fuente
+1 para el inicio del cuarto párrafo. 0.0.0.0 tiene cierta documentación: una dirección de todos los ceros es la dirección "no especificada" (de acuerdo con el IPv6 Addressing RFC 4291 sec 2.5.2 ), que a menudo se aplica a direcciones desconocidas. RFC 1700 página 4 menciona "Solo se puede usar como una dirección de origen", y RFC 1122 # página-29 sección "a" describe el uso más a fondo. ( mi respuesta sobre ::: menciona 0.0.0.0)
TOOGAM
¿El 0.0.0.0:0valor en la columna Dirección extranjera no significa que cualquier dirección IP y número de puerto puede enviar datos a este socket? y si este valor fue, por ejemplo 127.0.0.0:12345, ¿significa que solo la dirección IP 127.0.0.0con el número de puerto 12345puede enviar datos a este socket y nadie más?
Tom
6

La diferencia es simplemente de notación.

Netstat en Windows se utiliza 0.0.0.0:0para representar una idea abstracta de "cualquier dirección remota y puerto" para un oyente TCP local IPv4 y *:*para un oyente UDP. Para IPv6, la dirección remota se denota por [::]:0TCP y *:*UDP.

En OS X, *.*se usa tanto para TCP como para UDP, ya sea IPv4 o IPv6 (tenga en cuenta que OS X usa puntos para separar la dirección y el puerto). Linux utiliza 0.0.0.0:*para IPv4 y :::*para IPv6, con los dos primeros puntos que representan la abreviatura de todas las direcciones IPv6 y el tercer punto el separador entre la dirección y el puerto.

IIRC de algo que escuché o leí hace mucho tiempo, creo que los emparejamientos UDP pueden aparecer, pero generalmente no porque se rompen al finalizar y las conexiones UDP son generalmente muy cortas, duran milisegundos o menos. Sin embargo, nunca he visto esto, así que podría ser incorrecto.

NetworkLlama
fuente