Multicast local

L'objectif de ce TD est se familiariser avec la transmission sur réseau local. Certaines topologies de réseaux locaux (telle 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.

Pour cela, nous vous proposons de programmer une application de "chat" à plusieurs (ou discussion multipoint). Votre programme devra envoyer sur le réseau Ethernet de la salle toutes les lignes lues sur l'entrée standard et afficher sur la sortie standard tous les messages reçus sur le réseau.

1. Envoyer des paquets

Les mécanismes permettant d'envoyer des paquets en java reposant sur des notions qui seront vues plus loin en cours (ouverture de socket UDP multicast), nous allons utiliser la classe Mac qui contient deux fonctions send (byte[] content, int length) et receive (byte[] buf, int maxLength) permettant l'envoi et la reception de paquets :

2. Codage des messages

Pour pouvoir discuter les uns avec les autres, vos programmes devront tous suivre le même format de message suivant :

+---+---+
|  ID   |
+---+---+
| sender|
| name  |
|       |
+---+---+
|  seq  |
+---+---+
| length|
+---+---+
|message|
|  ...  |

Écrire une classe Paquet permettant de manier un tableau de bytes pour y écrire à la suite des champs selon un certain format de codage. On écrira ainsi une méthode void writeInt16 (int i) qui rajoute un nombre codé sur 2 octets en big endian, une méthode void writeFixedString (String s, int length) qui rajoute une chaîne de longueur déterminée length (on vérifiera que la chaîne a la bonne longueur) et une méthode void writeString16 (String s) qui rajoute une chaîne de longueur variable codée sur 2 octets. Enfin, on pourra envoyer un paquet p ainsi constitué par Mac.send (p.content, p.length).

Écrire de même des méthodes de lecture (readInt16(), ...) pour pouvoir décoder un paquet reçu par Paquet p = Paquet.receive () (qui reposera sur un appel à Mac.receive (p.content, ...)). Écrire finalement le programme de chat avec un thread pour la réception des messages, le thread principal étant dédié à l'envoi. Pour lire l'entrée standard, on pourra utiliser BufferedReader.readLine() :

        java.io.BufferedReader inp = 
            new java.io.BufferedReader (
                new java.io.InputStreamReader (System.in)) ;
        try {
            String ligne = inp.readLine () ;
        } catch (java.io.IOException e) {
            System.err.println (e) ;
        }

Une solution.

3. Ordonner les paquets

Dans une application réelle de chat sur Internet, les paquets peuvent subir des délais aléatoires durant la transmission sur le réseau. Ils risquent donc d'arriver dans le désordre. Pour tenir compte de cet effet la classe Mac permet d'augmenter artificiellement le délai par le paramètre Mac.backoff. Testez par exemple cet effet avec Mac.backoff = 1000 au début de votre programme et en tapant plusieurs lignes rapidement.

Corrigez votre programme pour remettre les paquets dans l'ordre.

4. Gérer les pertes de paquets

Les conflits d'accès multiple peuvent avec certaines couches MAC provoquer la perte de quelques paquets. Augmenter cet effet au moyen du paramètre Mac.probErreurReception et corriger votre programme pour demander la réémission des paquets perdus. (On augmentera le protocole d'un nouveau type de message final static NACK = 2 comportant le surnom de l'émetteur dont il manque un paquet, suivi du numéro du paquet manquant.)


Last modified: Thu Jan 20 15:25:18 CET 2005