Les bases de la "programmation réseau"

    Publicités

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)

Misuki

Git Wizard en freelance
V
Ancien staff
Jun 15, 2012
2,303
66
954
Bonjouar à tous.

Aujourd'hui, comme hier et comme dans le futur, nous utiliserons encore et toujours des moyens de transmissions de données, tous plus sophistiqués les uns que les autres.

En programmation, le domaine le plus dominant (et parce qu'on parle d'informatique), la transmission de donnée se fait en réseau.
Après la gestion des données en mémoire, la programmation réseau est un des domaine les plus difficiles à maîtriser en programmation.
Et pour cause: il faut avoir acquit plusieurs notions de programmation pour pouvoir "programmer en réseau".

Ce sujet aura pour but de vous enseigner les bases de ce qu'est le réseau, mais pas les bases d'un langage de programmation. Petit aparté: le langage de programmation utilisé ici sera le C#. Mais la théorie restera la même, quelque soit le langage que vous souhaitez utiliser.

J'essayerai de mettre un maximum d'illustrations et de structurer le sujet en plusieurs parties pour qu'il soit agréable à lire.

Voici quelques pré-requis pour pouvoir suivre sans trop de mal:
  • Connaître quelques bases de la programmation, c'est à dire la déclaration de variable, les boucles, les conditions, etc.
  • Avoir du temps ...
  • .. et de la patience. Car en effet, le temps et l'intérêt que vous porterez sur ce sujet influenceront votre capacité à retenir.
C'est bon ? Vous êtes bien armé, bien ancré dans votre siège ? Alors voilà une petite table des matières:
  1. C'est quoi, le réseau ?
  2. Notion de "Port"
  3. Synchrone, asynchrone ?.. C'est quoi ce chinois ?
Citation
Avant de commencer, j'aimerai vous avertir que dans ce sujet, j'utiliserai du vocabulaire technique. Cependant, j'expliquerai tous les mots de vocabulaire à la fin (dans le petit 4) en y ajoutant une référence. Ne soyez donc pas effrayé par ma manière de parler, vous verrez que vous comprendrez tout très facilement.
J'essayerai aussi de faire un maximum ce sujet sous la forme de question/réponse.
1. C'est quoi, le réseau ?
Le réseau, c'est le fait de pouvoir "créer" une communication entre deux programmes distants. Un exemple très courant: les jeux vidéos. Pour que le jeu vidéo fonctionne en mode "multijoueur", nous avons besoin de communiquer à tous les autres joueurs la position de votre personnage (par exemple) par internet: nous communiquons avec d'autres programmes, nous parlons donc de réseau.

On appelle aussi "un réseau" l'ensemble des appareils qui sont connectés à un routeur. Dans le langage courant, on dirait plutôt qu'un réseau domestique est constitué de tous les appareils qui sont connectés à la Box fourni par votre opérateur internet (LiveBox, FreeBox, etc...)

La raison pour laquelle cet ensemble est considéré comme un réseau se trouve dans le mot "connecté": en effet, vu qu'ils sont connectés à votre box, ils communiquent avec elle. On a donc une situation de réseau. ça rentre ?
Q: Je comprends pas... on n'a pas forcément besoin d'internet pour communiquer avec d'autres PC, alors ?

Et bien figurez vous que non. Enfin... avec quelques petites nuances.

Il existe plusieurs type de réseau: le réseau LAN et le réseau INET .
Le réseau LAN (Local Area Network, ou Réseau Local) est, comme son nom l'indique, une communication locale.Il communique directement sur votre réseau, sans établir aucune connexion avec un réseau extérieur.

On peut illustrer cette situation comme ceci:
9d9d754734.jpg


Schéma 1: Réseau local
La bulle bleue ciel correspond à un réseau. Les données transites entre les deux ordinateurs grâce au routeur(1). Celui-ci fait office "d'intermédiaire" pour sécuriser les données(2) que l'on transmet.

Comme vous pouvez le voir, j'ai introduis la notion de "routeur". Effectivement, quelque soit le réseau, il faut pouvoir le maîtriser et traiter les données avec beaucoup de sécurité. Je reviendrai là-dessus plus tard.

