Le port source TCP doit-il être unique par hôte?

10

J'ai appris qu'une connexion TCP est identifiée par le tuple (IP source, port source, ip de destination, port de destination). Théoriquement, il devrait donc être possible d'avoir un client de l'hôte1: port1 connecté au serveur1: port1 et en même temps un autre client (fonctionnant sur l'hôte1) de l'hôte1: port1 au serveur2: port1.

J'ai testé un peu en Java, et jusqu'à présent cela semble possible.

Cependant, j'ai lu plusieurs fois que le port source doit être unique pour l'adresse de l'hôte, ce qui signifierait essentiellement qu'il existe une limite stricte d'au plus 65536 connexions TCP sortantes simultanées. Est-ce vrai?

Mise à jour: voici mon code Java. Cela semble fonctionner, et netstat -t montre clairement deux connexions sortantes actives depuis le port 9990 (une vers 9997, une vers 9998). Au moins sur un Linux moderne, cela semble possible?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

Et la sortie netstat -t (tronquée):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 
lxgr
la source
"Si vous posez des questions sur les limites supérieures de systèmes bien conçus, vous êtes certainement en train de le faire mal "
Chris S

Réponses:

16

Ce n'est pas une exigence TCP. En ce qui concerne TCP, seule la combinaison IP source, port source, IP de destination et port de destination doit être unique. Cependant, dans la pratique, la plupart des API TCP ne fournissent aucun moyen de créer plusieurs connexions avec le même port source, sauf si elles ont des adresses IP source différentes.

David Schwartz
la source
2
Merci, cela répond complètement à la partie théorique de ma question! Je vais juste devoir essayer pour chaque implémentation TCP, je suppose.
lxgr
5

C'est le maximum en pratique, c'est généralement plus bas. Par exemple, Linux utilise le net.ipv4.ip_local_portparamètre kernel pour définir les ports utilisés pour les connexions sortantes. C'est généralement quelque chose comme

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Vous pouvez augmenter le nombre disponible avec sysctl par exemple

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

ou vous pouvez éditer /etc/sysctl.conf avec les mêmes informations

net.ipv4.ip_local_port_range = 10000 65535

Tous les exemples que j'ai trouvés montrent que la valeur minimale est de 1024 également.

user9517
la source
1

En plus de la réponse d'Iain (ci-dessus), il se peut que seuls 10 000 ports soient autorisés pour les connexions sortantes par votre noyau, en théorie, vous êtes au moins limité à un ensemble de XX, XXX ports par adresse IP sur l'adaptateur. Étant donné que 127.1 n'est pas disponible pour le monde extérieur, étant sur le réseau local, pour chaque autre adresse IP ( externe ), vous avez un ensemble de ports sortants dans votre plage de ports 65K.

Donc la limite sortante est vraiment:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Pour que cela fonctionne, vous devez lire la réponse à ce fil .

djangofan
la source
0

Oui. C'est vrai.

Les ports sont à lier et les applications avec le réseau.

Vous ne pouvez pas avoir plus de 65553 applications connectées par TCP et 65535 connectées par UDP sur le même hôte. Les systèmes d'exploitation géraient typiquement les ports et en attribuaient un pour chaque application qui se connecte au réseau.

Si vous avez deux applications listées sur le même port lorsqu'un package réseau arrive, l'ordinateur ne peut pas savoir quelle application va fournir les données. Par exemple, si vous avez Messenger et Skype sur le même lié au même port, votre message de messagerie apparaîtra dans skype et vice versa :)

Polo Ricardo
la source
Je pense que la question ne portait pas sur la limite supérieure du nombre d'applications d'écoute - qui, comme vous le faites remarquer, est limitée par le nombre de numéros de port uniques - mais sur le nombre de sockets fonctionnant à la fois. Les serveurs Web ont souvent des dizaines de sockets tous adressés à leur seul port 80 ou 443. Si de nombreux serveurs sur un hôte l'ont fait, il n'y a aucune raison pour que le nombre de sockets ouverts ne puisse pas dépasser 2 ^ 32.
Brandon Rhodes
0

Bien qu'un système puisse avoir une limite sur le nombre de connexions TCP ouvertes, il n'a normalement aucune restriction concernant les numéros de port utilisés. Une bonne implémentation TCP doit cependant empêcher d'utiliser deux fois la même paire de sockets. (socket = adresse IP + port). Un port est cependant affecté à un processus pour empêcher le vol de connexions, et la méthode habituelle est de demander un port libre pour un port d'écoute ou pour un port sortant. Cela empêche les sockets sortants en double et donc les connexions en double. À défaut d'utiliser cette méthode, l'application elle-même doit empêcher la création de connexions en double.

Papou
la source
3
Comment cela ajoute-t-il quelque chose de nouveau aux réponses déjà publiées sur cette ancienne question?
Chris S