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?
networking
tcp
nh2
fuente
fuente
Respuestas:
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
elinet_csk_get_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:Obtiene el mismo error que intentaría conectarse a cualquier otro puerto no disponible:
ECONNREFUSED
"Conexión rechazada". Entonces en respuesta a: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.
fuente
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.0El 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
a
fuente
nc -l 0
le 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 quenc
termina escuchando en algún puerto como 56514.fuente