Le réseau INET (pour "Internet") quant à lui, est.. tout se qui n'est pas local. Toutes les communications avec un réseau extérieur, comme un serveur de jeu(3), sont des communications via internet, ce sont donc des réseaux INET.
C'est le réseau qu'on utilise le plus souvent. Là actuellement, vous l'utilisez: entre votre appel Skype et la shoutbox du forum, vous communiquez avec des serveurs distants.


Voilà comment nous pourrions illustrer cette situation (attention grande image):
88c7fa0aa7.jpg



Schéma 2: Réseau INET
Plusieurs réseaux locaux (voir schéma 1) mis en réseau par le biais du routeur. C'est lui qui fera la liaison entre les différentes machines des réseaux extérieurs (flèches noires).

Q: C'est pas difficile du tout ton truc, tu t'es moqué de moi là non ?

Non. La partie difficile commence maintenant.
En effet, je vous ai expliqué théoriquement comment cela fonctionne.

Cependant, c'est un peu plus pointue que cela.

Note: les informations ci-dessous concernant le modèle OSI ne sont pas importantes. Libre à vous de passer directement à la suite.

La communication réseau respecte ce qu'on appelle un "modèle". Généralement, c'est le modèle OSI(4) que l'on respecte.
Ce modèle a été adopté selon une norme (je ne sais plus laquelle) car Internet n'avait pas de réelle couche internet.

Le modèle OSI comporte 7 couches. Wikipédia nous donne un schéma très explicatif:
ed4115cc57.png


Vu que c'est un peu du charabia, je vais vous expliquer un peu plus simplement à quoi cela correspond.
Les 7 couches sont divisées en deux couches distinctes: les couches hautes et les couches matérielles.
Ainsi, les couches hautes sont généralement gérées par l'OS(5) directement. Par contre, les couches matérielles sont celles qui sont gérées du côté de l'application/du programme.
Comme vous pouvez le voir, le réseau est à la couche 3. Donc du côté "application".
Cela veut dire que c'est nous qui allons guider les données pour qu'elles arrivent au bon endroit. Mais avant cela, il faut savoir ce qu'est un protocole de communication réseau...

J'ai mis un lien wikipédia concernant le modèle OSI, jetez-y un petit coup d'oeuil si vous voulez en savoir plus.

Q:C'est quoi un "protocole de communication réseau" ?

Un protocole de communication réseau, c'est un protocole(6) permettant de communiquer des données d'après une certaine suite d'instructions(7)
Il en existe beaucoup, mais le plus souvent, on retrouve deux protocoles:
  • Le protocole TCP(Transmission Control Protocol): C'est le protocole le plus stable. Il garantie une transmission sécurisée et complète des données, avec un système propre à lui même:
    - Données complètes reçus
    - Données reçus dans l'ordre d'envois
    - Réponse du client/serveur distant qui dit qu'il a bien reçu le paquet

    Ce qui en fait donc un protocole transmettant des données qui sont assez lourdes. C'est pour cela que ce n'est pas très optimisé pour traiter les données en temps réel.
    Cependant, le TCP garantie que les données arriveront en entier. Il est donc très sécurisé.

    Nous pouvons ici en faire un schéma explicatif:
    2e1025558b.jpg



    Schéma 3: Envois d'une donnée avec le protocole TCP

    Les 3 étapes sont bien décrites par le schéma. Cela me permet d'introduire la notion de client et de serveur:

    Le client, c'est le programme communiquant avec un serveur. C'est donc celui qui se lance sur votre PC. Skype par exemple, agit comme un client: il envois au serveur votre statut de connexion, votre message, etc..
    Le serveur est très généralement un ordinateur qui se charge de mettre en relation plusieurs client. Pour reprendre l'exemple de Skype, le serveur de skype est un serveur interne à l'entreprise qui se charge de mettre en relation tous les clients connectés entre eux. Le message que vous avez donc envoyé dans cet exemple par votre client Skype sera traité par leur serveur (conversion des smileys en image, conversion des commandes, etc..) puis celui-ci se chargera d'envoyer le résultat final au/aux client(s) au(x)quel(s) vous avez envoyer ce message.

    Comme vous le voyez, il y a 3 étapes pour envoyer une donnée avec le protocole TCP: cela peut provoquer des ralentissements si on cherche à envoyer des données en temps réel.
    Les jeux vidéos, par exemple, utilisent beaucoup de communication réseau en temps réel. Cependant, contrairement à ce que l'on pourrait croire, ce n'est pas forcément le protocole TCP qui est utilisé. Celui-ci n'est utilisé que pour les actions importantes, car ce protocole garantie que les données seront envoyés correctement et dans l'ordre. Pour d'autres actions moins importante, les jeux vidéos utilisent le protocole UDP.
  • Le protocole UDP(User Datagram Protocol): C'est un protocole instable (c'est à dire qu'on est pas sûr que les données soient complètement arrivées à destination).
    En fin de compte, le protocole UDP est un peu l'inverse du protocole TCP. En effet, les données envoyées sont anonymes en UDP, on ne demande aucune confirmation d'envois et on ne garanti pas que les données seront toutes arrivées à destination. Il n'y a pas non plus d'ordre de traitement.
    L'avantage, c'est que ce protocole est 3 fois plus rapide que le protocole TCP. Ce qui permet donc, dans un jeu vidéo, de traité par exemple, le déplacement d'un personnage, qui n'est pas si important que ça dans un RPG.
