Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

Choix du port par le client (TCP ou UDP)

Est-il possible pour un client (TCP ou UDP) de fixer lui-même son numéro de port lorsqu'il établit une connexion vers un serveur, au moins au moment de la question.

De mémoire il ne me semble pas, pour avoir fouiller un peu sur le web il ne semble pas non plus...

Alors la question serait peut être existe-t-il des systèmes particuliers (je pense notament à ceux du temps réel ou de l'embarqué) qui permettent un telle chose.

PS : Je pose cette question car je dispose de scénarii où manifestement mles ports des clients non rien d'hazardeux

Non, c'est contre le principe client/serveur dans lequel le serveur est en écoute sur un port particulier et attend les questions des clients.


Oui, les RPC notamment. Tu te connectes à un port pour négocier l'ouverture d'un autre.

Non, c'est contre le principe client/serveur dans lequel le serveur est en écoute sur un port particulier et attend les questions des clients.

Je ne pense pas que ce soit contre le principe des architectures client/serveur puisque la question porte juste sur l'attribution du numéro de port du client.
Pour moi cette attribution de numéro de port pour le client était exclusivement faite par le système garantissant ainsi un roulement des numéros de port et donc aidant à assurer que les paquets d'une connexion close ne puisse etre confondus avec le paquet d'une connexion venant d'ourvir


Oui, les RPC notamment. Tu te connectes à un port pour négocier l'ouverture d'un autre.

Ce qui semble revenir au même puisqu'il y a toujours la moitié de la connexion dont on est pas capable de maitriser le numéro de port.


La question, formulé en de termes plus simples serait :
Un client peut-il choisir [u:6a3f269d64]son[/u:6a3f269d64] numéro de port (avant de se connecter au serveur) ?
Alors je me base pas sur des vrai fait mais sur des constatation il me semble que sur certaine appli le client a la possibilité de selectionner le port non ??

La question, formulé en de termes plus simples serait :
Un client peut-il choisir [u:e70ec73865]son[/u:e70ec73865] numéro de port (avant de se connecter au serveur) ?
Ah okaaaayyyy 😀
Je n'avais pas bien compris ce que tu demandais.

Le client a toujours la possibilité de choisir son port d'émission. que ce soit en UDP ou TCP.
Par contre, c'est le programmeur quand il code sa socket réseau qui choisit si oui ou non le choix se fait aléatoirement, incrémentalement ou est fixe.
Donc selon le programme que tu utilises, ou que tu programmes toi-même, cela est possible
Ok, et quelle structure/fonction doit on utiliser pour asssigner le port local du client (en C)?

Houlala !
Tu fais appel à mes vieilles notions de C 😕

Il me semble que c'est au moment du bind() que tu le choisis, mais je ne suis pas certain que des sockets simples permettent de le gérer. Peut-être faut-il réaliser des raw sockets dans lesquelles tu peux préciser beaucoup plus de choses sur tes en-têtes.
Bon en fouillant assidument j'ai pu trouver en partie réponse à mes questions et constater que manifestement les exemples/cours présents sur internet ne font pas souvent référénce à ce porblème (cad : Fixer le port de communication d'un client TCP ou UDP).

J'ai quand même trouvé un cours d'un de mes anciens prof de Paris VI qui aborde la question [url=http://www-src.lip6.fr/homepages/Gael.Thomas/srcs/srcs-2.Java.pdf]ici[/url] et qui donne un bout d'explication sur le code en Java pour faire ça.

Personnellement je n'ai pas pu faire fonctionner son code tel quel, mais en l'adaptant ça fonctionne

En TCP :
[code:1:5f8c2b2862]// Code Java permettant de fixer le port du client pour une socket TCP
// Le port du client sera 12345
Socket socket = new Socket(serverIP, serverPort, new InetSocketAddress(12345).getAddress(), 12345);
// Suite de votre code...[/code:1:5f8c2b2862]

En UDP :
[code:1:5f8c2b2862]// Code Java permettant de fixer le port du client pour une socket UDP.
// Le port du client sera 12345
socket = new DatagramSocket(new InetSocketAddress(12345));[/code:1:5f8c2b2862]

Pour la version TCP je trouve assez laid de devoir donner deux fois le numéro de port 12345, probablement les deux arguments non pas exactement la même signification. Je gratterai un peu plus tard.

Je continue de chercher la solution en C, et il est tout à fait vraisemblable que cela se fasse au moment du bind.
Une dernière question:

Parmi les nombreuses réponses de Google sur cette je suis tombé sur plein de pages épliquant comment configurer certains logiciels P2P avec sa box ou son routeur en fixant certains numéros de port.

Les questions seraient alors:
Les clients (au sens TCP pas P2P) d'un logiciel P2P fixent ils leur numéro de port ou bien s'agit-il d'informations concernant les numéros de port des serveurs à fixer?

J'aimerais donc savoir si ces logiciels P2P permettent de fixer les numéros de port des clients pour apr exemple permettre de passer à travers un firewall ou un routeur.
Attention aux confusions là !

Dans le cadre d'un P2P c'est le port serveur, qui est choisi par le client (ou du moins négocié)
Il faut bien faire attention à ce que l'on entend par port serveur et port client.

Le port serveur est celui choisi par l'application qui est en écoute.
Le port client est celui choisi normalement aléatoirement lors de l'initialisation d'une connexion par un client.

Dans le cadre de P2P, le client se connecte sur un port générique sur le serveur et négocie avec le serveur l'ouverture d'un port serveur sur le client (lui-même) afin que d'autres utilisateurs de P2P puissent venir se connecter chez lui pour récupérer des fichiers. C'est compliqué tout cela :-))
Le client joue à la fois le rôle de client vers le serveur P2P et de serveur vis à vis des personnes qui se connectent pour télécharger.
En fait j'aimerais connaitre le nom d'un ou deux types d'applications qui se serviraient de ce mécanisme (cad le client qui fixe lui même son numéro de port).

