Question Quelle est la différence entre un port et une socket?


C'était une question soulevée par l'un des ingénieurs logiciels de mon organisation. Je suis intéressé par la définition la plus large.


730
2017-09-30 10:04


origine


Réponses:


Résumé

Une socket TCP est un point de terminaison exemple défini par une adresse IP et un port dans le contexte d'une connexion TCP particulière ou de l'état d'écoute.

Un port est un identifiant de virtualisation définir un point de terminaison de service (distinct d'un service exemple point de terminaison appelé identifiant de session).

Une socket TCP est ne pas une connexion, c'est l'extrémité d'une connexion spécifique.

Il peut y avoir des connexions simultanées à un point de terminaison de service, car une connexion est identifiée par à la fois local et distant les points de terminaison, ce qui permet d'acheminer le trafic vers une instance de service spécifique.

Il ne peut y avoir qu'une seule socket d'écoute pour une combinaison adresse / port donnée.

Exposition

C'était une question intéressante qui m'a forcé à réexaminer un certain nombre de choses que je pensais savoir à l'envers. On pourrait penser qu'un nom comme "socket" serait auto-explicatif: il était évidemment choisi pour évoquer l'imagerie de l'extrémité dans laquelle vous branchez un câble réseau, il existe des parallèles fonctionnels forts. Néanmoins, dans le jargon de réseau, le mot «socket» porte tellement de bagages qu'un réexamen minutieux est nécessaire.

Dans le sens le plus large possible, un port est un point d'entrée ou de sortie. Bien que non utilisé dans un contexte de réseau, le mot français porte signifie littéralement porte ou passerelle, soulignant en outre le fait que les ports sont des points de terminaison de transport si vous expédiez des données ou de grands conteneurs en acier.

Dans le cadre de cette discussion, je limiterai la prise en compte du contexte des réseaux TCP-IP. Le modèle OSI est très bien mais n'a jamais été complètement implémenté, beaucoup moins largement déployé dans des conditions de fort trafic à fort trafic.

La combinaison d'une adresse IP et d'un port est strictement connue comme une extrémité et est parfois appelée une socket. Cette utilisation provient de RFC793, la spécification TCP d'origine.

Un TCP connexion est défini par deux points de terminaison prises.

Un point de terminaison (socket) est défini par la combinaison d'une adresse réseau et d'un Port identifiant. Notez que l'adresse / le port ne pas identifier complètement une socket (plus sur cela plus tard).

Le but des ports est de différencier plusieurs points de terminaison sur une adresse réseau donnée. On pourrait dire qu'un port est un point de terminaison virtualisé. Cette virtualisation rend possible plusieurs connexions simultanées sur une seule interface réseau.

C'est la paire de socket (le 4-tuple   composé de l'adresse IP du client,   numéro de port du client, adresse IP du serveur,   et numéro de port du serveur) qui spécifie   les deux points d'extrémité qui unique   identifie chaque connexion TCP dans un   l'Internet. (TCP-IP illustré Volume 1, W. Richard Stevens)

Dans la plupart des langages dérivés de C, les connexions TCP sont établies et manipulées en utilisant des méthodes sur une instance d'une classe Socket. Bien qu'il soit courant d'opérer à un niveau d'abstraction supérieur, généralement une instance d'une classe NetworkStream, cela expose généralement une référence à un objet socket. Pour le codeur, cet objet socket apparaît pour représenter la connexion car la connexion est créée et manipulée à l'aide des méthodes de l'objet socket.

En C #, pour établir une connexion TCP (à un écouteur existant) d'abord vous créez un TcpClient. Si vous ne spécifiez pas de point de terminaison TcpClient constructeur utilise les valeurs par défaut - d'une manière ou d'une autre, le point de terminaison local est défini. Ensuite, vous invoquez le Relier  méthode sur l'instance que vous avez créée. Cette méthode nécessite un paramètre décrivant l'autre point de terminaison.

Tout cela est un peu confus et vous amène à croire qu'une socket est une connexion, ce qui est des conneries. Je travaillais sous ce malentendu jusqu'à ce que Richard Dorman pose la question.

