2009-07-20 2 views
12

Supposons que deux navigateurs Web s'exécutent sur le même ordinateur et accèdent au même site Web (en d'autres termes, accèdent à la même adresse IP sur le même port).Comment la pile TCP/IP d'un système différencie-t-elle plusieurs programmes se connectant à la même adresse et au même port?

Comment le système d'exploitation reconnaît-il les paquets de/pour quel programme?

Chaque programme a-t-il un champ d'identifiant unique dans l'en-tête TCP? Si oui, quel est le champ appelé?

+17

Les gens, allez. Ce n'est pas parce qu'il s'agit d'un protocole réseau qu'il appartient à serverfault! –

+1

Oui, à peu près. – Will

+0

Plus probablement superuser.com, dans mon esprit ... –

Répondre

35

Les deux programmes n'accèdent pas réellement au "même port". Pour les besoins de TCP, une connexion est définie par le tuple (src_ip, src_port, dst_ip, dst_port).

Le port source est généralement éphémère, ce qui signifie qu'il est assigné de manière aléatoire par le système d'exploitation. En d'autres termes:

Programme A aura:

(my_ip, 10000, your_ip, 80)

Programme B aura:

(my_ip, 10001, your_ip, 80)

Ainsi, le système d'exploitation peut voir que ce sont des «connexions» différentes et peut pousser les paquets vers les objets socket appropriés.

+0

la bonne réponse –

+0

Il est également intéressant de noter que lorsque vous effectuez des opérations de socket pendant le développement (par exemple, l'ouverture d'une connexion socket en Java), le port source est automatiquement affecté par le système. –

+1

J'ai mentionné que: "Le port source est généralement éphémère, ce qui signifie qu'il est assigné au hasard par le système d'exploitation" :-) – Christopher

0
+0

-1? Vraiment? Quoi, je me trompe? – Will

+0

pourquoi a-t-il été rejeté? Il manque un peu de détail mais ce n'est pas faux et le lien vers wikipedia serait utile si ce n'était pas une page wikipedia plutôt confuse –

+0

Hurf. – Will

4

le numéro de port source sera différent même si le numéro de port de destination est le même. le noyau associera le numéro de port source au processus.

3

Lorsque le client ouvre une connexion à port de destination 80, il utilise un port source deutilisé arbitraire sur la machine locale, par exemple 17824. Le serveur Web répond alors à ce client en envoyant des paquets au port de destination 17824. Un deuxième client utilisera un deuxième numéro de port inutilisé, par exemple 17825, et les paquets des deux sockets ne seront donc pas mélangés car ils utiliseront des numéros de port différents sur la machine client.

+1

Juste pour noter qu'il n'a pas besoin d'utiliser un port source éphémère. Il peut demander de lier un port de sorce spécifique. –

2

La réponse de Christopher est partiellement correcte.

Les programmes A et B disposent en réalité d'un descripteur de socket stocké dans l'implémentation de socket du système d'exploitation sous-jacent. Les paquets sont livrés à ce socket sous-jacent, puis tout processus qui a un handle pour cette ressource socket peut le lire ou l'écrire. Par exemple, supposons que vous écrivez un serveur simple sur un système d'exploitation Unix tel que Linux ou Mac OSX.

Votre serveur accepte une connexion, à quel point une connexion consistant

(src IP, src Port, dest IP, dest Port) 

vient pour l'existence dans la couche socket OS sous-jacente. Ensuite, vous utilisez un processus pour gérer la connexion - à ce stade, vous avez maintenant deux processus avec des poignées à la socket qui peuvent tous les deux lire/écrire.

Généralement (toujours) le serveur d'origine ferme son handle au socket et laisse le processus forked le gérer.Il y a de nombreuses raisons à cela, mais celle qui n'est pas toujours évidente pour les gens est que quand le processus fils finit son travail et ferme le socket, le socket restera ouvert et connecté si le processus parent a toujours un handle ouvert.

+0

Je pense que peu de programmes modernes côté serveur 'fork' et' exec' pour chaque connexion entrante. Un seul thread peut gérer de nombreuses connexions simultanées, et est beaucoup plus efficace. Ce commentaire décrit une méthode particulière de mise en œuvre. – lavinio

+2

En fait, ce commentaire essaye de clarifier le malentendu selon lequel le socket appartient exclusivement à un processus et que le système d'exploitation "délivre" des paquets à un processus particulier. Le socket appartient au système d'exploitation et le processus a accès à cette ressource du système d'exploitation sous-jacent. –

+1

@lavinio C'est pourquoi Robert a dit "fork" et non "fork and exec" – artistoex

0

L'adresse IP est utilisée pour identifier l'ordinateur et le port est utilisé pour identifier le processus (application) dans l'ordinateur. Lorsqu'un port est utilisé par un processus, les autres processus ne peuvent plus l'utiliser. Donc, si un paquet est envoyé à ce port, seul le propriétaire de ce port peut gérer ce paquet.

+0

Bien que cela soit fondamentalement vrai (il y a quelques petites mises en garde sur les processus fourchus utilisant le même socket parce qu'il a été créé avant la fourche), je ne suis pas sûr de ce qu'il ajoute par rapport aux réponses qui existent depuis un moment. En général, c'est une bonne idée de faire en sorte qu'une nouvelle réponse à une vieille question fournisse de nouvelles informations précieuses - et je ne suis pas convaincu que cette réponse le fasse. –

0

Les connexions sont identifiées par une paire de points d'extrémité. - Moyens d'extrémité (ip, port)

2

Tout d'abord, un "port" est juste un nombre. Tout ce qu'une "connexion à un port" représente réellement est un paquet dont le numéro est spécifié dans son champ d'en-tête "port de destination".

Maintenant, il y a deux réponses à votre question, une pour les protocoles avec état et une pour les protocoles sans état. Pour un protocole sans état (par exemple, UDP), il n'y a pas de problème car les "connexions" n'existent pas: plusieurs personnes peuvent envoyer des paquets au même port et leurs paquets arriveront dans n'importe quelle séquence. Personne n'est jamais dans l'état "connecté".

Pour un protocole avec état (comme TCP), une connexion est identifiée par un 4-tuple composé de ports source et de destination et d'adresses IP source et de destination. Ainsi, si deux machines différentes se connectent au même port sur une troisième machine, il existe deux connexions distinctes car les adresses IP source diffèrent. Si la même machine (ou deux NAT derrière ou partageant la même adresse IP) se connecte deux fois à une seule extrémité distante, les connexions sont différenciées par le port source (qui est généralement un port aléatoire de haut-nombre). Simplement, si je me connecte deux fois au même serveur Web à partir de mon client, les deux connexions auront des ports source différents de mes ports de perspective et de destination du serveur Web. Il n'y a donc pas d'ambiguïté, même si les deux connexions ont les mêmes adresses IP source et de destination.

Les ports permettent de multiplexer les adresses IP afin que différentes applications puissent écouter sur la même paire adresse IP/protocole. À moins qu'une application ne définisse son propre protocole de plus haut niveau, il n'y a aucun moyen de multiplexer un port. Si deux connexions utilisant le même protocole ont des adresses IP source et de destination identiques et des ports source et de destination identiques, elles doivent être identiques.

Questions connexes