Vous êtes sur la page 1sur 5

Rseaux Locaux industriels

TP 1 : Communication Dterministe sur Ethernet

Objectif

Emulation du protocole des Bus jeton sur Ethernet


Evaluer les bons paramtres de configuration du jeton
Programmation des Sokects avec JAVA

Travail demand
Lutilisation dEthernet dans le domaine des rseaux industriels prsente linnovation de lutilisation de mthode daccs non
dterministe. En effet CSMA/CD est une politique probabiliste qui ne garantie pas des temps de transmission prvisibles.
Laspect de prdictibilit est important pour les messages des applications temps rel critiques. Pour raliser cet objectif, une
solution intressante est dutiliser ou dimplmenter les protocoles Jeton. Dans le cadre de ce TP, il est demand de raliser :
implmentation simplifie du protocole Jeton similaire celui des bus jeton. Dans ce TP, on ne traite pas des
aspects de perte de jeton, ni des aspects de priorit, ni aspect de gestion des ajouts/suppressions des stations (les
stations sont connue et fixes).
Simuler larriver des messages en supposant une charge priodique bien dtermine sur le rseau. On suppose la
connaissance lavance du nombre de messages, leurs sites sources, destinations et leurs tailles. Les messages sont
priodiques de priodes darrives dfinis. Lutilisateur doit pouvoir introduire ces paramtres afin de commencer
lexcution du protocole Jeton sur larrivs de ces messages.
Afin de valider et visualiser les rsultats de limplmentation du protocole jeton, on doit pouvoir visualiser les
arrives/dparts des messages, la station qui possde le jeton, la communication du jeton.
En relation avec la simulation de la charge, on doit pouvoir calculer les temps de rponse des messages dans le pire
cas, le meilleurs des cas et dans le moyen cas. Les temps de rponse des messages reprsentent la diffrence entre le
temps darrive du message destination et le temps de sa cration dans le site source.

Background
I) Protocole daccs de Bus Jeton
Physiquement, le bus jeton est constitu d'un cble prsentant une topologie linaire ou arborescente sur lequel sont
raccordes les stations. Fonctionnellement, les stations sont organises selon un anneau logique, chacune d'elles connaissant
l'adresse de ses voisines, en amont et en aval, sur l'anneau logique. Ds que l'anneau logique est initialis, c'est la station
d'adresse la plus leve qui a autorit pour transmettre une premire trame sur le rseau. Ensuite, elle transmet le droit
d'mettre sa voisine en aval en lui adressant nommment une trame spciale appele jeton (token). Le jeton se propage ainsi
tout au long de l'anneau logique, avec pour rgle fondamentale que seule la station propritaire du jeton a le droit de
transmettre une trame. Comme, chaque instant, une seule station est propritaire du jeton, il ne peut pas y avoir de collisions
entre trames du rseau.

Protocole MAC 802.4


Lorsque l'anneau logique est initialis, les stations sont insres au sein de l'anneau dans l'ordre de leur adresse, de la plus
haute la plus basse. Le transfert du jeton d'une station l'autre s'effectue galement selon la mme squence. Chaque fois
qu'une station acquiert le jeton, elle peut transmettre pendant une dure de temps limite dtermine, contrle par un compteur
de temps de transmission. Puis elle doit passer le jeton sa voisine.
Le bus jeton dfinit un systme de priorit quatre niveaux, rfrencs 0, 2, 4 et 6, le niveau 0 ayant la priorit la plus faible
et le niveau 6, la plus leve. Il est facile d'imaginer que chaque station est subdivise sur le plan interne en quatre sousstations, chacune d'elles disposant d'un niveau de priorit. A mesure que les trames transmettre sont proposes la couche
MAC, on les affecte, en fonction de leur niveau de priorit, l'une des 4 sous-stations, de sorte que chaque sous-station gre
une file d'attente des trames de mme priorit.
Lorsqu'une station prend possession du jeton, elle transfre immdiatement ce droit mettre la sous-station de niveau de
priorit 6 qui peut alors commencer transmettre ses trames en attente. Quand elle a termin sa transmission, ou lorsque son
compteur de temps de transmission a expir, elle transmet le droit d'mettre la sous-station de niveau de priorit 4, qui peut

