{"id":18,"date":"2007-11-29T08:44:43","date_gmt":"2007-11-29T07:44:43","guid":{"rendered":"http:\/\/wp1.fredptitgars.net\/index.php\/2007\/11\/29\/notion-de-port-et-de-socket-dans-une-connexion-de-transport\/"},"modified":"2007-11-29T08:44:43","modified_gmt":"2007-11-29T07:44:43","slug":"notion-de-port-et-de-socket-dans-une-connexion-de-transport","status":"publish","type":"post","link":"https:\/\/fredptitgars.ovh\/?p=18","title":{"rendered":"Notion de port et de socket dans une connexion de transport"},"content":{"rendered":"<h2> 1 L&rsquo;origine des sockets<\/h2>\n<p>La version BSD 4.1c d&rsquo;Unix pour VAX, en 1982, a \u00e9t\u00e9 la premi\u00e8re \u00e0 inclure TCP\/IP dans le noyau du syst\u00e8me d&rsquo;exploitation et \u00e0 proposer une interface de programmation de ces protocoles : les sockets.<br \/>\nLes sockets sont ce que l&rsquo;on appelle une API (\u00ab\u00a0Application Program Interface\u00a0\u00bb) c&rsquo;est \u00e0 dire une interface entre les programmes d&rsquo;applications et la couche transport, par exemple TCP ou UDP. N\u00e9anmoins les sockets ne sont pas li\u00e9es \u00e0 TCP\/IP et peuvent utiliser d&rsquo;autres protocoles.<br \/>\n<br \/>Les sockets apparaissent entre la couche transport et la couche application du mod\u00e8le OSI. Il faut noter que les constructeurs de stations de travail comme HP, SUN, IBM, SGI, ont adopt\u00e9 ces sockets, ainsi sont-elles devenues un standard de fait et une justification de leur \u00e9tude.<br \/>\n<br \/>Pour conforter ce point de vue, il n&rsquo;est pas sans int\u00e9r\u00eat d&rsquo;ajouter que toutes les applications  majeures (named, dhcpd, sendmail, ftpd, serveurs httpd,&#8230;) de l&rsquo;Internet, et dont l&rsquo;utilisateur peut lire le code source, sont programm\u00e9es avec de telles sockets.<br \/>\n<br \/>Les sockets Windows (Winsock) sont apparus plus tard en 1993. La premi\u00e8re version des socket windows, la winsowk 1.1 autorisait  l&rsquo;utilisation d&rsquo;un seul protocole TCP\/IP, contrairement \u00e0 la version 2.0 qui propose en plus, la suite des protocoles ATM, IPX\/SPX, DECnet et le sans fil. Le passage \u00e0 Winsock 2.0 s&rsquo;est fait en gardant 100% de compatibilit\u00e9 permettant aux applications d\u00e9j\u00e0 d\u00e9velopp\u00e9es de continuer \u00e0 fonctionner.<br \/>\n<br \/><strong><em><br \/>\n 2 Pr\u00e9sentation des sockets<\/strong><\/em><br \/>\nLes cr\u00e9ateurs des sockets ont essay\u00e9 au maximum de conserver la s\u00e9mantique des primitives syst\u00e8mes d&rsquo;entr\u00e9es\/sorties sur fichiers comme open, read, write, et close. Cependant, les m\u00e9canismes propres aux op\u00e9rations sur les r\u00e9seaux les ont conduits \u00e0 d\u00e9velopper des primitives compl\u00e9mentaires.<br \/>\n<br \/>Pour cr\u00e9er une socket, une application utilisera la primitive socket et non open, pour les raisons que nous allons examiner. En effet, il serait tr\u00e8s agr\u00e9able si cette interface avec le r\u00e9seau conservait la s\u00e9mantique des primitives de gestion du syst\u00e8me de fichiers, malheureusement les entr\u00e9es\/sorties sur r\u00e9seau mettent en jeux plus de m\u00e9canismes que les entr\u00e9es\/sorties sur un syst\u00e8me de fichiers.<br \/>\n<br \/>Par exemple, il faut consid\u00e9rer les points suivants :<br \/>\nDans une relation du type client-serveur les relations ne sont pas sym\u00e9triques. D\u00e9marrer une telle relation suppose que le programme sait quel r\u00f4le il doit jouer.<br \/>\n<br \/>Une connexion r\u00e9seau peut \u00eatre du type connect\u00e9 ou non. Dans le premier cas, une fois la connexion \u00e9tablie le processus \u00e9metteur discute uniquement avec le processus destinataire. Dans le cas d&rsquo;un mode non connect\u00e9, un m\u00eame processus peut envoyer plusieurs data-grammes \u00e0 plusieurs autres processus sur des machines diff\u00e9rentes.<br \/>\n<br \/>Une connexion est d\u00e9finie par un quintuplet d\u00e9fini par le protocole, l&rsquo;IP Local, le Port local, l&rsquo;IP distante et Port distant qui est beaucoup plus compliqu\u00e9 qu&rsquo;un simple nom de fichier.<br \/>\n<br \/>Le terme socket d\u00e9signe, d&rsquo;une part un ensemble de primitives, on parle des sockets de Berkeley, et d&rsquo;autre part l&rsquo;extr\u00e9mit\u00e9 d&rsquo;un canal de communication (point de communication) par lequel un processus peut \u00e9mettre ou recevoir des donn\u00e9es. Ce point de communication est repr\u00e9sent\u00e9 par une variable enti\u00e8re, similaire \u00e0 un descripteur de fichier.<\/p>\n<h2> 3 La vie d&rsquo;une socket:<\/h2>\n<p><strong> 3.1 Cr\u00e9ation d&rsquo;une socket<\/strong><br \/>\n<br \/>Pour cr\u00e9er une socket, il est n\u00e9cessaire de sp\u00e9cifier la famille de protocole, ipv4, ipv6,X25,&#8230; Le type de communication principalement mode connect\u00e9 et mode non connect\u00e9. Le protocole TCP, UDP,&#8230;<br \/>\nLa cr\u00e9ation d&rsquo;une socket permet de conna\u00eetre le `descripteur de la socket`. Cela nous donne le premier \u00e9l\u00e9ment du quintuplet: Le protocole.<\/p>\n<p><strong> 3.2 Sp\u00e9cification d&rsquo;une adresse<\/strong><br \/>\n<br \/>Il faut remarquer qu&rsquo;une socket est cr\u00e9\u00e9e sans adresse de l&rsquo;\u00e9metteur ni celle du destinataire.<br \/>\n<br \/>Pour les protocoles de l&rsquo;Internet cela signifie que la cr\u00e9ation d&rsquo;une socket est ind\u00e9pendante d&rsquo;un num\u00e9ro de port.<br \/>\n<br \/>Dans beaucoup d&rsquo;applications, surtout des clients, on a pas besoin de s&rsquo;inqui\u00e9ter du num\u00e9ro de port, le protocole sous-jacent s&rsquo;occupe de choisir un num\u00e9ro de port pour l&rsquo;application.<br \/>\n<br \/>Cependant un serveur qui fonctionne suivant un num\u00e9ro de port \u00ab\u00a0bien connu\u00a0\u00bb doit \u00eatre capable de sp\u00e9cifier un num\u00e9ro de port bien pr\u00e9cis.<br \/>\nUne fois que la socket est cr\u00e9\u00e9e, la primitive bind permet d&rsquo;effectuer ce travail, c&rsquo;est \u00e0 dire d&rsquo;associer une adresse IP et un num\u00e9ro de port \u00e0 une socket<br \/>\n<br \/>La primitive bind ne permet pas toutes les associations de num\u00e9ros de port, par exemple si un num\u00e9ro de port est d\u00e9j\u00e0 utilis\u00e9 par un autre processus, ou si l&rsquo;adresse Internet est invalide.<br \/>\n<br \/>Cet appel syst\u00e8me compl\u00e8te l&rsquo;adresse locale et le num\u00e9ro de port du quintuplet qui qualifie une connexion.on a la moiti\u00e9 d&rsquo;une connexion, \u00e0 savoir un protocole, un num\u00e9ro de port et une adresse IP.<\/p>\n<p><strong> 3.3 Connexion \u00e0 une adresse distante<\/strong><br \/>\n<br \/>L&rsquo;initiative de la demande de connexion est typiquement la pr\u00e9occupation d&rsquo;un processus client.<br \/>\n<br \/>Quand une socket est cr\u00e9\u00e9e, elle n&rsquo;est pas associ\u00e9e avec une quelconque destination. C&rsquo;est la primitive connect qui permet d&rsquo;\u00e9tablir la connexion, si on choisit un mode de fonctionnement `connect\u00e9`, sinon elle n&rsquo;est pas tr\u00e8s utile.<br \/>\n<br \/>Pour les protocoles orient\u00e9s connexion, cet appel syst\u00e8me rend la main au code utilisateur une fois que la liaison entre les deux syst\u00e8mes est \u00e9tablie. Durant cette phase des messages sont \u00e9chang\u00e9s; les deux syst\u00e8mes \u00e9changent des informations sur les caract\u00e9ristiques de la liaison future.<br \/>\n<br \/>Dans le cas d&rsquo;un client en mode non connect\u00e9 un appel \u00e0 connect n&rsquo;est pas faux mais il ne sert \u00e0 rien et redonne aussit\u00f4t la main au code utilisateur. Le seul int\u00e9r\u00eat que l&rsquo;on peut voir est que l&rsquo;adresse du destinataire est fix\u00e9e et que l&rsquo;on peut alors utiliser les primitives read, write, recv et send, traditionnellement r\u00e9serv\u00e9es au mode connect\u00e9.<br \/>\nLe quintuplet est maintenant complet: protocole, port local, adresse locale, port \u00e9loign\u00e9, adresse \u00e9loign\u00e9e. A partir de ce moment on peut utiliser la socket pour envoyer et recevoir des donn\u00e9es.<\/p>\n<p><strong>3.4 Terminer une connexion<\/strong><br \/>\n<br \/>On ferme la Connexion  uniquement en mode connect\u00e9. Avant de fermer la Connexion , le syst\u00e8me s&rsquo;assure que tous les octets en attente de transmission sont bien transmis dans de bonnes conditions. Lors d&rsquo;un arr\u00eat &lsquo;brutal&rsquo; de la Connexion , un `reset` est envoyer \u00e0 l&rsquo;h\u00f4te distant, ce qui provoque un arr\u00eat brutale de la Connexion . Les octets \u00e9ventuellement en attente sont perdus.<\/p>\n<p><\/p>\n<h2>4 Le multiplexage dans une connexion de transport.<\/h2>\n<p>Lors d&rsquo;une communication en r\u00e9seau, les diff\u00e9rents processus s&rsquo;\u00e9changent des informations qui sont g\u00e9n\u00e9ralement destin\u00e9es \u00e0 plusieurs applications. Seulement ces informations transitent par la m\u00eame passerelle. Il faut donc savoir pour quelle application telle information est destin\u00e9e. On attribue donc des ports pour chaque application.<br \/>\n<br \/>Un port est comme une porte en sch\u00e9matisant. Les informations sont multiplex\u00e9es et passent par la passerelle. A leur arriv\u00e9e ou \u00e0 leur r\u00e9ception elles sont d\u00e9multiplex\u00e9es et chaque information distincte passe par le port qui lui est associ\u00e9. Les informations sont ensuite trait\u00e9es par l&rsquo;application correspondante.<br \/>\n<br \/>Un port est cod\u00e9 sur 16 bits, il y a donc 65536 ports.<br \/>\nLes 1024 premiers ports sont des ports bien connus (Well known ports), ces ports sont li\u00e9s \u00e0 des applications sp\u00e9cifiques.<\/p>\n<table>\n<tbody>\n<tr class='row_even'>\n<td><strong>Nom du service<\/strong><\/td>\n<td><strong>Num\u00e9ro de port<\/strong><\/td>\n<td><strong>Commentaire<\/strong><\/td>\n<\/tr>\n<tr class='row_odd'>\n<td>Ftp-data<\/td>\n<td>20<\/td>\n<td>FTP, data<\/td>\n<\/tr>\n<tr class='row_even'>\n<td>Ftp<\/td>\n<td>21<\/td>\n<td>FTP. Control<\/td>\n<\/tr>\n<tr class='row_odd'>\n<td>Telnet<\/td>\n<td>23<\/td>\n<td><\/td>\n<\/tr>\n<tr class='row_even'>\n<td>Smtp<\/td>\n<td>25<\/td>\n<td>Simple Mail Transfer Protocol<\/td>\n<\/tr>\n<tr class='row_odd'>\n<td>Tftp<\/td>\n<td>69<\/td>\n<td>Trivial File Transfer<\/td>\n<\/tr>\n<tr class='row_even'>\n<td>Http<\/td>\n<td>80<\/td>\n<td>World Wide Web<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Les ports r\u00e9f\u00e9renc\u00e9s permettent ainsi \u00e0 une application dite cliente, d&rsquo;identifier une application sur le syst\u00e8me distant. L&rsquo;extr\u00e9mit\u00e9 de la connexion cliente est identifi\u00e9 par un num\u00e9ro de port attribu\u00e9 dynamiquement (>1024) par le processus appelant. Ce num\u00e9ro de port est dit port dynamique ou \u00e9ph\u00e9m\u00e8re.<\/p>\n<h2> 5 Sch\u00e9ma d&rsquo;une connexion<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" aligncenter size-full wp-image-17\" src=\"https:\/\/fredptitgars.ovh\/wp-content\/uploads\/2007\/11\/Schema_connexion-b07.gif\" alt=\"Schema_connexion.gif\" align=\"center\" width=\"601\" height=\"471\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1 L&rsquo;origine des sockets La version BSD 4.1c d&rsquo;Unix pour VAX, en 1982, a \u00e9t\u00e9 la premi\u00e8re \u00e0 inclure TCP\/IP dans le noyau du syst\u00e8me d&rsquo;exploitation et \u00e0 proposer une interface de programmation de ces protocoles : les sockets. Les sockets sont ce que l&rsquo;on appelle une API (\u00ab\u00a0Application Program Interface\u00a0\u00bb) c&rsquo;est \u00e0 dire une [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":17,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-18","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatique"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/posts\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=18"}],"version-history":[{"count":0,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/posts\/18\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/media\/17"}],"wp:attachment":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=18"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=18"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}