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.c
el 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 nc
es 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.