TP Rseaux Locaux Industriels N2

1/5

RT4

INSAT

2007/2008

son tour transmettre jusqu' ce que son compteur de temps de transmission expire, puis elle passe le jeton la sous-station de
niveau de priorit 2. Ce processus se reproduit dans les mmes conditions pour le niveau de priorit 0. Le jeton est ensuite
transfr la station suivante sur l'anneau logique.

II) Elment de programmation JAVA : Gestion des tableaux, de chanes et des


fichiers
- java.util.Vector
Cette classe gre une collection d'objet dans un tableau dynamique.
Vector v = new Vector();
v.addElement("une chaine");
v.addElement(new date()); v.addElement(new String[]); v.addElement(new Vector());
v.setElementAt("abcde", 2);
System.out.println(v.elementAt(2)); // --> abcde

- java.util.Hashtable
Cette classe gre une collection d'objets au travers d'une table de hachage dont les cls sont des String et les
valeurs associes des Object.
Hashtable ht = new Hashtable();
ht.put("noel", new Date("25 Dec 1997"));
ht.put("un vecteur", new Vector());
Vector v = (Vector)ht.get("un vecteur");
for(Enumeration e = ht.keys(); e.hasMoreElements();){
String key = (String)e.nextElement;
...}

- java.util.StringTokenizer
Cette classe permet de dcouper une String selon des sparateurs.

String str = "avion, bateau ; train ";


StringTokenizer st = new StringTokenizer(str, ";, ");
System.out.println(st.nextToken()); // --> avion
System.out.println(st.nextToken()); // --> bateau
System.out.println(st.nextToken()); // --> train

- java.io.Data(Input|Output)Stream
Ces classes permettent de lire et d'crire des types primitifs et des lignes sur des flux.
FileInputStream fis = new FileInputStream("source.txt");
DataInputStream dis = new DataInputStream(fis);
int i
= dis.readInt(); double d = dis.readDouble(); String s = dis.readLine();
FileOutputStream fos = new FileOutputStream("cible.txt");
DataOutputStream dos = new DataOutputStream(fos);
dos.writeInt(123); dos.writeDouble(123.456); dos.writeChars("Une chaine");

- java.io.Object(Input|Output)Stream
Ces classes permettent de lire et d'ecrire des objets, implmentant java.io.serializable , sur des flux.

TP Rseaux Locaux Industriels N2

2/5

RT4

INSAT

2007/2008

// Ecriture
FileOutputStream fos = new FileOutputStream("tmp");
ObjectOutput oos = new ObjectOutputStream(fos);
oos.writeObject("Today"); oos.writeObject(new Date()); oos.flush();
// Lecture
FileInputStream fis = new FileInputStream("tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
String today = (String)ois.readObject();
Date date = (Date)ois.readObject();

II) Mcanisme des Sockets avec JAVA


Il y a deux protocoles de transport dans l'Internet :

TCP (Transmission Control Protocol) offre un service de transport fiable en mode connect ; les classes Socket et
ServerSocket implmentent un service de transport bas sur TCP

UDP (User Datagram Protocol) offre un service de transport non fiable en mode non connect ; les classes
DatagramPacket et DatagramSocket implmentent un service de transport bas sur UDP

Une requte de transport est spcifie par le protocole (TCP ou UDP) et les deux adresses de transport, du client et du serveur.
Ce sera un quintuplet, par exemple (TCP, 192.54.21.35, 6492; 192.54.21.74, 21) dans le cas d'une connexion Telnet

