Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parGisèle Fevrier Modifié depuis plus de 11 années
1
Mode Message Asynchrone (interface Socket)
Chapitre 2 Mode Message Asynchrone (interface Socket)
2
Mode Message Asynchrone
Basé directement sur le mode de communication par message. Un service comprenant essentiellement deux primitives pour communiquer et se synchroniser. TYPE COM_MESSAGE_ASYNCHRONE; METHOD envoyer (id_émetteur, id_récepteur, message, compléments); METHOD recevoir (id_émetteur, id_récepteur, message); METHOD ...; END COM_MESSAGE_ASYNCHRONE. identificateurs : ports de communication messages : zones de données (typées). compléments : selon les sémantiques multiples définissant les qualités de services
3
Mode Message Asynchrone Aspect principal pour la communication et la synchronisation
l'asynchronisme entre l'émetteur et le récepteur - Le mode message asynchrone réalise un "producteur-consommateur" réparti entre un émetteur et un récepteur. - Complet parallélisme autorisé entre l'émetteur et le récepteur. Rien n'empêche aussi l'une des entités ('émetteur) de suspendre son exécution. Sémantique de l'activation De type activation en parallèle ("fork") Interprétable également comme un branchement inconditionnel ("goto").
4
Mode Message Asynchrone Aspect d'échange de données
Le mode message permet une opération d'affectation de variable à distance: envoyer (M=écrire(v) , id_dest) recevoir (M'=lire(v) , id-emet) . Avec possibilité de gestion de cohérence des types des variables v. . Avec une sémantique de consistance des données entre l'émetteur et le récepteur très faible. Propriété minimale de cohérence des communications point à point: la causalité envoyer (M=écrire) -> recevoir (M'=lire) Si a t1 : émetteur.écrire (v,t1) => il existe t2>t1 : recepteur.lire (v, t2)
5
Mode Message Asynchrone Interaction entre processus par échange de message
Comportement séquentiel des processus: => Ensemble de processus (entités réseaux) séquentiels communicants (très souvent en mode point à point deux entités seulement). => Les méthodes de spécification de chaque processus utilisent des automates d'état fini Interaction entre processus par échange de message => Les processus communicants se synchronisent par messages asynchrones.
6
Mode Message Asynchrone Représentation graphique des applications: automates
États : Il est défini par un ensemble significatif de variables locales de chaque processus. Transitions : Elles comportent deux mentions: les conditions, et les actions. Condition : condition booléenne portant sur les variables locales. condition booléenne portant sur les échanges (requête de service, message entrant). condition booléenne portant sur les signaux internes (horloge). Action : C'est l'opération réalisée lors du franchissement de la transition.
7
condition recevoir(M) ?M action envoyer(M) !M Exemple : P1 :P2!M1
Mode Message Asynchrone Représentation des opérations sur les diagrammes (conditions et actions) condition recevoir(M) ?M action envoyer(M) !M Exemple : P1 :P2!M1 P2 :P1?M1 Avec Type[message_émis] = Type [message_reçu]
8
Mode Message Asynchrone Exemples
9
Mode Message Asynchrone Automate du service
Établissement de la liste des unités de service (primitives, SDU) de service échangeables entre le niveau n et le niveau n+1 Définition des enchaînements autorisés de primitives sous la forme d'un automate d'état. => Toutes les successions légales qu'un observateur de l'interface n n+1 peut observer.
10
Mode Message Asynchrone Exemple de comportements autorisés du service de connexion de session OSI.
11
Mode Message Asynchrone Automate du protocole
Établissement de la liste des unités de protocole (messages, PDU) échangés entre deux niveaux n. Définition de tous les enchaînements de PDU qu'un observateur de la voie de communication peut observer).
12
Mode Message Asynchrone Une partie du protocole d'ouverture de connexion de session
13
Mode Message Asynchrone Automate complet
14
Mode Message Asynchrone Problèmes de constructions
Réceptions non spécifiées Dans un état un message peut se présenter dont le cas n'a pas été prévu Interblocages Dans un état un message (ou une configuration) est attendu qui ne peut jamais se présenter. Définition d'assertions de bon fonctionnement sur le modèle à automates communicants. assertions portant sur des variables d'état (booléennes) assertions portant sur des trajectoires (logique temporelle)
15
Mode Message Asynchrone Les interfaces de "transport"
Existence d'interfaces logicielles pour l'accès à des piles de protocoles : API utilisable de préférence pour plusieurs piles Sockets, TLI, etBEUI…. Sockets: Interface de programmation pour la suite TCP/IP Système UNIX Berkeley. Le standard UNIX de facto. L'API sockets sous Windows est baptisée WinSock
16
Mode Message Asynchrone Conclusion
C'est le mode le plus basique Comparable à l'assembleur (affectation, branchement). Le moins contraignant il permet aux utilisateurs par des échanges successifs, la construction de tout type de protocole. L'utilisateur n'a pas en général envie d'être obligé de construire ses propres outils d'où: L'enrichissement du mode message en termes de qualité de service par les couches successives des protocoles réseau. Le besoin d'autres schémas prédéfinis plus complexes. Le mode message asynchrone est encore le mode privilégié des interfaces On peut prévoir à terme son "enfouissement" dans les couches internes.
17
L'interface SOCKET Introduction
Une "socket" est un point d'accès de service pour des couches transport essentiellement TCP/UDP La caractéristique principale d'une socket est donc son type. Une socket possède un nom: un identifiant unique sur chaque site (en fait un entier sur 16 bits) appelé "numéro de port". Un socket = (Numéro de port, Adresse IP). Une socket est caractérisée par un ensemble de primitives de service pour l'accès aux fonctions de transport. Une socket encapsule des données: un descriptif (pour sa désignation et sa gestion) des files d'attente de messages en entrée et en sortie.
18
representation de socket
19
L'interface SOCKET Choix de conception des sockets
TCP TCP est un transport fiable en connexion et en mode bidirectionnel point à point. Une socket TCP peut être utilisée par plusieurs connexions TCP simultanément. Une connexion est identifiée par le couple d'adresses socket des deux extrémités. UDP Un échange UDP est sans connexion (échange de datagrammes). Les zones de données qui correspondent à des envois successifs sont respectées à la réception.
20
L'interface SOCKET Les primitives de l'interface socket: socket()
Permet la création d'un nouveau point d'accès de service transport. int socket ( int famille, int type, int protocole); Trois paramètres d'appel "Famille" d'adresses réseaux utilisées locale, réseau IP, réseau OSI ... AF_UNIX : Communication locale (i-node) AF_INET : Communication Internet AF_ISO : Communication ISO Type de la socket (du service) sémantique de la communication. SOCK_STREAM : Flot d'octets en mode connecté (ne préserve pas les limites de l'enregistrement) SOCK_DGRAM : Datagramme en mode non connecté (préserve les limites de l'enregistrement) Protocole de transport utilisé. IPPROTO_TCP SOCK_STREAM IPPROTO_UDP SOCK_DGRAM Un paramètre résultat: le numéro de descripteur socket.
21
L'interface SOCKET Les primitives de l'interface socket: bind()
Primitive pour l'attribution d'une adresse de socket à un descripteur de socket. int bind (int s, struct sockaddr_in *mon_adresse, int longueur_mon_adresse) Trois paramètres d'appel Numéro du descriptif de Socket (s). Structure de donnée adresse de socket. Pour internet struct in_addr { u_long s_addr ; } ; s_addr : 32 bits constituants l’identificateur du réseau et de la machine hôte ordonnes selon l’ordre réseau. struct sockaddr_in { short sin_family ; u_short sin_port ; struct in_addr sin_addr ; char sin_zero[8] ; } ; sin_family : AF_INET ; sin_port : 16 bits de numero de port ( ordonnancement réseau); sin_addr : 32 bits constituants l’identificateur du reseau et de la machine hôte ordonnes selon l’ordre réseau. sin_zero[8] : inutilisés ; Longueur de la structure d'adresse.
22
L'interface SOCKET Les primitives de l'interface socket: listen()
Utilisé dans le mode connecté lorsque plusieurs clients sont susceptibles d'établir plusieurs connexions avec un serveur. int listen(int s , int max_connexion) s : Référence du descripteur de socket max_connexion : Nombre maximum de connexions.
23
L'interface SOCKET Les primitives de l'interface socket: accept()
Dans le mode connecté la primitive accept permet de se bloquer en attente d'une nouvelle demande de connexion. Après l'accept, la connexion est complète entre les deux processus. int accept (int s, struct sockaddr_in *addr_cl, int lg_addr_cl) retourne ns. s : Référence du socket qui est en ecoute. addr_cl : L'adresse du client. lg_addr_cl: La longueur de l'adresse. L’appel retourne un descripteur d’une nouvelle socket ns. Pour chaque nouvelle connexion entrante la primitive fournit un pointeur sur une nouvelle socket qui est du même modèle que la socket précédemment créée.
24
L'interface SOCKET Les primitives de l'interface socket: connect()
La primitive connect (bloquante) permet à un client de demander l'ouverture (active) de connexion à un serveur. L'adresse du serveur doit être fournie. int connect (int s, struct sockaddr_in *addr_serv, int lg_addr_serv) s : La référence de la socket addr_serv : L'adresse du serveur. lg_addr_serv : La longueur de l'adresse.
25
L'interface SOCKET Les primitives de l'interface socket: send(), recv()
Les primitives send, recv (bloquantes) permettent l'échange effectif des données. int send (int s, char *zone, int lg_zone,int options_com) int recv (int s,char *zone, int lg_zone,int options_com) s : La référence de la socket zone : La zone à échanger. lg_zone : La longueur de la zone. options_com : Les options (données urgentes , ....)
26
L'interface SOCKET Les primitives de l'interface socket: sendto(), recvfrom()
Les primitives sendto, recvfrom permettent l'échange des données plutôt dans le mode non connecté UDP. int sendto ( int s, char *zone, int lg_zone, int options_com, struct sockaddr_in *addr_dest, int lg_addr) int recvfrom ( int s, char *zone, int lg_zone, int options_com, struct sockaddr_in *addr_emet, int lg_addr) addr_dest : L'adresse du destinataire. addr_emet : L'adresse de l'émetteur. lg_addr : La longueur de l'adresse.
27
L'interface SOCKET Les primitives de l'interface socket: shutdown(), close()
Shutdown; Permet la purge des données en instance sur une socket avant la fermeture. shutdown(s , h); h = 0 l’usager ne veut plus recevoir de données h = 1 l’usager ne veut plus envoyer de données h = 2 l’usager ne veut plus ni recevoir, ni envoyer. Close; Permet la fermeture d'une connexion et la destruction du descriptif. int close ( int s )
28
L'interface SOCKET résumé
Fonctionnement en TCP Serveur. socket bind listen accept recv, send close Client. connect Fonctionnement en UDP Socket Bind recvfrom, sendto close
29
L'interface SOCKET exemple, TCP
Parallèle Serveur en mode connecte Série
30
L'interface SOCKET exemple, UDP
Parallèle Serveur en mode doconnecte série
31
L’interface Socket exemple de serveur itératif
int sockfd, newsockfd ; if ( ( sockfd = socket (.....)) < 0 ) err_sys(«erreur de socket«) ; if ( bind ( sockfd, ....) < 0 ) err_sys («erreur de bind»); if ( listen ( sockfd , 5) < 0 ) ; err_sys (« erreur de listen» ) ; for ( ; ; ) { newsockfd = accept ( sockfd, .....) ; if ( newsockfd < 0) err_sys( «erreur de accept») ; execute_la_demande( newsockfd ) ; close ( newsockfd ) ; }
32
L’interface Socket exemple de serveur parallèle
int sockfd, newsockfd ; if ( ( sockfd = socket (.....)) < 0 ) err_sys(«erreur de socket«) ; if ( bind ( sockfd, ....) < 0 ) err_sys («erreur de bind»); if ( listen ( sockfd , 5) < 0 ) ; err_sys (« erreur de listen» ) ; for ( ; ; ) { newsockfd = accept ( sockfd, .....) ; if ( newsockfd < 0) err_sys( «erreur de accept») ; if ( fork() == 0 ) { close ( sockfd ) ; execute_la_demande( newsockfd ) ; exit (1) ; } close ( newsockfd ) ;
33
L’interface Socket gestion de noms
Les primitives gethostname et sethostname Dans le monde UNIX, la primitive gethostname permet aux processus utilisateurs d’accéder au nom de la machine locale. D’autre part, la primitive sethostname permet à des processus privilégiés de définir le nom de la machine locale. La primitive getpeername Cette primitive est utilisée afin de connaître le point de terminaison du distant. Habituellement, un client connaît le point de terminaison (couple port/adresse IP) puisqu’il se connecte à ce serveur distant; cependant, un serveur qui utilise la primitive accept pour obtenir une connexion, a la possibilité d’interroger le socket afin de déterminer l’adresse du distant. La primitive getsockname Cette primitive rend le nom associé au socket qui est spécifié en paramètre.
34
L’interface Socket gestion de noms
Lorsque ces fonctions sont exécutées sur des machines ayant accès à un serveur de noms de domaines, elles fonctionnent elles-mêmes en mode client/serveur en émettant une requête vers le serveur de nom de domaines et attendent la réponse. Lorsqu’elles sont utilisées sur des machines qui n’ont pas accès à un serveur de noms, elles obtiennent les informations à partir d’une base de données ( simple fichier) locale. gethostbyname spécifie un nom de domaine et retourne un pointeur vers une structure hostent qui contient les informations propres à ce nom de domaine. gethostbyaddr permet d’obtenir les mêmes informations à partir de l’adresse spécifiée. getnetbyname spécifie un nom de réseau et retourne une structure netent renseignant les caractéristiques du réseau. getnetbyaddr spécifie une adresse réseau et renseigne la structure netent
35
L’interface Socket fonctions de service
Les fonctions getprotobyname et getprotobynumber Dans la base de données des protocoles disponibles sur la machine, chaque protocole a un nom officiel, des alias officiels et un numéro de protocole officiel. La fonction getprotobyname permet d’obtenir des informations sur un protocole donné en spécifiant son nom; renseigne la structure protoent. La fonction getprotobynumber permet d’obtenir les mêmes informations en spécifiant le numéro de protocole. La fonction getservbyname Certains numéros de ports sont réservés pour les services s’exécutant au-dessus des protocoles TCP et UDP. getservbyname retourne les informations relatives à un service donné en spécifiant le numéro du port et le protocole utilisé; renseigne la structure servent.
36
L’interface Socket Byte ordering
TCP/IP spécifie une représentation normalisée pour les entiers utilisés dans les protocoles. Cette représentation, appelée network byte order, représente les entiers avec le MSB en premier. Une application doit renseigner certaines informations du protocole et par conséquent, doit respecter le network informations byte order; Exemple le numéro de port. Pour que les applications fonctionnent correctement, elles doivent translater la représentation des données de la machine locale vers le network byte order : htonl : host to network long : convertit une valeur sur 32 bits de la représentation machine vers la représentation réseau. htons : host to network short : convertit une valeur sur 16 bits de la représentation machine vers la représentation réseau. ntohl : network to host long : convertit une valeur sur 32 bits de la représentation réseau vers la représentation machine. ntohs : network to host short : convertit une valeur sur 16 bits de la représentation réseau vers la représentation machine.
37
Sockets en JAVA Les classes java.net.Socket et java.net.ServerSocket sont les deux classes de base pour l'implantation des sockets TCP/IP sous JAVA. 7 opérations élémentaires sont assurées par un Socket : connexion à une machine distante (Socket), envoi de données (Socket), réception de données (Socket), fermeture d'une connexion (Socket), attachement à un port (ServerSocket), attente de demande de connexion émanant de machines distantes (ServerSocket), acceptation de demandes de connexion sur le port local (ServerSocket). La Socket est créée sur le client. Le ServerSocket fonctionne sur le serveur en attente de connexion (méthode accept()) ; La nouvelle Socket tente de se connecter sur le serveur distant. Après détection d'ouverture de connexion, le ServerSocket génère une Socket pour communiquer avec le client. Une fois la connexion établie, les systèmes locaux et distant établissent un canal de communication par flux à partir de leurs Sockets de manière à échanger des données. Lorsque les échanges sont terminés, l'un des interlocuteurs clôt la communication.
38
Le client public Socket(String host, int port) throws UnknownHostException,IOException public Socket(InetAddress address, int port) throws IOException public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Toutes ces fonctions génèrent une IOException en cas de problème à l'exécution. host (String) : nom de la machine vers laquelle la socket est créée. addresse (InetAddress) : adresse IP de la machine vers laquelle la socket est créée. port (int) : numéro du port sur lequel la socket est créée. localAddr (InetAddress) : adresse IP locale auquelle la socket est associée. localPort (int) : numéro du port local auquel la socket est associée.
39
Quelques fonctions utiles
Les fonctions qui sont asociee au socket public void close() throws IOException : ferme la socket public inputStream getInputStream() throws IOException : retourne le flux d'entrée associé à la socket public outputStream getOutputStream() throws IOException : retourne le flux de sortie associé à la socket
40
Le serveur ServerSocket permet l'instanciation de variables implantant des écouteurs de ports TCP/IP pour la détection de requêtes d'ouverture de Socket (sur les serveurs). Cette classe ouvre une socket sur le client correspondant. Constructeur : public ServerSocket(int port) throws IOException Toutes ces fonctions génèrent une IOException en cas de problème à l'exécution. port (int) : numéro du port sur lequel le ServerSocket est créé et mis en attente. Quelques fonctions utiles: public void close() throws IOException : ferme le ServerSocket public Socket accept() throws IOException : place le ServerSocket en attente de requête d'ouverture de sockette. Cette attente est bloquante. Une sockette est automatiquement générée et retournée lors de cette requête.
41
Le IO Stream : Objet JAVA possédant la caractéristique de pouvoir envoyer ou recevoir des données Java.io est le package dédié à la gestion des entrées/sorties. Il intègre des classes de gestion de fichier au sens classique du terme. Outre ces classes, le package java.io possède un nombre important de classes dédiées à la gestion des flux de données. Les classes de base de java.io sont : InputStream pour gérer des données en entrée (lecture), OutputStream pour gérer des données en sortie (écriture). Ces deux classes abstraites ne sont pas utilisées directement mais plutôt comme intermédiaires vers des sous-classes correspondant mieux à la finalité désirée. Ces autres classes de gestion de flux de java.io ont pour but de réaliser le formatage automatique des données (type de valeur, manière avec laquelle les données sont transmises, ...) vers le type le plus adapté à l'application souhaitée.
42
exemple Socket s ; String hote = "raphaello.univ-fcomte.fr" ; int port = 5555 ; try { s = new Socket(hote,port) ; OutputStream os = s.getOutputStream() ; DataOutputStream dos = new DataOutputStream(os) ; ... dos.close() ;} catch ( UnknownHostException e) { } ; catch ( IOException e) { } ;
43
Le Stream Exemples de sous-classes de InputStream et OutputStream
BufferedReader : Lecture de texte depuis un flux d'entrée caractère -> caractères, tableaux et chaînes de caractères. BufferedWriter : Ecriture de texte dans un flux de sortie caractère -> caractères, tableaux et chaînes de caractères. DataInputStream : Lecture de données Java primitives. DataOutputStream : Ecriture de données Java primitives. FileInputStream : Lecture d'octets depuis un fichier. FileOutputStream : Ecriture d'octets dans un fichier. ObjectInputStream : Lecture d'objets Java par desérialisation. ObjectOutputStream : Ecriture d'objets Java par sérialisation.
44
Les Threads Thread : Objet JAVA possédant la caractéristique de pouvoir s'exécuter en parallèle au programme qui lui a donné naissance (processus léger) Caractéristiques : Gestion par le système de l'attribution des temps de calcul aux Threads en cours d'exécution Partage de la même zone mémoire que le programme de naissance -> mémoire partagée Ecriture d'une classe thread : Extension de la classe java.lang.Thread Surcharge de la méthode public void run() avec une fonction implantant l'équivalent de la fonction main pour un programme classique Emploi d'une instance de classe thread : Instanciation d'une variable de la classe étendant Thread Exécution de la méthode start héritée de Thread Emploi de threads -> problème de synchronisation lors de l'accès de deux ou plusieurs threads à la même zone de mémoire partagée
45
Exemple public class MyThread extends Thread { private boolean ok = true ; public void run() { while ( ok ) { ... } } public void arret() { ok = false ; } } MyThread th = new Thread() ; th.start() ; th.arret() ; ...
46
Les problèmes de synchronisation
Emploi de threads -> problème de synchronisation lors de l'accès de deux ou plusieurs threads à la même zone de mémoire partagée Utilisation de la directive synchronized pour créer des blocs d'instructions ne pouvant être interrompus Synchronisation sur deux types d'éléments de code : Exemple : public synchronized void set(int xx,int yy){ cx = xx ; cy = yy ; } Lorsqu'un code exécuté dans un Thread essaie de lancer une fonction synchronisée d'un objet, il est bloqué tant que cet objet n'est pas relaché (si celui-ci est utilisé par ailleurs).
47
Exemple de sockets java
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.