¿Es posible conectarse al puerto TCP 0?

59

Escuchar el puerto TCP 0 me asigna un número de puerto libre en el sistema.

¿Pero qué sucede cuando intento conectarme al puerto TCP 0? La respuesta obvia es: "No funciona":

$ nc localhost 0                 
nc: port number too small: 0

¿En qué parte del sistema se maneja esto? ¿En la pila TCP del núcleo del sistema operativo? ¿Hay Unixes donde funcionaría la conexión al puerto TCP 0?

nh2
fuente
2
En teoría, podría crear una pila TCP personalizada en la que funciona escuchar en o conectarse desde el puerto 0, lo que significa que dos de estas implementaciones podrían comunicarse entre sí en el puerto 0.
Joshua

Respuestas:

60

Solo para asegurarnos de que estamos en la misma página (su pregunta es ambigua de esta manera), solicitar vincular TCP en el puerto 0 indica una solicitud para generar dinámicamente un número de puerto no utilizado. En otras palabras, el número de puerto que está escuchando después de esa solicitud no es cero. Hay un comentario sobre esto en [linux kernel source]/net/ipv4/inet_connection_sock.cel inet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

Que es una convención estándar de Unix. Podría haber sistemas que realmente permitan el uso del puerto 0, pero eso se consideraría una mala práctica. Sin embargo, este comportamiento no está oficialmente especificado por POSIX, IANA o el protocolo TCP. 1 Puede encontrar esto interesante .

Es por eso que no puede hacer una conexión TCP al puerto cero. Presumiblemente nces consciente de esto y le informa que está haciendo una solicitud sin sentido. Si intenta esto en código nativo:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

Obtiene el mismo error que intentaría conectarse a cualquier otro puerto no disponible: ECONNREFUSED"Conexión rechazada". Entonces en respuesta a:

¿En qué parte del sistema se maneja esto? ¿En la pila TCP del núcleo del sistema operativo?

Probablemente no; No requiere un manejo especial. Es decir, si puede encontrar un sistema que permita enlazar y escuchar en el puerto 0, presumiblemente podría conectarse a él.


1. Pero IANA se refiere a él como "Reservado" ( ver aquí ). Es decir, este puerto no debe usarse en línea. Eso lo hace correcto con respecto a la convención de asignación dinámica (ya que en realidad no se usará). Estipular eso específicamente como un propósito probablemente estaría más allá del alcance de la IANA; En esencia, los sistemas operativos son libres de hacer lo que quieran con él, sin incluir nada.

encerrada dorada
fuente
Parece la misma idea que la dirección 0.0.0.0 en ipv4. Un valor reservado, y utilizado por el sistema operativo y los programas para un propósito especial. Como analogía, en la radio hay frecuencias reservadas que nadie usa para las transmisiones, pero que se usan internamente en los equipos.
ctrl-alt-delor
1
@richard no, 0.0.0.0 tiene un significado diferente;) se utiliza para designar un objetivo no válido, desconocido o no aplicable o como "difusión"
AndreaCi
2
@AndreaCi no se transmitió 255.255.255.255?
Ratchet Freak
44
@ratchetfreak 255.255.255.255 se transmite. 0.0.0.0 tiene dos significados según el contexto. En la programación también es w / INADDR_ANY, que es a lo que Richard se refiere (el sistema lo reemplazará por defecto). Pero en realidad, usar la dirección en una red parece tener las implicaciones que Andrea menciona (excepto que no es tan claro que cuente como "broadcast"): en.wikipedia.org/wiki/0.0.0.0
goldilocks
5

El uso del puerto 0 activa el sistema operativo para buscar y asignar el siguiente puerto disponible. Esto evita que tenga que codificar un puerto específico o tener que buscar un puerto disponible. Mi sistema Linux Mint regresa

nc: port range not valid

a

nc localhost 0 
MichaelJohn
fuente
2

nc -l 0le pedirá al sistema operativo que escuche en el puerto 0. Pero como se ha señalado anteriormente, la mayoría de los sistemas operativos verán el 0 e invocarán sus costumbres particulares para elegir un puerto con número positivo para su aplicación, por lo que nctermina escuchando en algún puerto como 56514.

MC17
fuente
la mayoría de los sistemas operativos lo harán, ¿cuál no?
barlop