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

59

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

Mais que se passe-t-il lorsque j'essaie de me connecter au port TCP 0? La réponse évidente est: "ça ne marche pas":

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

Où est-ce traité dans le système? Dans la pile TCP du noyau OS? Existe-t-il des systèmes Unix pour lesquels la connexion au port TCP 0 fonctionnerait?

nh2
la source
2
En théorie, vous pouvez créer une pile TCP personnalisée dans laquelle l'écoute ou la connexion à partir du port 0 fonctionne, ce qui signifie que deux de ces implémentations pourraient communiquer entre elles sur le port 0.
Joshua

Réponses:

60

Juste pour nous assurer que nous sommes sur la même page (votre question est ainsi ambiguë), demander de lier TCP sur le port 0 indique une demande pour générer de manière dynamique un numéro de port inutilisé. En d'autres termes, le numéro de port sur lequel vous écoutez réellement après cette demande n'est pas zéro. Il y a un commentaire à ce sujet dans [linux kernel source]/net/ipv4/inet_connection_sock.cle 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 standard Unix. Il pourrait y avoir des systèmes permettant l'utilisation du port 0, mais cela serait considéré comme une mauvaise pratique. Ce comportement n'est toutefois pas officiellement spécifié par les protocoles POSIX, IANA ou TCP. 1 Vous pouvez trouver cela intéressant .

C'est pourquoi vous ne pouvez pas établir une connexion TCP avec le port zéro. ncJe suis probablement au courant de cela et vous informe que vous faites une demande non sensuelle. 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 si vous essayiez de vous connecter à un autre port non disponible: ECONNREFUSED"Connexion refusée". Donc en réponse à:

Où est-ce traité dans le système? Dans la pile TCP du noyau OS?

Probablement pas; il ne nécessite pas de traitement spécial. Par exemple, si vous pouvez trouver un système permettant la liaison et l'écoute sur le port 0, vous pouvez probablement vous y connecter.


1. Mais IANA ne se réfère à elle comme « réservé » ( voir ici ). Sens, ce port ne doit pas être utilisé en ligne. Cela convient à la convention d’affectation dynamique (car elle ne sera pas utilisée). Définir cela spécifiquement comme un objectif irait probablement au-delà de la portée de l'IANA; Essentiellement, les systèmes d'exploitation sont libres de faire ce qu'ils veulent, y compris rien.

boucle d'or
la source
Cela ressemble à la même idée que l'adresse 0.0.0.0 dans ipv4. Une valeur réservée, utilisée par le système d'exploitation et les programmes dans un but particulier. Par analogie, dans la radio, il existe des fréquences réservées que personne n'utilise pour les transmissions, mais qui sont utilisées en interne dans les équipements.
ctrl-alt-delor
1
@richard no, 0.0.0.0 a un sens différent;) il est utilisé pour désigner une cible invalide, inconnue ou non applicable ou comme "émission"
AndreaCi
2
@AndreaCi n'a pas été diffusé 255.255.255.255?
Monstre à cliquet
4
@ratchetfreak 255.255.255.255 est diffusé. 0.0.0.0 a deux significations selon le contexte. En programmation, c'est aussi w INADDR_ANY, ce à quoi richard fait référence (le système le remplacera par un défaut). Mais, en réalité, utiliser les adresses sur un réseau semble avoir les implications mentionnées par Andrea (sauf si elle est considérée comme une "émission"): en.wikipedia.org/wiki/0.0.0.0
goldilocks
5

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. Le retour de mon système Linux Mint

nc: port range not valid

à

nc localhost 0 
MichaelJohn
la source
2

nc -l 0demandera à l'OS d'écouter sur le port 0. Mais comme cela a été mentionné ci-dessus, la plupart des systèmes d'exploitation verront le 0 et invoqueront leurs coutumes particulières pour choisir un port à numéro positif pour votre application nc.

MC17
la source
la plupart des systèmes d'exploitation vont, ok, lesquels pas?
barlop