Sockets, ct client
Java permet la communication entre deux processus par un mcanisme de flot bas sur le protocole TCP, au moyens des sockets.
Ce sont des objets de la classe Socket, dont les constructeurs et certaines mthodes peuvent dclencher l'exception
IOException. Un socket est construit partir de l'adresse de transport distante :
InetAddress a = InetAddress.getByName("www.enpc.fr");
Socket httpSocket = new Socket(a, 80);
Socket localDateSocket = new Socket("localhost", 13);
Les mthodes getInetAddress() et getPort() d'une part, getLocalAddress() et getLocalPort(), d'autre part
permettent d'obtenir l'adresse de transport distante (spcifie en argument du constructeur) et l'adresse de transport locale.
La mthode getInputStream() de la classe Socket permet de lire un flot de donnes partir d'un socket ; la mthode
getOutputStream() permet d'crire un flot de donnes destination d'un socket. Un programme peut se connecter un
serveur distant en crant un socket (client) et en utilisant les flots d'entre et de sortie de ce socket. La cration de ce socket
exprime une demande d'un service de transport TCP, qui devra tre satisfaite par une connexion mise en place par la machine
distante. Le programme suivant se connecte au port 13 de la machine locale l'aide d'un socket, reoit sur le flot d'entre de ce
socket une chane de caractres, ferme le flot et ferme la connexion :
import java.io.*; import java.net.*;
class ClientDate {
public static void main(String[] args)
throws IOException {
Socket localDateSocket = new Socket("localhost", 13);
BufferedReader reponse = new BufferedReader(new InputStreamReader(
localDateSocket.getInputStream()));
String date = reponse.readLine();
System.out.println("Date : " + date);
reponse.close();
localDateSocket.close(); }}

Serveurs
Le processus serveur correspondant au client ClientDate doit couter en permanence sur un port (on doit
choisir un port suprieur ou gal 1024, plutt que 13, qui est le port du serveur time standard). Cette
coute est ralise par un objet de la classe ServerSocket. Quand un autre processus demande une
connection ce port, la mthode accept() de l'objet serveur est invoque ; celle-ci retourne un socket qui

TP Rseaux Locaux Industriels N2

3/5

RT4

INSAT

2007/2008

ralise la connexion demande avec le socket client. Contrairement au socket ct client, celui ct serveur
n'est pas cr par un constructeur.
import java.net.*; import java.io.*;
public class ServeurDate {
final static int PORTDATE = 1314;
public static void main(String[] args) throws IOException {
ServerSocket serveur = new ServerSocket(PORTDATE);
Socket connexion;
PrintWriter p;
while (true) { connexion = serveur.accept();
p = new PrintWriter(connexion.getOutputStream());
p.println(new java.util.Date());
p.flush();
connexion.close();
} }}
Une autre forme du constructeur permet de spcifier le taille maximum de la file d'attente des demandes de connexions :
ServerSocket serveur = new ServerSocket(PORTDATE, 16);

Datagrammes UDP
Le protocole UDP est beaucoup plus simple, ne permettant pas de reconstituer l'ordre d'envoi des messages, donc plus efficace,
mais moins fiable, puisqu'il n'est pas dot d'accus de rception. Les donnes sont places dans un datagramme UDP, muni
d'un en-tte comportant les numros de port d'origine et de destination, la taille du datagramme et une somme de contrle ; ce
datagramme est lui-mme plac dans un datagramme IP (ou paquet IP), muni d'un en-tte comportant entre autre les adresses
IP d'mission et de rception. cause de ces deux en-ttes, la taille des donnes est limite 65 507 octets.
Ces datagrammes sont implments en Java par des objets de la classe DatagramPacket ; les donnes sont contenues dans
un tableau d'octets. Voici d'abord la construction d'un datagramme destin une machine distante, partir des donnes et de
l'adresse de transport distante :
String s = "Des donnes, ...";
byte[] donnees = s.getBytes();
InetAddress adresse = InetAddress.getByName("www.enpc.fr");
final int PORT = 1314;
DatagramPacket paquet = new DatagramPacket(donnees, donnees.length, adresse, PORT);

En rception 9ct serveur), il faut construire un datagramme l'aide d'un tableau d'octets qui recevra les
donnes :
byte[] donnees = new byte[8096];;
DatagramPacket d = new DatagramPacket(donnees, donnees.length);
Les mthodes getData, getLength, getAddress, getPort permettent d'obtenir le tableau d'octets des donnes, la taille
des donnes (en octets) et l'adresse de transport distante. Dans le cas d'un datagramme de rception, ces mthodes ne devront
tre invoques qu'aprs rception.

