web-dev-qa-db-fra.com

Est-il possible de se connecter à TCP port 0?

L'écoute de TCP port 0 m'attribue un numéro de port libre sur le système.

Mais que se passe-t-il lorsque j'essaie de connecter à TCP port 0? La réponse évidente est: "Cela ne fonctionne pas":

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

Où dans le système est-ce géré? Dans la pile TCP du noyau du système d'exploitation? Y a-t-il des Unix où la connexion à TCP port 0 fonctionnerait?

60
nh2

Juste pour vous assurer que nous sommes sur la même page (votre question est ambiguë de cette façon), demander de lier TCP sur le port 0 indique une demande pour générer dynamiquement un numéro de port inutilisé. En d'autres termes , le numéro de port que vous écoutez après cette demande n'est pas nul. Il y a un commentaire à ce sujet dans [linux kernel source]/net/ipv4/inet_connection_sock.c sur 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.
 */

Ce qui est une convention Unix standard. Il pourrait y avoir des systèmes qui autoriseraient l'utilisation du port 0, mais cela serait considéré comme une mauvaise pratique. Ce comportement n'est pas officiellement spécifié par POSIX, IANA ou le protocole TCP, cependant.1 Vous pouvez trouver c'est intéressant .

C'est pourquoi vous ne pouvez pas raisonnablement établir une connexion TCP au port zéro. Vraisemblablement nc est au courant de cela et vous informe que vous faites une demande non sensible. Si vous essayez ceci en code natif:

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));
}    

Vous obtenez la même erreur que vous essayez de vous connecter à tout autre port non disponible: ECONNREFUSED, "Connexion refusée". Donc en réponse à:

Où dans le système est-ce géré? Dans la pile TCP du noyau du système d'exploitation?

Probablement pas; il ne nécessite pas de manipulation particulière. C'est-à-dire, si vous pouvez trouver un système qui permet la liaison et l'écoute sur le port 0, vous pouvez probablement vous y connecter.


1. Mais l'IANA s'y réfère comme "Réservé" ( voir ici ). Cela signifie que ce port ne doit pas être utilisé en ligne. Cela le rend correct en ce qui concerne la convention d'affectation dynamique (car elle ne sera pas réellement utilisée). Stipuler cela spécifiquement comme un objectif serait probablement au-delà de la portée de l'IANA; en substance, les systèmes d'exploitation sont libres de faire ce qu'ils veulent avec, y compris rien.

60
goldilocks

L'utilisation du port 0 déclenche le système d'exploitation pour rechercher et allouer le prochain port disponible. Cela vous évite d'avoir à coder en dur un port spécifique ou à rechercher un port disponible. Mon système Linux Mint revient

nc: port range not valid

à

nc localhost 0 
5
MichaelJohn

nc -l 0 demandera au système d'exploitation d'écouter sur le port 0. Mais comme cela a été noté ci-dessus, la plupart des systèmes d'exploitation verront le 0 et invoqueront leurs coutumes particulières pour choisir un port numéroté positif pour votre application, donc nc serpente à l'écoute sur un port comme 56514.

2
MC17