Le client TCP peut-il utiliser le même port pour se connecter à différents serveurs TCP distants?

2

Je me demande si le client TCP peut utiliser le même port pour se connecter à différents serveurs TCP distants ou non?

En programmation réseau, il y a deux fonctions: sendto et send. Quand nous utilisons send nous n'avons pas besoin de spécifier la destination. Cela semble signifier qu'une prise TCP connectée ne peut être associée qu'à une seule (src ip, port src, dst ip, port dst) 4-tuple.

puis-je faire quelque chose comme:

 sockfd=socket(AF_INET,SOCK_STREAM,0);

 bzero(&cliaddr,sizeof(cliaddr));
 cliaddr.sin_family = AF_INET;
 cliaddr.sin_addr.s_addr=inet_addr(local_ip);
 cliaddr.sin_port=htons(32000);

 bind(listenfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
 connect(sockfd, (struct sockaddr *)&servaddr1, sizeof(servaddr1));
 connect(sockfd, (struct sockaddr *)&servaddr2, sizeof(servaddr2));

 sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr1, socklen);
 sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr2, socklen);

Par exemple, est-il possible que le proxy http manque de ports et doive les réutiliser?

misteryes
la source
1
"Les clients TCP peuvent-ils utiliser le même port" - voulez-vous dire port src ou dst? Peut-être en.wikipedia.org/wiki/… va vous donner quelques conseils. Btw. Ce n'est pas une question de programmation, n'est-ce pas?
mpy
Je veux dire le port client TCP
misteryes

Réponses:

1

Pour répondre à cette question, il peut être nécessaire de différencier TCP, le protocole indépendant de l'API, et BSD Sockets, l'API le plus connu et le plus largement adopté, grâce auquel les applications accèdent aux fonctionnalités des piles TCP de leur système d'exploitation.

TCP, le protocole, comme vous l'avez déjà noté, considère chaque tuple à 4 (adresse IP src, port src, adresse IP dst, port dst) comme une connexion distincte. Modifiez n'importe lequel des éléments de ce tuple à quatre et vous obtenez une connexion totalement distincte. Donc, oui, le protocole TCP peut gérer plusieurs connexions à partir d’une adresse IP et d’un port source uniques.

La question de savoir s'il existe un moyen simple d'accéder à cette fonctionnalité à partir de la vénérable API BSD Sockets est peut-être différente.

Spiff
la source
0

À ma connaissance, oui, ils le peuvent.

Dépend de l'application (dans cet exemple, disons http qui utilise le port 80), les connexions réutilisent les ports supérieurs à 1024. Tous les ports de 0 à 1024 sont réservés pour un usage spécifique. Tout ce qui est supérieur à 1024 convient à toutes les applications.

Ainsi, lors du chargement d'une page Web, vous commencez par une requête HTTP (port 80), mais toutes les connexions entrantes, tous les fichiers et toutes les images sont demandés simultanément, votre PC local choisit un port aléatoire inutilisé pour se connecter au Web. serveur sur le port 80.

La sécurité de grc.com a maintenant une bonne explication sur TCP et son fonctionnement ici: https://www.grc.com/sn/past/2011.htm - Partie 1 TCP - Se connecter

Je suis sûr que d'autres experts auront leur méthode pour expliquer les choses, mais c'est celle que je peux trouver pour le moment.

Aussi assez intéressant, il existe un site Web appelé http://www.askmisterwizard.com/ qui ont créé des illustrations / vidéos sur sécurité maintenant épisodes , et ils ont 2 vidéos d'illustrations sur le fonctionnement d'Internet qu'il peut être utile d'apprendre (si vous trouvez le podcast trop verbeux et pas assez graphique)

J'espère que cela t'aides.

Darius
la source
Je connais bien le protocole TCP. Ce que je veux savoir, c’est que le client TCP puisse être lié au port local par tonalité et se connecter à une paire paire d’ip / ports distante.
misteryes
0

Autant que je sache, TCP ne peut pas changer de port pendant que la connexion est en cours. Le client doit fermer ou abandonner cette connexion, puis en créer une nouvelle s'il souhaite utiliser un autre port source à sa fin.

Rien n'empêche une application d'implémenter quelque chose dans ce flux TCP qui indique au client de démarrer une autre connexion sur un nouveau port. C'est ce que fait FTP avec PASV si je me souviens bien. Mais ce n'est pas une caractéristique de TCP lui-même.

Je pense que la plupart des systèmes d'exploitation vous permettent de configurer la plage de ports sortants valide pour les connexions TCP. Oui, vous pouvez en manquer (il est peu probable que votre plage soit très petite) et oui, elles sont réutilisées. Lis ça: http://www.cyberciti.biz/tips/linux-increase-outgoing-network-sockets-range.html

LawrenceC
la source
Je ne parle pas de changer de port. Je demande à utiliser les mêmes ports pour une connexion différente du côté client TCP (ou côté serveur) en même temps.
misteryes
Merci pour la clarification. Le protocole TCP standard forme exactement une connexion avec exactement deux extrémités. Par définition, il existe un seul port source et un seul port de destination des deux côtés. Donc non, ce n'est pas possible. (Notez que d'autres protocoles peuvent être différents. Consultez SCTP.)
LawrenceC