L'objectif de ce TD est se familiariser avec la transmission multipoint (ou multicast) sur réseau local. Certaines topologies de réseaux locaux (tels que Ethernet) supportent la diffusion (ou broadcast), c'est à dire l'envoi d'un message à toutes les machines connectées au réseau en une seule opération d'envoi. La mise en oeuvre d'un filtrage au niveau de la carte Ethernet permet de supporter au dessus de broadcast Ethernet, un service de transmission multipoint, c'est à dire vers toutes les machines ayant exprimé leur intérêt à recevoir les données envoyées, en s'abonnant à un "groupe multipoint".
 

Exercice 1

Il s'agit de programmer une application de "chat" à plusieurs (ou discussion multipoint) associée à un groupe multipoint. Il faudrait donc joindre le groupe de discussion (voir ci-dessous), envoyer vers le groupe multicast toutes les lignes lues sur l'entrée standard et d'afficher sur la sortie standard toutes les lignes reçues sur "socket" multicast (de la classe MulticastSocket) qui est en fait le point de reception des données envoyées au groupe multicast.

Socket.joinGroup(address) permet de rejoindre un groupe multicast. Utiliser l'adresse 224.4.4.4 avec un numéro de port 4567 et un TTL (Time To Live) de 1, ce qui revient à ne pas dépasser les frontières du réseau local. Si vous voulez tester votre programme sans recevoir les messages envoyés par les autres, utiliser alors une adresse spécifique à vous entre 224.1.1.1 et 230.255.255.255

Socket.leaveGroup(address) permet de quitter le groupe.
La documention sur les socket multicast se trouve ici.

Vous trouverez ici une solution.

Exercice 2

Refaire l'exercice ci-dessus en utilisant un programme d'émulation MAC par envoi de paquets multicast :

Mac.sendPacket (p) permet d'envoyer un DatagramPacket p.

p = Mac.receivePacket () permet d'attendre un paquet et de le recevoir.

Un backoff (délai avant envoi) aléatoire est tiré avant d'émettre un paquet.

Un paquet est reçu avec une certaine probabilité fixe.

Cela permet d'émuler une couche MAC non fiable avec transmission des paquets dans le désordre. En effet, même si la couche Ethernet est théoriquement non fiable, il est très rare d'avoir une perte de paquet sur Ethernet. D'autre part, sur le réseau local, il n'y a pas en réalité un déséquencement des paquets d'une même source, alors que ceci peut avoir lieu dans le cas d'une communication sur un réseau étendu.

Il suffit que chaque élève copie ce fichier dans son répertoire de travail le fichier Mac.java pour pouvoir utiliser les deux fonctions décrites ci-dessus.

TestMac.java est un exemple de programme utilisant l'émulateur. Lancer par exemple :
    - "java TestMac listen" sur une machine, ce qui affiche le contenu de tous les paquets reçus
    - "java TestMac test 20 test_un" sur une autre, ce qui envoie 20 paquets avec pour contenu "test_un_0", "test_un_1", ...

Dans cet exemple, 231.1.2.3 est utilisée comme adresse multicast.

Dans cet exercice 2, utiliser la fonction Mac.sendPacket avec un taux de perte nul au lieu d'utiliser Socket.send () directement. Comme les paquets seront reçus dans le désordre, il faudrait prévoir le remise en séquence des paquets.

Exercice 3

Idem que 2, mais avec un taux de perte non nul. Prévoir alors la fiabilisation de la communication.