Prise réseau - Network socket
Un socket réseau est une structure logicielle au sein d'un nœud de réseau d'un réseau informatique qui sert de point de terminaison pour l'envoi et la réception de données sur le réseau. La structure et les propriétés d'un socket sont définies par une interface de programmation d'application (API) pour l'architecture réseau. Les sockets sont créés uniquement pendant la durée de vie d'un processus d'une application s'exécutant dans le nœud.
En raison de la normalisation des protocoles TCP/IP dans le développement d' Internet , le terme socket réseau est le plus couramment utilisé dans le contexte de la suite de protocoles Internet, et est donc souvent également appelé socket Internet . Dans ce contexte, un socket est identifié de manière externe aux autres hôtes par son adresse de socket , qui est la triade du protocole de transport , de l'adresse IP et du numéro de port .
Le terme socket est également utilisé pour le point de terminaison logiciel de la communication inter-processus interne au nœud (IPC), qui utilise souvent la même API qu'un socket réseau.
Utilisation
L'utilisation du terme socket dans le logiciel est analogue à la fonction d'un connecteur électrique femelle , un dispositif matériel pour la communication entre des nœuds interconnectés avec un câble électrique . De même, le terme port est utilisé pour les points de terminaison physiques externes sur un nœud ou un périphérique.
L'interface de programmation d'application (API) de la pile de protocoles réseau crée un handle pour chaque socket créé par une application, communément appelé descripteur de socket . Dans les systèmes d'exploitation de type Unix , ce descripteur est un type de descripteur de fichier . Il est stocké par le processus d'application pour être utilisé avec chaque opération de lecture et d'écriture sur le canal de communication.
Au moment de la création avec l'API, une socket réseau est liée à la combinaison d'un type de protocole réseau à utiliser pour les transmissions, d'une adresse réseau de l'hôte et d'un numéro de port . Les ports sont des ressources numérotées qui représentent un autre type de structure logicielle du nœud. Ils sont utilisés comme types de service et, une fois créés par un processus, servent de composant de localisation adressable de l'extérieur (à partir du réseau), afin que d'autres hôtes puissent établir des connexions.
Les sockets réseau peuvent être dédiés aux connexions persistantes pour la communication entre deux nœuds, ou ils peuvent participer à des communications sans connexion et multidiffusion .
En pratique, en raison de la prolifération des protocoles TCP/IP utilisés sur Internet, le terme socket réseau fait généralement référence à une utilisation avec le protocole Internet (IP). On l'appelle donc souvent aussi socket Internet .
Adresses de socket
Une application peut communiquer avec un processus distant en échangeant des données avec TCP/IP en connaissant la combinaison du type de protocole, de l'adresse IP et du numéro de port. Cette combinaison est souvent appelée adresse de socket . Il s'agit du handle d'accès réseau au socket réseau. Le processus distant établit un socket réseau dans sa propre instance de la pile de protocoles et utilise l'API de mise en réseau pour se connecter à l'application, en présentant sa propre adresse de socket à utiliser par l'application.
Mise en œuvre
Une pile de protocoles , généralement fournie par le système d'exploitation (plutôt que sous forme de bibliothèque distincte, par exemple), est un ensemble de services qui permettent aux processus de communiquer sur un réseau à l'aide des protocoles mis en œuvre par la pile. Le système d'exploitation transmet la charge utile des paquets IP entrants à l'application correspondante en extrayant les informations d'adresse de socket des en-têtes de protocole IP et de transport et en supprimant les en-têtes des données d'application.
L' interface de programmation d'application (API) que les programmes utilisent pour communiquer avec la pile de protocoles, à l'aide de sockets réseau, est appelée socket API . Le développement de programmes d'application qui utilisent cette API est appelé programmation par socket ou programmation réseau . Les API de socket Internet sont généralement basées sur la norme de socket Berkeley . Dans le standard des sockets de Berkeley, les sockets sont une forme de descripteur de fichier , en raison de la philosophie Unix selon laquelle "tout est un fichier", et des analogies entre les sockets et les fichiers. Les deux ont des fonctions pour lire, écrire, ouvrir et fermer. En pratique, les différences mettent l'analogie à rude épreuve et différentes interfaces (envoi et réception) sont utilisées sur un socket. Dans la communication inter-processus , chaque extrémité a généralement son propre socket.
Dans les protocoles Internet standard TCP et UDP, une adresse de socket est la combinaison d'une adresse IP et d'un numéro de port , tout comme une extrémité d'une connexion téléphonique est la combinaison d'un numéro de téléphone et d'une extension particulière . Les sockets n'ont pas besoin d'avoir une adresse source, par exemple, pour envoyer uniquement des données, mais si un programme lie une socket à une adresse source, la socket peut être utilisée pour recevoir des données envoyées à cette adresse. Sur la base de cette adresse, les sockets Internet délivrent les paquets de données entrants au processus d' application approprié .
Socket fait souvent spécifiquement référence à un socket Internet ou à un socket TCP. Une prise Internet se caractérise au minimum par les éléments suivants :
- adresse de socket locale, composée de l'adresse IP locale et (pour TCP et UDP, mais pas IP) d'un numéro de port
- protocole : Un protocole de transport, par exemple, TCP, UDP, IP brute. Cela signifie que les points de terminaison (locaux ou distants) avec le port TCP 53 et le port UDP 53 sont des sockets distincts, tandis que IP n'a pas de ports.
- Une socket qui a été connectée à une autre socket, par exemple, lors de l'établissement d'une connexion TCP, possède également une adresse de socket distante.
Définition
Les distinctions entre une socket (représentation interne), un descripteur de socket (identifiant abstrait) et une adresse de socket (adresse publique) sont subtiles, et celles-ci ne sont pas toujours distinguées dans l'usage quotidien. De plus, les définitions spécifiques d'un socket diffèrent d'un auteur à l'autre. Dans IETF Request for Comments , Internet Standards , dans de nombreux manuels, ainsi que dans cet article, le terme socket fait référence à une entité identifiée de manière unique par le numéro de socket. Dans d'autres manuels, le terme socket fait référence à une adresse de socket locale, c'est-à-dire une « combinaison d'une adresse IP et d'un numéro de port ». Dans la définition originale de socket donnée dans la RFC 147, car elle était liée au réseau ARPA en 1971, "le socket est spécifié comme un nombre de 32 bits avec des sockets pairs identifiant les sockets de réception et des sockets impairs identifiant les sockets d'envoi". Aujourd'hui, cependant, les communications par socket sont bidirectionnelles.
Dans le système d'exploitation et l'application qui a créé une socket, une socket est référencée par une valeur entière unique appelée descripteur de socket .
Outils
Sur les systèmes d'exploitation de type Unix et Microsoft Windows , les outils de ligne de commande netstat ou ss sont utilisés pour répertorier les sockets établis et les informations associées.
Exemple
Cet exemple, modélisé selon l'interface socket Berkeley, envoie la chaîne "Hello, world!" via TCP au port 80 de l'hôte avec l'adresse 1.2.3.4. Il illustre la création d'un socket (getSocket), sa connexion à l'hôte distant, l'envoi de la chaîne et enfin la fermeture du socket :
Socket mysocket = getSocket(type = "TCP") connect(mysocket, address = "1.2.3.4", port = "80") send(mysocket, "Hello, world!") close(mysocket)
Les types
Plusieurs types de prise Internet sont disponibles :
- sockets de datagramme
- Sockets sans connexion , qui utilisent le protocole UDP ( User Datagram Protocol ). Chaque paquet envoyé ou reçu sur une socket datagramme est adressé et routé individuellement. L'ordre et la fiabilité ne sont pas garantis avec les sockets de datagramme, de sorte que plusieurs paquets envoyés d'une machine ou d'un processus à un autre peuvent arriver dans n'importe quel ordre ou ne pas arriver du tout. Une configuration spéciale peut être requise pour envoyer des diffusions sur un socket datagramme. Afin de recevoir des paquets de diffusion, une socket de datagramme ne doit pas être liée à une adresse spécifique, bien que dans certaines implémentations, des paquets de diffusion puissent également être reçus lorsqu'une socket de datagramme est liée à une adresse spécifique.
- Prises de flux
- Sockets orientés connexion, qui utilisent le protocole de contrôle de transmission (TCP), le protocole de transmission de contrôle de flux (SCTP) ou le protocole de contrôle de congestion de datagramme (DCCP). Un socket de flux fournit un flux séquencé et unique de données sans erreur, sans limites d'enregistrement, avec des mécanismes bien définis pour créer et détruire des connexions et signaler des erreurs. Un socket de flux transmet les données de manière fiable , dans l'ordre et avec des capacités hors bande . Sur Internet, les sockets de flux sont généralement implémentés à l'aide de TCP afin que les applications puissent s'exécuter sur n'importe quel réseau utilisant le protocole TCP/IP.
- Prises brutes
- Autorisez l'envoi et la réception directs de paquets IP sans aucun formatage de couche de transport spécifique au protocole. Avec d'autres types de sockets, la charge utile est automatiquement encapsulée selon le protocole de couche de transport choisi (par exemple TCP, UDP), et l'utilisateur de socket n'est pas au courant de l'existence d' en - têtes de protocole qui sont diffusés avec la charge utile. Lors de la lecture à partir d'un socket brut, les en-têtes sont généralement inclus. Lors de la transmission de paquets à partir d'un socket brut, l'ajout automatique d'un en-tête est facultatif.
- La plupart des interfaces de programmation d'applications (API) de socket , par exemple celles basées sur les sockets Berkeley , prennent en charge les sockets bruts. Windows XP est sorti en 2001 avec une prise en charge des sockets bruts implémentée dans l' interface Winsock , mais trois ans plus tard, Microsoft a limité la prise en charge des sockets bruts de Winsock en raison de problèmes de sécurité.
- Les sockets bruts sont utilisés dans des applications liées à la sécurité comme Nmap . Un cas d'utilisation des sockets bruts est la mise en œuvre de nouveaux protocoles de couche de transport dans l'espace utilisateur . Les sockets bruts sont généralement disponibles dans les équipements réseau et utilisés pour les protocoles de routage tels que Internet Group Management Protocol (IGMP) et Open Shortest Path First (OSPF), et dans Internet Control Message Protocol (ICMP) utilisé, entre autres, par l' utilitaire ping .
D'autres types de sockets sont implémentés sur d'autres protocoles de transport, tels que Systems Network Architecture et les sockets de domaine Unix pour la communication inter-processus interne.
États des sockets dans le modèle client-serveur
Les processus informatiques qui fournissent des services d'application sont appelés serveurs et créent des sockets au démarrage qui sont en état d'écoute . Ces sockets sont en attente d'initiatives des programmes clients .
Un serveur TCP peut servir plusieurs clients simultanément en créant un socket dédié unique pour chaque connexion client dans un nouveau processus enfant ou thread de traitement pour chaque client. Ceux-ci sont dans l' état établi lorsqu'une connexion virtuelle socket à socket ou un circuit virtuel (VC), également connu sous le nom de session TCP , est établi avec le socket distant, fournissant un flux d'octets duplex .
Un serveur peut créer plusieurs sockets TCP établies simultanément avec le même numéro de port local et la même adresse IP locale, chacune étant mappée sur son propre processus serveur-enfant, servant son propre processus client. Ils sont traités comme des sockets différents par le système d'exploitation puisque l'adresse du socket distant (l'adresse IP du client ou le numéro de port) est différente ; c'est-à-dire qu'ils ont des tuples de paires de sockets différents .
Les sockets UDP n'ont pas d' état établi , car le protocole est sans connexion . Un processus serveur UDP gère les datagrammes entrants de tous les clients distants de manière séquentielle via le même socket. Les sockets UDP ne sont pas identifiées par l'adresse distante, mais uniquement par l'adresse locale, bien que chaque message ait une adresse distante associée qui peut être récupérée à partir de chaque datagramme avec l'interface de programmation d'applications réseau (API).
Paires de prises
Les sockets locaux et distants communicants sont appelés paires de sockets . Chaque paire de sockets est décrite par un tuple unique composé d'adresses IP source et de destination et de numéros de port, c'est-à-dire d'adresses de sockets locales et distantes. Comme discuté ci-dessus, dans le cas TCP, une paire de sockets est associée à chaque extrémité de la connexion avec un unique 4-tuple.
Histoire
Le terme socket date de la publication de la RFC 147 en 1971, lorsqu'il a été utilisé dans l'ARPANET. La plupart des implémentations modernes de sockets sont basées sur les sockets Berkeley (1983) et d'autres piles telles que Winsock (1991). L'API des sockets Berkeley dans Berkeley Software Distribution (BSD), a pour origine le système d'exploitation 4.2BSD Unix en tant qu'API. Ce n'est qu'en 1989, cependant, que UC Berkeley a pu publier des versions de son système d'exploitation et de sa bibliothèque de réseau sans les contraintes de licence d' Unix protégé par copyright d' AT&T .
Dans c. 1987, AT & T a présenté les STREAMS à base Interface Transport Layer (TLI) dans UNIX System V Release 3 (SRV3). et a continué dans la version 4 (SVR4).
D'autres premières implémentations ont été écrites pour TOPS-20 , MVS , VM , IBM-DOS (PCIP).
Prises dans les équipements de réseau
Le socket est principalement un concept utilisé dans la couche transport de la suite de protocoles Internet ou dans la couche session du modèle OSI . Les équipements de mise en réseau tels que les routeurs , qui fonctionnent au niveau de la couche Internet , et les commutateurs , qui fonctionnent au niveau de la couche de liaison , ne nécessitent pas de mise en œuvre de la couche de transport. Cependant, les pare- feux réseau avec état , les traducteurs d'adresses réseau et les serveurs proxy gardent une trace des paires de sockets actives. Dans les commutateurs multicouches et la prise en charge de la qualité de service (QoS) dans les routeurs, les flux de paquets peuvent être identifiés en extrayant des informations sur les paires de sockets.
Les sockets bruts sont généralement disponibles dans les équipements réseau et sont utilisés pour les protocoles de routage tels que IGRP et OSPF , et pour Internet Control Message Protocol (ICMP).
Voir également
Les références
Lectures complémentaires
- Jones, Antoine ; Ohlund, Jim (2002). Programmation réseau pour Microsoft Windows . ISBN 0-7356-1579-9.
Liens externes
- Fonctionnement des sockets - Centre de documentation IBM
- Programmation serveur avec sockets TCP/IP
- Guide de Beej pour la programmation réseau
- Tutoriels Java : bases de la mise en réseau
- Réseau::RawIP; module pour les applications Perl. Créé par Sergueï Kolychev .
- SOCK_RAW Demystified : article décrivant le fonctionnement interne des Raw Sockets
- Exemples en langage C de sockets bruts Linux pour IPv4 et IPv6 - Exemples en langage C de sockets bruts IPv4 et IPv6 pour Linux de David Buchan.