Q: Mhh.. je comprends mieux ! Mais dis-moi, que peut-on envoyer, comme "donnée" ?

Très bonne question !
..
..
oui je me jette des fleurs.

En fait, on peut presque tout envoyé. Des chaînes de caractères, des nombres, des tableaux... En fait, tout ce qu'on peut stocker en mémoire peut être envoyé en réseau. C'est d'ailleurs pour cela que la difficulté de la programmation réseau est proche de celle de la gestion des données en mémoire.
Cependant, à travers une transmission, on ne pourra remarquer que des 0 et des 1: c'est le binaire.

Q: Euh.. personnellement.. je me vois mal faire du binaire...

... et bien moi aussi, figurez vous. C'est pourquoi, généralement, on ne crée pas les données directement en binaire: on crée des "paquets".
C'est bien plus simple à faire, et à envoyer !

Ces paquets, personne à part vous, créateur du paquet, savez comment ils sont formés. La taille d'un paquet est variable; sont type aussi; sont contenu aussi; etc...
Donc pour qu'un serveur reconnaisse votre paquet et puisse le reconstruire de son côté, on met, au début du paquet, toutes les instructions pour pouvoir le reconstruire:
le type du paquet, son contenu, sa taille, etc...

Ces instructions forment le header. C'est lui qui va indiquer comment reformer le contenu du paquet en clair pour pouvoir l'interpréter.
Très souvent, le header contient seulement la taille du paquet. Ainsi, la forme d'un paquet peut être celle-ci:

|taille du paquet (sur 4 octets, donc un entier)|contenu du paquet (données)| informations supplémentaires |

Le rouge correspond au header. Remarquez que la taille est encodé sur 4 octets, ce qui correspond à 32 bits, soit un integer. Ainsi, pour lire ce paquet, on lit d'abord les 4 premiers octets (pour récupérer la taille totale du paquet), puis on continu à lire jusqu'à-ce qu'on arrive à la taille maximale.

C'est tout pour cette première partie.


2. Notion de "Port" en réseau
Sur votre ordinateur, vous avez une multitude de processus qui envoient des données à tout va. Une question se pose donc...

Q: ... ça sature pas ???!

Exacte !

En temps normal, si on envois trop d'informations en même temps par le même moyen de transmission, ben... ça sature !
Heureusement, le monde est bien fait, et c'est là que les ports réseaux interviennent.

Q: C'est quoi ça encore, un "port" ?

Un port, c'est une << porte >> vers votre système d'exploitation. En effet, comme vous l'avez vu dans la première partie, le réseau est la couche 3 du modèle OSI. Et bien dans cette même couche, nous avons les Ports. Ils permettent d'ouvrir des portes temporairement pour qu'un programme puisse envoyer des données quelque part sur un serveur externe.
Les ports se nomment par leurs numéro. Leur identifiant est encodé sur 16 bits: cela fait un total de 2^16 ports, soit 65 536 ports possibles.

