11
votes

Comment les clients (sockets client) sont identifiés?

à ma compréhension par Serversocket = Nouveau ServerSocket (PortNumber) Nous créons un objet qui peut potentiellement "écouter" au port indiqué. Par clientsocket = serversocket.accept.accept () Nous forcons la prise de serveur pour "écouter" à son port et "Accepter" une connexion de n'importe quel client qui tente de se connecter au serveur via le port associé au port serveur. Quand je dis "essaie de client de se connecter au serveur" Je veux dire que exécute le programme client "nameSocket = new Socket (serverIP, serverPort)".

Si le client tente de se connecter au serveur, le serveur "Accepte" ce client (c'est-à-dire Crée un "socket client" associé à ce client).

Si un nouveau client tente de se connecter au serveur, le serveur crée une autre socket client (associé au nouveau client). Mais comment le serveur sait si elle est un « nouveau » client ou un « vieux » celui qui a déjà sa prise? Ou, autrement dit, la façon dont les clients sont identifiés? Par leur adresse IP? Par leur IP et leur port? Par quelques "signatures"?

Que se passe-t-il si un "ancien" client tente d'utiliser une prise (Serverip, Serverip))? Le serveur va-t-il créer le deuxième socket associé à ce client?


0 commentaires

5 Réponses :


5
votes

Chaque connexion TCP a comme identifiant le quadruple (Port SRC, adresse SRC, Dest Port, Adresse Dest) .

Chaque fois que votre serveur accepte un nouveau client, une nouvelle prise est créée et il est indépendant de toutes les autres socket créés jusqu'à présent. L'identification des clients n'est pas impliquée d'une manière impliquante ..

Vous n'avez pas à penser que les sockets associés à des "clients" sont associés à une adresse IP et à un port, mais il n'y a pas de corrélation directe entre ces deux.

Si le même client tente d'ouvrir une autre prise en créant un nouveau, vous aurez deux sockets non liés (car les ports seront différents à coup sûr). Ceci parce que le client ne peut pas utiliser le même port pour ouvrir la nouvelle connexion afin que le quadruple soit différent, IP de la même adresse IP client, même IP du serveur, même port de serveur, mais différent port client.

Modifier pour vos questions:

  1. Les clients ne spécifient pas de port, car il est choisi au hasard à partir des numéros libres (> 1024 si je ne me trompe pas) du système d'exploitation sous-jacent
  2. Une connexion ne peut pas être ouverte à partir d'un client à l'aide du même port, le système d'exploitation ne vous laissera pas le faire (en réalité, vous ne spécifiez aucun port du tout) et, en tout cas, cela vous indiquerait que le port est déjà lié à une prise de sorte que ce problème ne peut pas arriver.
  3. Chaque fois que le serveur reçoit une nouvelle demande de connexion, il est considéré comme neuf, car également si IP est le même port sera différent de celui-ci (dans le cas d'un vieux rétablissement de paquets ou des mises en garde similaires, je pense que la demande sera supprimée)

    Ainsi, toutes ces situations sont clairement expliquées dans TCP RFC ici .


6 commentaires

@Jack, mais comment le client peut choisir un port à se connecter? Dans l'exemple du code client, j'ai, le client tente de se connecter au serveur en spécifiant l'adresse du serveur et le port de serveur. C'est à dire. Le serveur ne spécifie pas le port à partir duquel il essaie de se connecter au serveur.


@Jack, puis-je vous comprendre correctement, la prise de serveur, l'écoute d'un port spécifique, créera une nouvelle prise client uniquement si le client appelle d'un conclueur de clientèle clientèle qui n'a pas été utilisé avant?


@Jack, vous écrivez "chaque fois que votre serveur accepte un nouveau client, une nouvelle prise est créée". Mais comment définissez-vous le "nouveau" client? Comment le serveur sait si un client particulier est "nouveau" ou "vieux". Puis-je dire qu'un client est considéré comme "ancien" s'il y a déjà un socket associé au port IP à partir duquel le client appelle?


Quelle est la différence lorsque la demande d'un client sur http et https est-ce que le client crée des prises différentes sur chaque requête au serveur HTTPS?


@Roman L'application de serveur n'a pas à savoir. Tout ce qu'il a des sockets. Cela ne se soucie pas de savoir s'ils sont nouveaux ou vieux.


@manjunathkallannavar Il y a beaucoup de différences. Différents numéros de port, pour un début. Si les connexions HTTPS sont maintenues en vie sont à la fois pour les deux pairs, mais c'est la valeur par défaut dans HTTP 1.1, et ce n'est pas différent dans HTTPS.



-1
votes

Par définition, il ne s'agit pas d'une question liée à Java, mais de la mise en réseau en général, puisque les sockets et les sévères s'appliquent à tout langage de programmation activé par la mise en réseau.

Une prise est limitée à un port local. Le client ouvrira une connexion au serveur (par le système d'exploitation / pilotes / adaptateurs / matériels / line /.../ Line / Hardware / Adaptateurs / Pilotes / OS Server). Cette "connexion" est effectuée par un protocole, appelée IP (protocole Internet) lorsque vous êtes connecté à Internet. Lorsque vous utilisez des "sockets", il utilisera un autre protocole, qui est le protocole TCP / IP-Protocole.

Le protocole Internet identifiera les nœuds sur un réseau par deux choses: leur adresse IP et leur port. Le protocole TCP / IP enverra des messages à l'aide de la propriété intellectuelle et veillera à ce que les messages soient correctement reçus.

maintenant; Pour répondre à votre question: tout dépend! Cela dépend de vos pilotes, de vos adaptateurs, de votre matériel, de votre ligne. Lorsque vous vous connectez à votre machine locale, vous n'obtiendrez pas plus que l'adaptateur. Le matériel n'est pas nécessairement nécessaire, car aucune donnée n'est réellement envoyée sur la ligne. (Bien que souvent, vous avez besoin de matériel avant de pouvoir avoir un adaptateur.)

Par définition, le protocole Internet définit une connexion en tant que paire de nœuds (donc quatre choses: deux adresses IP et deux ports). En outre, le protocole Internet définit qu'un nœud ne peut utiliser qu'un seul port à la fois pour initier une connexion avec un autre nœud (REMARQUE: Ceci ne s'applique que pour le client, pas le serveur).

Pour répondre à votre deuxième question: S'il y a deux sockets: le "nouveau" et le "vieux". Étant donné que, par le protocole Internet, une connexion est une paire de nœuds et les nœuds ne peuvent utiliser qu'un seul port à la fois pour une connexion, les ports de "nouveau" et "ancien" doivent être différents. Et parce que ceci est différent, le "nouveau" client peut être discriminé à partir du "vieux", car le numéro de port est différent.


3 commentaires

@Pindatjuh, ai-je correctement compris? La prise de serveur, écoute d'un port spécifique, ne créera pas de nouveau socket client si le client appelle la prise de la même adresse IP et du même port.


En tant que client se connectant à un serveur, vous ne pouvez pas déterminer votre port. Seul un serveur peut avoir plusieurs "connexions entrantes" sur le même port, mais un client ne peut pas avoir plusieurs "connexions sortantes" sur le même port. Cependant, il peut réutiliser une connexion, mais il doit ensuite être fermé en premier. Le serveur est informé de la fermeture de la connexion.


La réponse est surtout incorrecte. Ni les connexions ni les ports n'existent à la couche IP. Ce sont des fonctions de la couche TCP. Vous pouvez également utiliser des prises au niveau IP ou d'autres. La discussion sur l'unicité du port est également incorrecte: c'est la 5 tuple de la connexion qui doit être unique, pas un seul numéro de PR. Votre commentaire est également incorrect: le client peut en effet définir son propre port. Ce n'est généralement pas fait, mais c'est possible. Il n'existe pas de réutilisation d'une connexion.



1
votes

Je pense que la question ici est pourquoi vous souciez-vous si le client est nouveau ou vieux. Qu'est-ce qui est nouveau et vieux? Par exemple, un navigateur Web pourrait se connecter à un serveur Web pour demander une page Web. Cela créera une connexion SO serversocket.accept () retournera une nouvelle prise . Ensuite, la connexion est fermée par le navigateur Web.

Afer quelques minutes, la fin utilisée Cliquez sur un lien dans la page Web et le navigateur demande une nouvelle page sur le serveur. Cela créera une connexion SO serversocket.accept () retournera une nouvelle prise .

Maintenant, le serveur Web ne s'en soucie pas s'il s'agit d'un nouveau client. Il a juste besoin de serveur la page demandée. Si le serveur DO SOINS Si le "Client" a déjà demandé une page dans le passé, il devrait le faire en utilisant certaines informations dans le protocole utilisé sur la prise. Découvrez http://en.wikipedia.org/wiki/osi_model Dans ce cas, le ServerSocket et socket ack sur le niveau de transport. La question "Ce client a-t-il déjà demandé une page sur le serveur" doit être répondu à des informations sur la couche de session ou même d'application.

Dans l'exemple du navigateur Web / serveur, le protocole HTTP (qui est une application) Protocole de protection des informations sur qui est ce navigateur dans les paramètres de la demande (le navigateur transmet des informations de cookie avec chaque demande). Le serveur HTTP peut alors définir / lire les informations de cookie sur connues si le navigateur connecté avant et éventuellement maintenir une session latérale de serveur pour ce navigateur.

Alors, retour à votre question: Pourquoi vous souciez-vous de ce qu'il s'agit d'un nouveau ou d'un autre client?


0 commentaires

1
votes

Un socket est identifié par:

(IP locale, port local, IP à distance, Port distant, protocole IP (UDP / TCP / SCTP /, etc.)

Et c'est l'information que le système d'exploitation utilise pour mapper les paquets / données sur le descripteur de poignée / fichier droit de votre programme. Pour certaines sortes de sockets, (par exemple une prise UDP non connectée), le port distant / IP à distance pourrait être des caractères génériques.


0 commentaires

28
votes

Le serveur écoute sur une adresse et un port. Par exemple, l'adresse IP de votre serveur est de 10.0.0.1, et elle écoute sur le port 8000.

Votre adresse IP client est de 10.0.0.2 et le client "Connecte" au serveur au 10.0.0.1 Port 8000. Dans la connexion TCP, vous donnez le port du serveur que vous souhaitez connecter à. Votre client obtiendra réellement son propre numéro de port, mais vous ne contrôlez pas cela, et ce sera différent de chaque connexion. Le client choisit le port serveur qu'il souhaite se connecter au port Client qui se connecte à partir de.

Par exemple, lors de la première connexion, votre client peut obtenir un port côté client 12345. Il se connecte à partir du 10.0.0.2 Port 12345 au serveur 10.0.0.1 Port 8000. Votre serveur peut voir quel port le client se connecte à partir de En appelant GetPeername sur son côté de la connexion.

Lorsque le client se connecte une seconde fois, le numéro de port va être différent, selon le port 12377. Le serveur peut le voir en appelant getPeername à la deuxième connexion - il verra un numéro de port différent du côté du client. (GetPeername affiche également l'adresse IP du client.)

En outre, chaque fois que vous appelez Accepter sur le serveur, vous obtenez une nouvelle prise. Vous avez toujours l'écoute de la prise d'origine et vous acceptez de recevoir une nouvelle prise. Appelez GetPeername sur la prise acceptée pour voir quel port client provient de la connexion. Si deux clients se connectent à votre serveur, vous avez maintenant trois sockets - la prise d'écoute d'origine et les sockets de chacun des deux clients.

Vous pouvez avoir de nombreux clients connectés au même port de serveur 8000 en même temps. Et, de nombreux clients peuvent être connectés à partir du même port client (par exemple Port 12345), qui ne sont que de la même adresse IP. De la même adresse IP client, par exemple 10.0.0.2, chaque connexion client au port Server 8000 provenait d'un port client unique, par exemple. 12345, 12377, etc. Vous pouvez distinguer les clients par leur combinaison d'adresse IP et de port.

Le même client peut également avoir plusieurs connexions sur le serveur en même temps, par ex. Une connexion du port client 12345 et une autre de 12377 en même temps. Par client, je veux dire l'adresse IP d'origine et non un objet logiciel particulier. Vous verrez simplement deux connexions actives ayant la même adresse IP client.

Aussi, finalement au fil du temps, la combinaison de l'adresse client et du port client peut être réutilisée. C'est finalement que vous pouvez voir qu'un nouveau client est arrivé à partir du 10.0.0.2 Port 12345, longtemps après le premier client au 10.0.0.2 Port 12345 a débranché.


2 commentaires

Le dernier paragraphe est légèrement incorrect. Un nouveau client pourrait venir immédiatement après (pas nécessairement après) le premier client sur la même adresse IP et le même port. Pour TCP, la manière dont le serveur peut indiquer qu'il s'agit d'une nouvelle connexion est par les paquets SYN / ACK / AIND (toutes manipulées par la couche de sockets). Pour les prises brutes ou UDP, il appartiendrait à l'application de déterminer quelle est une nouvelle connexion et une nouvelle connexion existante.


@ Jasonr.coombes Votre commentaire ignore l'état Time_Wait, qui empêche délibérément exactement ce que vous décrivez, ce qui rend le dernier paragraphe de cette réponse.