1. Les Remote Procedure Calls
Principe de base : transparence réseau pour les appels de
Systèmes répartis : les Remote Procedure fonctions. Composants :
un langage de description des données et des fonctions
Calls une méthode de représentation portable des données
Fabrice Rossi un protocole d’appel :
transmission des paramètres de l’appel du client vers le
http://apiacoa.org/contact.html. serveur
transmission du résultat du serveur vers le client
Universit´ Paris-IX Dauphine
e un protocole de publication et de recherche d’un service
Deux grandes normes :
RPC ONC (Sun)
RPC DCE (Open Group)
Mais aussi :
XML RPC
SOAP
Syst`mes r´partis : les Remote Procedure Calls – p.1/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.2/25
e e
Schéma de principe Rôle des Stubs (Souches)
Client Serveur Les souches :
stub
souvent appelé squelette (skeleton) du côté serveur
Code du client Code du serveur sur le client :
paramètres → format portable (marshalling)
format portable → résultat (unmarshalling)
Stub du client Stub du serveur appel de la bonne fonction
sur le serveur :
Réseau traductions inverses de celles du client
Bibliothèque RPC client Paramètres Bibliothèque RPC serveur appel de la bonne fonction
en général engendrées automatiquement
Résultat
Syst`mes r´partis : les Remote Procedure Calls – p.3/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.4/25
e e
2. Rôle des bibliothèques Code à écrire
fonctions de bas niveau pour le (un)marshalling Il reste quand même des choses à écrire ( !) :
établissement des connexions réseau dépend de la solution retenue
mise en œuvre du protocole : RPC ONC :
identification du programme le code de la fonction pour le serveur (le code de
authentification (éventuelle) démarrage est engendré par les outils)
gestion de certaines erreurs (de protocole, de version, le code du client :
etc.) connexion au serveur
transmission effective des données (en particulier la appel de la fonction
gestion de la mémoire) les outils RPC ONC proposent en général une version à
publication et découverte d’un service compléter de tout ce que le programmeur doit fournir
fournies par le “vendeur” de la solution RPC autres solutions : en gros la même chose
Syst`mes r´partis : les Remote Procedure Calls – p.5/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.6/25
e e
Etude d’un exemple : RPC ONC Le protocole RPC (rfc 1831)
Les RPC ONC (Sun) : Principes de base :
rfc 1831 un service réseau est fournis par plusieurs programmes
solution classique disponible sur tous les Unix (incluse un programme fournis plusieurs fonctions (ou procédures)
dans le système en général) et sous windows un client appelle une procédure d’un programme
comparable aux DCE RPC en “gratuit” une procédure est identifiée par trois entiers (positifs) :
langage de description des données : XDR (rfc 1832) le numéro de programme
technologie utilisée par Network File System le numéro de version du programme
outil de base rpcgen : le numéro de procédure au sein du programme
engendre des convertisseurs ((un)marshalling) affectation des numéros de programme :
engendre les souches (serveurs et clients) de 0x0 à 0x1fffffff : affectation par SUN
propose des modèles pour le client et le serveur de 0x20000000 à 0x3fffffff : affectation par le
engendre un Makefile programmeur
utilise un lookup service pour la publication et la de 0x40000000 à 0xffffffff : réservé
découverte d’un service (rfc 1833) le protocole est basé sur l’échange de messages décrits
les RPC ONC peuvent être implantées sur n’importe en XDR
quelle couche transport (en général TCP et UDP)
Syst`mes r´partis : les Remote Procedure Calls – p.7/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.8/25
e e
3. eXternal Data Representation (rfc 1832) Exemple
person.x
Représentation portable des données : 1 enum type_gender {
codage big endian avec des mots de 4 octets (complétion 2 FEMALE=0,
par des zéros) 3 MALE=1
permet de définir des types de données associés à une 4 };
représentation binaire standard 5
orienté C : 6 struct person {
syntaxe proche du C 7 string firstname<>;
types fondamentaux classiques (int, double, etc.) 8 string lastname<>;
énumération 9 type_gender gender;
struct et union 10 };
tableaux
rpcgen engendre des fonctions de traduction à partir d’un
fichier XDR (et des bibliothèques de conversion de bas On définit :
niveau) type_gender : un énuméré pour le genre
person : une struct contenant deux chaînes de
caractères et un genre
Syst`mes r´partis : les Remote Procedure Calls – p.9/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.10/25
e e
Les types Les types (2)
Type identificateur taille Type identificateur taille
Entier relatif int 4 octets Réels float 4 octets
Entier positif unsigned int 4 octets simples (IEEE)
Enumération enum int Réels double 8 octets
{identifier=constant,...} doubles (IEEE)
Booléen bool enum Réels longs quadruple 16 octets
{FALSE=0, (IEEE)
TRUE=1} Rien void 0 octet
Entier long hyper 8 octets
relatif
Entier long unsigned hyper 8 octets
positif
Syst`mes r´partis : les Remote Procedure Calls – p.11/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.12/25
e e
4. Les types (3) Les types (4)
Données à taille fixe ou variable : Comme en C :
[n] correspond à une taille fixe égale à n struct permet d’agréger des types pour fabriquer un type
<> correspond à une taille variable plus complexe (cf exemple d’introduction)
<m> correspond à une taille variable inférieure à m union permet de decrire des types variables. Exemple :
exemple, int<15> : liste d’entiers de longueur au plus person.x
15. 1 enum type_gender {
Cas particuliers : 2 FEMALE=0,
Identificateur contenu 3 MALE=1
4 };
opaque liste d’octets
5 union type_maidenname switch (type_gender gender) {
string chaîne de caractères 6 case FEMALE:
Attention, pas de taille fixe pour les chaînes de 7 string maidenname<>;
caractères. 8 case MALE:
Comme en C : 9 void;
on peut définir des types par typedef 10 };
on peut définir des constantes
Syst`mes r´partis : les Remote Procedure Calls – p.13/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.14/25
e e
Définition d’un programme Programmation
Pour décrire un programme RPC, on utilise une extension de On soumet calculation.x au programme rpcgen. On obtient
XDR : calculation.x
(sous Linux) :
1 struct two_int { calculation.h : fichier d’en-tête à inclure dans les
2 int a; différents programmes
3 int b; calculation_xdr.c : les fonctions de conversion en XDR
4 };
5 program CALCULATION_PROG {
des types définis dans calculation.x
6 version CALCULATION_VERS_BASE { calculation_clnt.c : le stub côté client
7 int sum(two_int)=1; calculation_svc.c : le stub côté serveur (par défaut,
8 }=1;
support de udp et de tcp)
9 }=0x20000000;
de façon optionnelle :
Principe : un Makefile
program identificateur {version...}=constante ; des exemples à compléter pour le client et le serveur
version identificateur {procedure...}=constante ; nombreuses options (mode de démarrage du serveur,
procedure type identificateur couche de transport, etc.)
(type,...)=constante ;
Syst`mes r´partis : les Remote Procedure Calls – p.15/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.16/25
e e
5. calculation_server.c Synopsis de la partie cliente
calculation_server.c
1 #include "calculation.h" Dans un client :
2 1. on établit la connexion (clnt_create, ligne 14). On doit
3 int * préciser :
4 sum_1_svc(two_int *argp, struct svc_req *rqstp) la machine cible (host)
5 { le numéro du programme et son numéro de version
6 static int result; (macros engendrées par rpcgen)
7 le transport utilisé
8 /* partie ajout´e ! */
e
2. on effectue l’appel qui est local, cf ligne 20 (seule
9 result=argp->a+argp->b;
astuce : le dernier paramètre contient les informations de
10 /* fin de l’ajout */
connexion)
11 return &result;
12 } 3. on coupe la connexion (clnt_destroy, ligne 30)
Avec un transport connecté (type tcp), on peut conserver la
totalement basique
toute la complexité est dans calculation_svc.c connexion ouverte pendant un certain temps.
Syst`mes r´partis : les Remote Procedure Calls – p.17/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.18/25
e e
calculation_client.c calculation_client.c (2)
calculation_client.c calculation_client.c
1 #include "calculation.h" 20 result_1 = sum_1(&sum_1_arg, clnt);
2 21 if (result_1 == (int *) NULL) {
3 void calculation_prog_1(char *host) 22 clnt_perror (clnt, "call failed");
4 { 23 }
5 CLIENT *clnt; 24 /* partie ajout´e */
e
6 int *result_1; 25 else {
7 two_int sum_1_arg; 26 printf("%d+%d=%dn",sum_1_arg.a,sum_1_arg.b,*result_1);
8 27 }
9 /* partie ajout´e */
e 28 /* fin de l’ajout */
10 sum_1_arg.a=15; 29 #ifndef DEBUG
11 sum_1_arg.b=35; 30 clnt_destroy (clnt);
12 /* fin de l’ajout */ 31 #endif /* DEBUG */
13 #ifndef DEBUG 32 }
14 clnt = clnt_create(host,CALCULATION_PROG,CALCULATION_VERS_BASE,"udp");
15 if (clnt == NULL) {
16 clnt_pcreateerror (host); solution très basique (création de clnt à chaque appel
17 exit (1); par exemple)
18 }
utilise la partie bilbiothèque des RPC (e.g., clnt_create)
19 #endif /* DEBUG */
l’appel proprement dit est local (ligne 20)
Syst`mes r´partis : les Remote Procedure Calls – p.19/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.20/25
e e
6. calculation_client.c (3) Publication et découverte
calculation_client.c
33 int main (int argc, char *argv[]) Un problème standard des systèmes distribués :
34 { pour le serveur, se faire connaître (publication)
35 char *host; pour le client, trouver le serveur (découverte et résolution)
36
37 if (argc < 2) {
Plusieurs niveaux :
38 printf ("usage: %s server_hostn", argv[0]); 1. partie facile : nom de la machine du serveur + DNS →
39 exit (1);
40 }
connexion possible (TCP ou UDP par exemple)
41 host = argv[1]; 2. quelle couche transport ?
42 calculation_prog_1 (host);
43 exit (0); 3. pour TCP/UDP, quel numéro de port ?
44 }
Solution proposée par les RPC ONC, un programme de
binding (RFC 1823) :
le portmapper (version 2) : spécifique à TCP/UDP
rpcbind (versions 3 et 4) : indépendant du transport
Syst`mes r´partis : les Remote Procedure Calls – p.21/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.22/25
e e
Binding RPC rpcbind
Principes communs aux différentes versions : Remplace le portmapper. Principaux avantages :
le binder est un programme RPC de numéro 100000 indépendant du transport
il écoute toujours sur les ports 111 UDP et TCP permet un enregistrement et une résolution incluant les
Le portmapper offre différentes fonctions : informations de transport
publication d’un programme (décrit par son numéro de offre quelques nouvelles fonctions :
programme et son numéro de version) horloge
suppression d’un programme statistiques d’utilisation
découverte (résolution) d’un programme, c’est-à-dire un programme peut enregistrer plusieurs instances
obtention du port associé à un programme correspondant à différents transport (avec le
obtention de la liste des programmes enregistrés portmapper, le transport est automatique celui utilisé
appel direct d’une fonction distante pour contacter le portmapper lui-même)
Le portmapper est limité à TCP et UDP.
Syst`mes r´partis : les Remote Procedure Calls – p.23/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.24/25
e e
7. Fonctionnement du système Fonctionnement du système
111 portmapper 111 portmapper
Client Client
Serveur 1773 Serveur
Publication du programme (RPC) Le programme écoute sur le port 1773
Syst`mes r´partis : les Remote Procedure Calls – p.25/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.25/25
e e
Fonctionnement du système Fonctionnement du système
111 portmapper 111 portmapper
Client Client
1773 Serveur 1773 Serveur
Demande de résolution (RPC) Appel de la fonction recherchée
Syst`mes r´partis : les Remote Procedure Calls – p.25/25
e e Syst`mes r´partis : les Remote Procedure Calls – p.25/25
e e