Est-ce par exemple utilisé dans la cadre d'applications situées derrière un parefeu très exigent?

Il me semble que c'est le cas en DHCP... à voir.


Non, on filtre plutôt sur les ports destination si besoin.
Je serais donc tenter de conclure que ce type d'utilisation correspond à un nombre assez restreints d'applications.

Je creuserai la question sur DHCP dans la soirée.

En tout cas merci à ceux qui ont pris le temps de répondre à ces questions.
Le client NTP choisi toujours le port UDP 123 pour communiquer. Enfin me semble-t-il.
Oui et Non ça dépend du sens de la phrase.

Si on dit que les clients NTP doivent utiliser le port distant 123 pour se connecter à un serveur (NTP), ce qui signifie que le serveur NTP est en attente sur le port 123.


Si on dit que le port local du client doit etre le 123, un numéro de port attribuer par le système suffit. Enfin tout du moins pour les tests effectuer avec un sreveur NTP sur un réseau local.
Le client NTP effectue ses demandes de temps à son serveur avec ce mappage :

[code:1:195ed33ab9]IP Client : 1.2.3.4
IP Serveur : 5.6.7.8

Contexte : Le client demande à son serveur quelle heure il est ...

Type : UDP

IP Source : 1.2.3.4
Port Source : 123

Ip Destination : 5.6.7.8
Port Destination : 123[/code:1:195ed33ab9]

Ce que je veux dire par là, c'est que ce protocole a un port "client" fixé, et il me semblait que ce thread abordait ce thème.

Analyse avec Wireshark :
No. Time Source Destination Protocol Info
366 47.285000 10.146.227.151 10.126.92.1 NTP NTP client

Frame 366 (90 bytes on wire, 90 bytes captured)
Ethernet II, Src: HewlettP_d7:54:2f (00:19:bb:d7:54:2f), Dst: All-HSRP-routers_67 (00:00:0c:07:ac:67)
Internet Protocol, Src: 10.146.227.151 (10.146.227.151), Dst: 10.126.92.1 (10.126.92.1)
User Datagram Protocol, Src Port: ntp (123), Dst Port: ntp (123)
Network Time Protocol

Ce que je veux dire par là, c'est que ce protocole a un port "client" fixé, et il me semblait que ce thread abordait ce thème.


Ben non.

Le première question était : "est-il possible pour un client (TCP ou UDP) de fixer luii même son port local, et non pas de le voir attribué automatuquement par le système?"

La réponse est donc OUI.

La question qui découle de cette première interrogation est : "Quel type d 'application requière que le client fixe son numéro de port et pourquoi?"


Je pensais vaguement à des raisons de sécurité sans avoir plus de certitudes.
Tu cites NTP, je le crois volontier, mais le fait est que ce n'est pas une obligation pour un client NTP de fixer son port local à 123, il peut très bien se le faire attribuer par le système et cela fonctionne toujours.

Bref s'il y a des réponses à cette seconde question, je suis naturellement preneur.

La question qui découle de cette première interrogation est : "Quel type d 'application requière que le client fixe son numéro de port et pourquoi?"
En DHCP c'est parceque le client a un faux rôle de client et se comporte presque comme un serveur.
En gros une fois la requête effectuée il reste en écoute sur le port client pour recevoir d'éventuels ordres du serveur, notamment sur le bail.
Mais il n'y a aucune raison de sécurité là dedans, plus un comportement se rapprochant de celui d'un serveur.
Ce sont des bidouilles propres à certaines applications. En NTP ça doit être identique, on attend des infos du serveur en permanence.
Bonjour à tous j'ai un peu suivi vos commentaires sur tcp,port et autres!!
En fait je voudrais de l'aide concernant un projet... Je dois creer une bibliotheque qui doit permettre de creer une connexion client serveur tcp avec saut de port. En effet au lieu d'une connexion tcp constante l'API chagera regulierement le port tcp utilisé pour la communication. Elle devra donc gerer l'ouverture et la fermeture de connexions intermediaire.
Je voudrais des idées sur comment le client ou l serveur devra dire à l'autres entité de suivre apres 30s par exemple une certaine séquence aleatoires
voici mon mail: kenyramses@gmail.com
merci d'avance