Ayant beaucoup lu et réfléchi, je suis maintenant convaincu qu'il serait beaucoup plus logique d'avoir un cours TcpConnection avec un constructeur qui prend deux arguments, LocalEndpoint et RemoteEndpoint. Vous pourriez probablement supporter un seul argument RemoteEndpoint lorsque les valeurs par défaut sont acceptables pour le point de terminaison local. Ceci est ambigu sur les ordinateurs multi-hôtes, mais l'ambiguïté peut être résolue en utilisant la table de routage en sélectionnant l'interface avec le chemin le plus court vers le point de terminaison distant.

La clarté serait également améliorée à d'autres égards. Une prise est ne pas identifié par la combinaison de l'adresse IP et du port:

[...] TCP démultiplexe les segments entrants en utilisant les quatre valeurs qui composent les adresses locales et étrangères: adresse IP de destination, numéro de port de destination, adresse IP source et numéro de port source. TCP ne peut pas déterminer quel processus obtient un segment entrant en regardant uniquement le port de destination. En outre, le seul des [différents] points de terminaison à [un numéro de port] qui recevra des demandes de connexion entrantes est celui de l'état d'écoute. (p255, TCP-IP illustré Volume 1, W. Richard Stevens)

Comme vous pouvez le voir, il est non seulement possible, mais plutôt probable pour un service réseau d'avoir plusieurs sockets avec la même adresse / port, mais seulement un socket d'écoute sur une combinaison adresse / port particulière. Les implémentations de bibliothèque typiques présentent une classe socket, dont une instance est utilisée pour créer et gérer une connexion. Ceci est extrêmement regrettable, car il provoque la confusion et a conduit à la confusion généralisée des deux concepts.

Hagrawal ne me croit pas (voir les commentaires) alors voici un vrai échantillon. J'ai connecté un navigateur Web à http://dilbert.com et puis couru netstat -an -p tcp. Les six dernières lignes de la sortie contiennent deux exemples du fait que l'adresse et le port ne sont pas suffisants pour identifier une socket de manière unique. Il y a deux connexions distinctes entre 192.168.1.3 (mon poste de travail) et 54.252.92.236:80

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

Puisqu'un socket est l'extrémité d'une connexion, il y a deux sockets avec la combinaison adresse / port 207.38.110.62:80 et deux de plus avec la combinaison adresse / port 54.252.94.236:80.

Je pense que le malentendu de Hagrawal provient de mon utilisation très prudente du mot «identifie». Je veux dire "identifier complètement, sans ambiguïté et de manière unique". Dans l'exemple ci-dessus, il y a deux points d'extrémité avec la combinaison adresse / port 54.252.94.236:80. Si tout ce que vous avez est l'adresse et le port, vous n'avez pas assez d'informations pour différencier ces sockets. Ce n'est pas assez d'informations pour identifier une prise.

Addenda

Le paragraphe deux de la section 2.7 de la RFC793 dit

Une connexion est entièrement spécifiée par la paire de sockets aux extrémités. UNE   socket locale peut participer à de nombreuses connexions à différents étrangers   prises

Cette définition de socket n'est pas utile du point de vue de la programmation car ce n'est pas la même chose qu'une socket objet, qui est l'extrémité d'une connexion particulière. Pour un programmeur, et la majorité de l'auditoire de cette question sont des programmeurs, il s'agit d'une différence fonctionnelle vitale.

Les références

  1. TCP-IP Illustrated Volume 1 Les protocoles, W. Richard Stevens, 1994 Addison Wesley

  2. RFC793, Information Sciences Institute, Université de Californie du Sud pour DARPA

  3. RFC147, La définition d'un socket, Joel M. Winett, Lincoln Laboratory


804
2017-08-02 17:10



Une socket se compose de trois choses:

  1. Une adresse IP
  2. Un protocole de transport
  3. Un numéro de port

Un port est un nombre entre 1 et 65535 inclus qui signifie une porte logique dans un périphérique. Chaque connexion entre un client et un serveur nécessite une socket unique.

Par exemple:

  • 1030 est un port.
  • (10.1.1.2, TCP, port 1030) est une socket.

154
2017-09-30 10:07



