Activité pratique 1

Durée1h15

Clients-serveur en ligne de commande

Introduction

Petits rappels du cours réseau:

  • Choix d’architecture des communications

    • clients-serveur   pair-à-pair   bus
  • Impact sur les types de relations de communication

    • one-to-one   many-to-one   many-to-many
  • Différents paradigmes de comportement

    • Message Passing: j’envoie un message, l’autre en fait ce qu’il veut, il renverra un message plus tard, ou pas

    • Control Command: je surveille ce que l’autre fait et je lui donne des commandes, il obéit

    • Remote Procedure Call: j’invoque une procédure à distance en passant des paramètres et j’attends la valeur de retour


Compte tennu du contexte de notre projet de Smart Grid, nous choisirons:

  • un mode clients-serveur (des capteurs, une base de données),
  • des relations many-to-one (il y a plusieurs clients, un seul serveur),
  • et sous forme de message passing (simple envoie des valeurs des données).

C’est un choix assez classique, mais gardez en tête qu’il y en a d’autres de possibles.

Des clients serveurs de test

ncat

Le logiciel ncat (que vous avez installé avec la suite Nmap) est un outil d’aide au test réseau. Suivant les options sur la ligne de commande, il peut se comporter comme un client ou comme un serveur, en IPv4 ou en IPv6, avec des sockets TCP ou UDP, sur des numéros de port de notre choix, et pleins d’autres variantes subtiles. Il nous sera donc bien utile pour des premiers essais. D’autres outils du même type existent (Netcat socat), celui-ci a le mérite d’être disponible pour Linux Windows Mac.

Regardez sa documentation:

Client serveur simple

  • Ouvrez deux consoles terminal.

    • Dans l’une, lancez ncat -l -4 5050

      Elle joue le rôle de serveur.

    • Dans l’autre, lancez ncat -4 localhost 5050

      Elle joue le rôle de client.

    • Tapez quelques caractères au clavier dans l’une ou l’autre des consoles et voyez ce qu’il se passe.

    • Terminer par un “Ctrl-D

      • dans la console serveur d’abord,
      • puis dans la console client;
      • au besoin, recommencez et réessayez dans l’ordre inverse.
    • Recommencez, mais cette fois terminez par un “Ctrl-C

      • notez la différence de comportement;
      • une petite explication ?
  • Replongez-vous dans la documentation de ncat et expliquez ce que fait chacune des options passées en paramètre:

    • -l ?
    • -4 ?
    • localhost ?
    • 5050 ?

Plusieurs clients pour un serveur

  • Ouvrez trois consoles terminal.

    • Dans la première, lancez ncat -l -4 5050

    • Dans la seconde, lancez ncat -4 localhost 5050

    • Dans la troisième, lancez également ncat -4 localhost 5050

    • Que se passe-t-il ? Pourquoi ?

  • Second essai

    • Dans la première, réessayer des variantes:

      • ncat -l -4 5050 -k
      • ou ncat -l -4 5050 --broker
      • ou ncat -l -4 5050 --chat
    • Lancez dans les deux autres consoles ncat -4 localhost 5050

    • Lors de chaque essai, pensez à taper du texte dans les trois consoles.

    • Consultez la documentation à propos de ces nouvelles options, et confrontez-la à vos expériences.

Plusieurs clients pour plusieurs serveur

  • Ouvrez une quatrième console terminal.

    • Dans la première, on a toujours ncat -l -4 5050

    • Dans la seconde, on a toujours ncat -4 localhost 5050

    • Dans la troisième, lancez cette fois-ci un autre serveur sur un autre numéro de port ncat -l -4 5060

    • Dans la quatrième, lancez ncat -4 localhost 5060

  • Tapez quelques caractères au clavier ici et là.

    Que constatez-vous ?

    Cela vous semble cohérent avec la notion de port TCP vu en cours réseau ?
    (Faire la correspondance entre les paquets qui arrivent et l’application concernée…)

Analyse des paquets réseau

Regardons à quoi ressemblent les paquets réseau échangés grâce au logiciel Wireshark (cf. séance 2 de réseau).

  • Cette fois-ci, sélectionnez l’interface réseau Loopback (appelée localhost ou lo, suivant les cas). Tout d’abord, pourquoi cette consigne ?

  • Recommencer les expériences avec ncat en mode client-serveur simple.

  • Avec Wireshark, repérer dans les paquets l’adresse IP 127.0.0.1, le protocole TCP, le numéro de port 5050, le contenu des messages.

  • Repérez les différentes phases de la communication:

    • l’établissement de la connexion (poignée de main en trois coups);
    • le contenu des échanges (en principe, vous voyez ce que vous avez tapé au clavier);
    • puis la clôture de la connexion.
  • Recommencez l’expérience en UDP, c-à-d. en ajoutant l’option -u à ncat dans les deux consoles.

    • Voyez ce qui change ou pas dans Wireshark (protocole, numéro de port, nombre de paquets, etc.)
  • Recommencez l’expérience en IPv6 (option -6).

    • Faites l’expérience tant en TCP qu’en UDP.
    • Voyez ce qui change ou pas dans Wireshark (au hasard, les adresses IP ?)
  • Pour reboucler avec les notions de couches protocolaires vues en cours, qu’est-ce qui relève de la couche réseau, et qu’est-ce qui relève de la couche transport ?

Envoi de données structurées

Pour l’instant, dans nos tests, nos clients serveurs se sont envoyés des messages qui contenaient un peu n’importe quoi, une suite de caractères tapés au clavier.

Et si nous décidions d’un format de messages pour structurer nos données ? (On va parler de sérialisation.)

Il existe de nombreux formats pour cela (ASN.1 CBOR JSON XML YAML …)

Prenons pour exemple le format Json.

  • Reprenez notre client-serveur simple avec ncat

  • Au lieu de taper n’importe quoi dans les consoles, tapez des chaines à-la-json, comme ce que pourrait être le message d’un capteur (repéré par un identifiant) qui envoie la valeur d’une mesure:
    { "id": "#F324", "value": 13.5 }

  • Regardez les paquets dans Wireshark: ça passe tel-quel

Tenter de joindre le PC de son voisin

  • Retrouvez votre propre adresse IP.

  • Discutez avec votre voisin, indiquez-lui votre IP, négociez qui d’entre vous fait le serveur et qui fait le client, sur quel numéro de port, dans quel protocole.

  • Reprenez vos essais avec ncat, mais cette fois-ci entre votre PC et celui du voisin.


  • Problème possible (quasi certain): le firewall du PC bloque la connexion entrante, le PC qui fait serveur ne reçoit jamais rien du voisin.
    • Chercher sur Internet comment faire pour “ouvrir ses ports”. (eg. Windows Linux Mac …)

    • Attention: il s’agit d’ouvrir le port (celui choisit pour l’exercice), le temps de l’exercice (et pas de façon permanente).

    • On peut aussi choisir de désactiver (le temps de l’exercice) son firewall.


  • Ça marche ? Bravo ! … vous pouvez passer à la suite