Entre autre, si on reprend le schéma 3 sur la transmission de donnée en TCP, on peut rajouter la notion de port dessus:
2c40ceb1a8.jpg


Schéma 4: port + tcp
Ici, le port utilisé pour communiquer est le port 456. Il ouvre la porte à toutes les données qui veulent y passer

Ainsi, les ports sont comme une étiquette d'identification, un identifiant de la connexion entre deux programmes.
Cependant, on ne peut pas utiliser toutes les étiquettes. Car en effet, certaines sont déjà ouverte pour un certain type de communication.
Par exemple: le port 80 est utilisé pour les transmissions de type "HTTP" par un navigateur web
ou encore, le port 443 est utilisé pour les transmissions sécurisés de type "HTTPS" par un navigateur web.

Lorsqu'on ouvre un port sur sa box, on ouvre un chemin d'accès vers les systèmes d'exploitations qui sont connectés à cette box. Alors faites bien attention à ce que vous faites !

Comme la couche 3 du modèle OSI est une couche applicative, c'est dans notre application, lors de la connexion, que nous choisissons le port de communication.
L'avantage, c'est qu'il ne sera ouvert que lorsque la connexion sera active: le port sera aussitôt refermé dès que la connexion est coupée.

Quelques informations supplémentaires concernant les ports (comme les ports déjà utilisés): Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!





3. Synchrone, asynchrone ?.. C'est quoi ce chinois ?

Vous avez sûrement déjà entendu parler de ces termes: synchrone et asynchrone.
Je ne vais pas beaucoup m'étendre sur ce sujet, car il est plus intéressant de s'y intéressé avec une exemple concret.

Cependant, voici une brève explication:

On parle d'opérations synchrone (abrégé sync) et d'opération asynchrone (abrégé async) lorsqu'un programme comporte des threads.
Les Threads sont des sous-processus, qui travaillent en tâche de fond.

Un opération est dite "synchrone" (sync) lorsqu'il y a un seul thread qui exécute tout de manière linéaire.
Par exemple, faire une connexion à un FTP avec un seul thread, de façon linéaire, est une opération bloquante, car le programme doit attendre de savoir si les informations ont bien été reçus avant de continuer. Notre application est donc synchrone.

à contrario, une opération est dite "asynchrone" (async) lorsque plusieurs threads travaillent ensemble sur une opération.
Toujours avec l'exemple du FTP, si cette fois-ci la connexion est géré dans plusieurs threads, l'opération est donc non bloquante (car on continu à faire d'autres choses dans d'autres threads), donc notre application est asynchrone.

4. Vocabulaire

1: routeur: Le routeur est un outil intermédiaire en réseau. Il sert à faire la liaisons entre une structure réseau et une autre.
2: données: Les données, c'est ce qu'on envois à une autre plateforme.
3: serveur de jeu: La plupart du temps, un serveur est un ordinateur qui n'a pas d'écran: il sert juste à traiter des données, et à les renvoyer aux clients. (explication plus loins).
4: modèle OSI: Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
5: OS: Abréviation de Operating System, système d'exploitation (comme Windows 7, Windows 10, Ubuntu, etc.)
6: Protocole: Suites d'instructions à respecter
7: Instructions: Ce sont des ordres à effectuer.

Voilà, c'est fini !
J'espère que ce sujet vous a été instructif, et que vous retiendrez des choses. En tous cas, j'apprécie le courage d'avoir tout lus.
 

Naboss

V
Jan 2, 2015
2,604
275
143
Ok

J'espère que ma réponse va t'achever

Grâce à cela je pourrais devenir un vrai administrateur réseau

Thanks.
 
Last edited:

Sapuraizu

Nouveau Marchand
Apr 3, 2016
157
2
444
Wow, merci d'avoir pris le temps d'écrire tout ça, je ne connaissais pas le modèle "OSI(4)" d'ailleurs, j'en connaissais aucun ! me voilà moins con :hap:
Je pense que ça en aidera plusieurs, même si à certains niveaux, ce n'est que de la logique! (notamment dans la compréhension de certains termes cf. 3)