Une prise représente une connexion unique entre deux applications réseau. Ces deux applications fonctionnent nominalement sur des ordinateurs différents, mais les sockets peuvent également être utilisés pour la communication interprocessus sur un seul ordinateur. Les applications peuvent créer plusieurs sockets pour communiquer les unes avec les autres. Les sockets sont bidirectionnels, ce qui signifie que chaque côté de la connexion est capable d'envoyer et de recevoir des données. Par conséquent, un socket peut être créé théoriquement à n'importe quel niveau du modèle OSI à partir de 2 vers le haut. Les programmeurs utilisent souvent des sockets dans la programmation réseau, quoique indirectement. Les bibliothèques de programmation comme Winsock masquent de nombreux détails de bas niveau de la programmation des sockets. Les douilles ont été largement utilisées depuis le début des années 1980.

Un port représente un point d'extrémité ou «canal» pour les communications réseau. Les numéros de port permettent à différentes applications sur le même ordinateur d'utiliser les ressources réseau sans interférer les unes avec les autres. Les numéros de port apparaissent le plus souvent dans la programmation réseau, en particulier la programmation des sockets. Parfois, cependant, les numéros de port sont rendus visibles à l'utilisateur occasionnel. Par exemple, certains sites Web qu'une personne visite sur Internet utilisent une URL comme celle-ci:

http://www.mairie-metz.fr:8080/ Dans cet exemple, le numéro 8080 fait référence au numéro de port utilisé par le navigateur Web pour se connecter au serveur Web. Normalement, un site Web utilise le numéro de port 80 et ce numéro n'a pas besoin d'être inclus avec l'URL (bien que cela puisse être le cas).

Dans les réseaux IP, les numéros de port peuvent théoriquement aller de 0 à 65535. Cependant, les applications réseau les plus populaires utilisent les numéros de port à l'extrémité inférieure de la plage (par exemple 80 pour HTTP).

Remarque: Le terme port fait également référence à plusieurs autres aspects de la technologie réseau. Un port peut faire référence à un point de connexion physique pour les périphériques tels que les ports série, parallèle et USB. Le terme port fait également référence à certains points de connexion Ethernet, tels que ceux d'un concentrateur, d'un commutateur ou d'un routeur.

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm


85
2018-04-07 20:17



Tout d'abord, je pense que nous devrions commencer par comprendre un peu ce qui constitue l'obtention d'un paquet de A à B.

Une définition commune pour un réseau est l'utilisation de Modèle OSI qui sépare un réseau en un certain nombre de couches selon le but. Il y en a quelques unes importantes, que nous aborderons ici:

  • le couche de liaison de données. Cette couche est responsable de l'obtention de paquets de données d'un périphérique réseau à un autre et se trouve juste au-dessus de la couche qui transmet réellement. Il parle d'adresses MAC et sait comment trouver des hôtes en fonction de leur adresse MAC (matérielle), mais rien de plus.
  • le couche réseau est la couche qui vous permet de transporter des données sur des machines et sur des limites physiques, telles que des périphériques physiques. La couche réseau doit essentiellement prendre en charge un mécanisme basé sur une adresse supplémentaire qui se rapporte d'une manière ou d'une autre à l'adresse physique; entrez le protocole Internet (IPv4). Une adresse IP peut acheminer votre paquet de A à B sur Internet, mais ne sait rien sur la façon de traverser les sauts individuels. Ceci est géré par la couche ci-dessus conformément aux informations de routage.
  • le couche de transport. Cette couche est responsable de la définition de la façon dont les informations vont de A à B et de toute restriction, vérification ou erreur sur ce comportement. Par exemple, TCP ajoute des informations supplémentaires à un paquet de sorte qu'il est possible de déduire si des paquets ont été perdus.

TCP contient, entre autres, le concept de les ports. Ce sont effectivement des points de terminaison de données différents sur la même adresse IP à laquelle une socket Internet (AF_INET) peut lier.

Comme ça arrive, UDP aussiet d'autres protocoles de couche de transport. Ils ne le font pas techniquement avoir besoin pour les ports de fonctionnalité, mais ces ports fournissent un moyen pour plusieurs applications dans les couches ci-dessus d'utiliser le même ordinateur pour recevoir (et même faire) des connexions sortantes.

Ce qui nous amène à l'anatomie d'une connexion TCP ou UDP. Chacune comporte un port source et une adresse, ainsi qu'un port et une adresse cible. C'est ainsi que dans une session donnée, l'application cible peut répondre, ainsi que recevoir, de la source.

Ainsi, les ports sont essentiellement une manière mandatée par une spécification de permettre plusieurs connexions simultanées partageant la même adresse.

