communication entre processus - udp from coulouris, dollimore and kindberg distributed systems:...
TRANSCRIPT
Communication entre processus - UDP
From Coulouris, Dollimore and Kindberg
Distributed Systems: Concepts and DesignEdition 3, © Addison-Wesley 2001
Chapitre 4
Plan
Caractéristiques des protocoles de communication entre processus dans un système réparti
Principes généraux
communication par datagrammes
• Client-serveur• Communication de groupe
par flots (streams)• Client-serveur
construction de protocoles pour les patterns de communication client-serveur : requête-réponse groupe : même message est envoyé à plusieurs processus
données représentation des objets dans les messages références à des objets distants
Interface de programmation pour UDP
abstraction la plus simple pour la transmission de messages
permet au processus émetteur d ’envoyer un message au processus destinataire
les paquets indépendants sont appelés datagrammes
spécification de la destination via un socket socket : référence indirecte à un port spécifique du
processus destination sur son ordinateur hôte
Communication par datagrammes
Un datagramme transmis par UDP (User Datagram Protocol)
pas d ’accusé de réception pas de ré-émission le message peut ne pas arriver
Fonctionnement
Émetteur :processus client créer un socket lié à une adresse Internet et un port
quelconque libre pour recevoir la réponse
Récepteur : processus serveur créer un socket lié à une adresse Internet et un port
serveur prédéterminé connu des clients la méthode receive rend
l ’adresse Internet de l ’émetteur le numéro de port de l ’émetteur le message
Communication par datagrammesexemple simple : le serveur
import java.net.*; import java.io.*; // UDP server repeatedly receives a request and sends it back to the client public class UDPServer{
public static void main(String args[]){ DatagramSocket aSocket = null; try{ aSocket = new DatagramSocket(6789); // port convenu avec les clients
byte[] buffer = new byte[1000];
while(true){ DatagramPacket request = new DatagramPacket(buffer, buffer.length); aSocket.receive(request); // réception bloquante
DatagramPacket reply = new DatagramPacket( request.getData(), request.getLength(),
request.getAddress(), request.getPort());
aSocket.send(reply); // émission non-bloquante }
}catch (SocketException e){System.out.println("Socket: " + e.getMessage()); }catch (IOException e) {System.out.println("IO: " + e.getMessage());}}
finally {if(aSocket != null) aSocket.close();}}}
import java.net.*; import java.io.*;
//UDP client sends a message to the server and gets a replypublic class UDPClient{ public static void main(String args[]){
// args give message contents and server hostnameDatagramSocket aSocket = null; try {
// socket + port quelconque pour envoyer et recevoir la réponse aSocket = new DatagramSocket(); byte [] m = args[0].getBytes();
InetAddress aHost = InetAddress.getByName(args[1]);int serverPort = 6789; // port convenu avec le serveur
DatagramPacket request = new DatagramPacket(m, args[0].length(), aHost, serverPort);
aSocket.send(request);
byte[] buffer = new byte[1000];DatagramPacket reply = new DatagramPacket(buffer, buffer.length);aSocket.receive(reply);System.out.println("Reply: " + new String(reply.getData()));
}catch (SocketException e){System.out.println("Socket: " + e.getMessage()); }catch (IOException e){System.out.println("IO: " + e.getMessage());}}finally {if(aSocket != null) aSocket.close();}}}
Communication par datagrammesexemple simple : le client
Contraintes liées à l ’usage de datagrammes Taille des messages
le récepteur doit spécifier un vecteur d ’octets d ’une taille déterminée pour recevoir le message le message peut être tronqué à l ’arrivée sous IP taille des paquets maximale 2**16 octets dans la plupart des environnements, max 8Kb, en général
Synchronicité Émission non-bloquante
send rend le contrôle dès que le message est transmis aux protocoles UDP et IP à l ’arrivée, le message est placé dans une file sur le socket associé au port de destination
• si aucun processus ne possède de socket associé à ce port, le message est écarté Réception bloquante
jusqu ’à l ’arrivée d ’un message à moins qu ’un timeout n ’existe sur le socket utilisation de threads distincts pour contrôler ce problème
Timeouts Serveur
attente infinie peut être acceptable autres applications
moins acceptable ou praticable fixer un timeout sur le socket
• la valeur doit être suffisamment élevée par rapport au temps de transmission des messages Émetteurs multiples
La méthode receive ne permet pas de spécifier une origine pour le message à lir rend l ’adresse Internet et le port de l ’émetteur
• le destinataire peut savoir d ’où provient le message possible de connecter un socket pour datagramme à une adresse Internet et un port remote spécifique
• le socket ne peut recevoir et émettre que vers cette adresse
Modélisation des fautes
Communication fiable propriété d ’intégrité : un message ne doit pas être corrompu, ni dupliqué
utilisation de checksum pour la détection de messages corrompus : responsabilité de l ’application
Propriété de validité: tout message est éventuellement livré
des messages peuvent ne pas être livrés (faute par omission)• erreur de checksum ou tampon plein à la source ou la destination
Note: des messages peuvent aussi ne pas être livrés dans le bon ordre
On peut construire un système de communication fiable fondé sur les datagrammes : accusé de réception + checksums
Utilisation de UDP
Pour certaines applications, il est acceptable d ’utiliser un système où il peut survenir des fautes par omission
Exemple : DNS est implémenté à l ’aide de UDP
Avantage pas de overhead lié à la garantie de livraison, à savoir
le besoin d ’emmagasiner de l ’état de la communication à la source et à la destination
la transmission de messages supplémentaires le temps d ’attente (latency) chez l ’émetteur
java.net.DatagramPacket//sending data
public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//receiving data
public DatagramPacket(byte[] buf, int length)
//accessors
public InetAddress getAddress()
public int getPort()
public byte[] getData()
public int getLength()
API Java pour les datagrammes
API Java pour les datagrammes
java.net.DatagramSocketpublic DatagramSocket(int port)
public void send(DatagramPacket p) throws IOException
public void receive(DatagramPacket p) throws IOException
//If the timeout expires, a java.io.InterruptedIOException is raised,
public void setSoTimeout(int timeout) throws SocketException
//When a socket is connected, receive and send will not perform any security checks on incoming and outgoing packets, other than matching the packet's and the socket's address and port.
public void connect(InetAddress address, int port)
Implémentation de la communication de groupe via UDP
IP multicast disponible seulement via UDP au niveau application
multicast sur un réseau local sur une zone Internet plus grande (multicast routers)
• ttl (time to live) – nombre de routers qu ’un datagramme peut traverser– valeur = 1 --> réseau local
un group multicast est spécifié par une adresse IP de classe D groupes permanents : 224.0.0.1 à 224.0.0.255 groupe temporaire : besoin d ’une adresse libre
l ’appartenance à un groupe est dynamique
on peut envoyer un datagramme à un groupe multicast sans en être membre
import java.net.*;import java.io.*;public class MulticastPeer{ public static void main(String args[]){ // args give message contents and destination multicast group (e.g."228.5.6.7")
MulticastSocket s =null;try { InetAddress group = InetAddress.getByName(args[1]); s = new MulticastSocket(6789); s.joinGroup(group);
byte [] m = args[0].getBytes(); DatagramPacket messageOut ; messageOut = new DatagramPacket(m, m.length, group, 6789); s.send(messageOut);
byte[] buffer = new byte[1000]; for(int i=0; i< 3;i++) {
// get messages from others in group DatagramPacket messageIn ;
messageIn = new DatagramPacket(buffer, buffer.length); s.receive(messageIn); System.out.println("Received:" + new String(messageIn.getData())); }
s.leaveGroup(group);
}catch (SocketException e){ System.out.println("Socket: " + e.getMessage()); }catch (IOException e){ System.out.println("IO: " + e.getMessage()); }finally {if(s != null) s.close();} } }
Communication par datagrammesBroadcasting : MulticastClient
public static void main(String[] args) throws IOException {
MulticastSocket socket = new MulticastSocket(4446);
InetAddress address = InetAddress.getByName("230.0.0.1");
socket.joinGroup(address);
DatagramPacket packet;
for (int i = 0; i < 5; i++) { // get a few quotes
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData());
System.out.println("Quote of the Moment: " + received);
}
socket.leaveGroup(address);
socket.close();
}
Communication par datagrammesBroadcasting : MulticastServer
package chapitre4;
public class MulticastServer
{
public static void main(String[] args)
throws java.io.IOException
{
new MulticastServerThread().start();
}
}
Communication par datagrammesBroadcasting : MulticastServerThread
public class MulticastServerThread extends QuoteServerThread
public void run() {
while (moreQuotes) {
try {byte[] buf = new byte[256];
// construct quote
String dString = null;
if (in == null) dString = new Date().toString();
else dString = getNextQuote();
buf = dString.getBytes();
// send it
InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet = new DatagramPacket
(buf, buf.length, group, 4446);
socket.send(packet);
// sleep for a while
try { sleep((long)(Math.random() * FIVE_SECONDS));
} catch (InterruptedException e) { }
} catch (IOException e) { e.printStackTrace();
moreQuotes = false;}}
socket.close();}
Communication de groupe
Multicast envoi d ’un message par un processus à chaque membre d ’un groupe de
processus
infrastructure pour construire des systèmes répartis tels que tolérants aux fautes par réplication des services
multicast de la requête d ’un client à un groupe de serveurs
trouver des serveurs de découverte dans des systèmes avec réseautage spontané
améliorer la performance grâce à la réplication de données chaque fois que les données changent,
multicast aux processus qui gèrent les copies
propager des notifications d ’événements, Jini lorsque de nouveaux services de lookup annoncent leur existence
Modélisation des fautes
Identique à celle des diagrammes UDP faute par omission
si un routeur multicast tombe les clients dépendants de ce routeur ne
reçoivent plus les messages, même si les clients locaux peuvent les recevoir
ordre d ’arrivée n ’est pas garanti
Effets de la fiabilité et de l ’ordonnancement des messages
Tolérance aux fautes fondée sur la duplication de services
pour demeurer consistants entre eux, les serveurs ont le même état initial
et doivent réaliser les mêmes opérations dans le même ordre
les serveurs doivent tous recevoir (ou non) un message et ce dans le même ordre
Effets de la fiabilité et de l ’ordonnancement des messages
Découverte de serveurs ou services dans un cadre de réseautage spontané
Jini : les processus qui recherchent les services de découverte multicastent les requêtes à intervalle périodique pour un certain temps après leur mise en route
pas de conséquence si un message est perdu
Effets de la fiabilité et de l ’ordonnancement des messages
Amélioration de la performance grâce à la réplication des données
effet de la perte de message ou de leur ordonnancement inconsistant
dépend de la méthode de duplication et de l ’importance que les duplicatas soient totalement à jour
exemple pas de conséquence dans le cas de la duplication des
newsgroups
Effets de la fiabilité et de l ’ordonnancement des messages
Propagation de la notification d ’événements
Jini : le service de publication utilise le IP multicasting pour informer les parties intéressées à intervalles fréquents de l ’arrivée de nouveaux services disponibles
Variation sur le multicast
Multicast fiable tout message transmis est reçu par tous ou
par personne
Multicast totalement ordonné tous les messages transmis à un groupe
rejoignent les membres dans le même ordre
voir Chapitre 11 de Coulouris et al.
API Java pour IP multicast
public class MulticastSocket extends DatagramSocket