Sockets UDP
Ces datagrammes sont mis et reus par l'intermdiaire d'un objet de la classe DatagramSocket. Ses constructeurs peuvent
dclencher l'exception SocketException. En mission (ct client), on utilise un port anonyme pour construire le
DatagramSocket, puis la mthode send :
String s = "Des donnes, ...";
byte[] donnees = s.getBytes();
InetAddress adresse = InetAddress.getByName("www.enpc.fr");
final int PORT = 1314;
DatagramPacket paquet = new DatagramPacket(donnees, donnees.length, adresse, PORT);
DatagramSocket client = new DatagramSocket();
client.send(paquet);
En rception, le port doit tre pass en argument au constructeur DatagramSocket(int), et la mthode receive remplit
le tableau d'octets du paquet :
final int PORT
DatagramSocket
byte[] donnees
DatagramPacket

= 1314;
serveur = new DatagramSocket(PORT);
= new byte[8096];;
paquet = new DatagramPacket(donnees, donnees.length);

TP Rseaux Locaux Industriels N2

4/5

RT4

INSAT

2007/2008

serveur.receive(paquet);

Client UDP
Le programme suivant communique avec le port 1315 d'une machine ventuellement spcifie sur la ligne de commande,
l'aide d'un DatagramSocket. chaque ligne entre par l'utilisateur, constituant la requte, il prpare un paquet contenant la
requte, l'envoie sur ce DatagramSocket, puis reoit un paquet contenant la rponse sur ce mme DatagramSocket.
import java.io.*; import java.net.*;
class ClientEchoUDP {
public static void main(String[] args) throws UnknownHostException, IOException {
String nomHote = args.length>0 ? args[0] : "localhost";
InetAddress adresse = InetAddress.getByName(nomHote);
final int PORT = 1315;
String requete, reponse;
DatagramPacket paquetRequete, paquetReponse;
DatagramSocket client = new DatagramSocket();
BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
byte[] donneesRequete, donneesReponse = new byte[8096];
while (!(requete = entree.readLine()).equals(".")) {
donneesRequete = requete.getBytes();
paquetRequete = new DatagramPacket(donneesRequete, donneesRequete.length,
adresse, PORT);
paquetReponse = new DatagramPacket(donneesReponse, donneesReponse.length);
client.send(paquetRequete);
client.receive(paquetReponse);
reponse = new String(paquetReponse.getData());
System.out.println(paquetReponse.getAddress() + " : " + reponse);
}
client.close(); } }

Serveur echo UDP


Serveurs et clients se programment de faon assez symtrique. Le programme suivant cre un DatagramSocket en rception
sur le port 1315. Dans une boucle infinie, il cre un paquet requte, le remplit, cre un paquet contenant la rponse et l'met. Le
paquet rponse contient les mmes donnes que le paquet requte, ce qui est souhait pour un serveur d'cho, et a pour adresse
de destination l'adresse d'mission du paquet requte. Le mme DatagramSocket sert aux communications avec tous les
clients sans qu'il soit ncessaire, dans cet exemple, de crer un thread par client.
import java.io.*; import java.net.*;
class ServeurEchoUDP {
public static void main(String[] args) throws UnknownHostException, IOException {
final int PORT = 1315;
DatagramPacket paquetRequete, paquetReponse;
DatagramSocket serveur = new DatagramSocket(PORT);
byte[] donneesRequete = new byte[8096], donneesReponse;
while (true) {
paquetRequete = new DatagramPacket(donneesRequete, donneesRequete.length);
serveur.receive(paquetRequete);
paquetReponse = new DatagramPacket(paquetRequete.getData(),
paquetRequete.getLength(), paquetRequete.getAddress(),paquetRequete.getPort());
serveur.send(paquetReponse);
}
}
}

TP Rseaux Locaux Industriels N2

5/5