Maintenant, nous devons examiner comment vous communiquez du point de vue de l'application au monde extérieur. Pour ce faire, vous devez demander à votre système d'exploitation et puisque la plupart des systèmes d'exploitation supportent la façon de faire de Berkeley Sockets, nous voyons que nous pouvons créer des sockets impliquant des ports à partir d'une application comme celle-ci:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...

Génial! Donc dans le sockaddr structures, nous préciserons notre port et bam! Travail terminé! Eh bien, presque, sauf:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

est également possible. Urgh, cela a jeté une clé dans les travaux!

Ok, eh bien, en fait ce n'est pas le cas. Tout ce que nous devons faire est de trouver des définitions appropriées:

  • Une socket Internet est la combinaison d'une adresse IP, d'un protocole et de son numéro de port associé sur lequel un service peut fournir des données. Alors tcp port 80, stackoverflow.com est une prise internet.
  • Un socket unix est un point de terminaison IPC représenté dans le système de fichiers, par ex. /var/run/database.sock.
  • Une API de socket est une méthode permettant de demander à une application de lire et d'écrire des données sur une socket.

Voila! Cela range les choses. Donc, dans notre régime alors,

  • Un port est un identificateur numérique qui, en tant que partie d'un protocole de couche de transport, identifie le numéro de service qui doit répondre à la demande donnée.

Donc vraiment un port est un sous-ensemble des exigences pour la formation d'une socket internet. Malheureusement, il arrive que la signification du mot socket ait été appliquée à plusieurs idées différentes. Donc, je vous conseille vivement de nommer votre prochain projet socket, juste pour ajouter à la confusion;)


40
2018-06-20 09:57



Avec quelques analogies

Bien que beaucoup de choses techniques est déjà donné ci-dessus pour prises... Je voudrais ajouter ma réponse, juste au cas où, si quelqu'un ne pouvait toujours pas sentir la différence entre ip, port et sockets

Considérons un serveur S,

et dis personne X, Y, Z besoin d'un service (disons le service de chat) de cette les serveurs

puis

L'adresse IP indique -> qui? est ce serveur de discussion "S" avec qui X, Y, Z veulent contacter


39
2017-09-30 10:05



Un socket = adresse IP + un port (adresse numérique)
Ensemble, ils identifient un point de terminaison pour une connexion réseau sur une machine. (Ai-je juste détruit le réseau 101?)


24
2017-09-30 13:26



Il semble y avoir beaucoup de réponses assimilant socket avec la connexion entre 2 PC .. ce que je pense est absolument incorrect. Une socket a toujours été le point final sur 1 PC, qui peut être connecté ou non - nous avons sûrement tous utilisé des sockets d'écouteurs ou d'UDP * à un moment donné. La partie importante est que c'est adressable et actif. Envoyer un message à 1.1.1.1:1234 est peu susceptible de fonctionner, car il n'y a pas de socket défini pour ce point de terminaison.

Les sockets sont spécifiques au protocole - donc la mise en œuvre de l'unicité que les deux TCP/IP et UDP/IP utilise * (ipaddress: port), est différent de, par exemple, IPX (Network, Node, et ... ahem, socket - mais un socket différent de ce que l'on entend par le terme général "socket" Les numéros de socket IPX sont équivalents aux ports IP). Mais, ils offrent tous un point de terminaison adressable unique.

Depuis que IP est devenu le protocole dominant, un port (en termes de réseau) est devenu synonyme d'un numéro de port UDP ou TCP - qui est une partie de l'adresse de socket.

  • UDP est sans connexion, ce qui signifie qu'aucun circuit virtuel entre les deux extrémités n'est jamais créé. Cependant, nous nous référons toujours à Prises UDP comme le point final. Les fonctions de l'API indiquent clairement que les deux ne sont que des types de sockets différents - SOCK_DGRAM est UDP (juste en envoyant un message) et SOCK_STREAM est TCP (création d'un circuit virtuel).

  • Techniquement, l'en-tête IP contient l'adresse IP et le protocole sur IP (UDP ou TCP) contient le numéro de port. Cela permet d'avoir d'autres protocoles (par ex. ICMP qui n'ont pas de numéro de port, mais qui ont des informations d'adressage IP).


22
2018-03-19 01:31