2009-12-21 6 views
2

Je comprends que lorsqu'un client TCP se connecte à un serveur, il utilise automatiquement un port local inutilisé, sauf indication contraire explicite. Côté serveur, nous avons un socket d'écoute qui crée un nouveau socket chaque fois qu'une nouvelle connexion est acceptée.Comment un paquet TCP/IP parvient-il à une socket de serveur spécifique?

Mais toutes les sockets serveur utilisent le même port local (j'ai vérifié cela avec netstat). Ma question est de savoir comment un paquet envoyé par le client atteint un socket spécifique sur le serveur lorsque toutes les sockets côté serveur communiquent sur la même adresse IP et le même port local. Voici un instantané telnet montrant que mon serveur d'écho tcp/ip utilise la même adresse et le même port pour 2 connexions différentes.

alt text http://i47.tinypic.com/34o6jrr.png

Répondre

-2

Sur le serveur, un seul port ouvert signifie simplement que vous utilisez un seul site.

+3

Comment cette déclaration répondre à la question? – Hemant

+0

Quelle est votre définition d'un "site"? –

9

Lorsque vous établissez une connexion d'un client à un serveur, TCP sur le serveur connaît l'adresse et le port du client. Chaque connexion individuelle est identifiée et distinguée par le 4-tuple (client_ip, client_port, server_ip, server_port).

Dans votre affichage netstat, la combinaison de l'adresse locale et adresse distante (étrangère) identifie de façon unique la connexion. Les adresses étrangères pour les deux connexions en surbrillance sont différentes.

1

Il s'agit essentiellement de la différence entre les connexions entrantes et sortantes.

Sur les connexions entrantes, le socket serveur serait lié et écouté sur un port ip: donné. Les connexions entrantes sont acceptées sur les nouvelles sockets avec le même port ip, car elles sont acceptées depuis le socket du serveur d'écoute. Lorsque vous utilisez netstat, vous devez voir le port ip: socket du serveur dans l'état Listening (pour les connexions TCP) et ip: port multiple dans l'état Established pour les connexions entrantes acceptées sur les nouvelles sockets.

Les connexions sortantes permettent uniquement l'utilisation de ports non liés. Vous pouvez les spécifier manuellement, ou en avoir un choisi au hasard par la pile tcp/ip. (Une exception à ce serait lors de l'utilisation SO_REUSEADDR, qui vous permet de lier à un port lié qui est toujours en TIME_WAIT état)

Questions connexes