RPC Remote Procedure Call
Llamada a Procedimiento Remoto
Daniel Cruz Chávez
RPC Introducción
Permite ejecutar código en una maquina remota sin importar el medio de comunicación
Especificado en el RFC 1831 Versión 2 Se basa en el modelo Cliente-Servidor
Llamada y retorno convencional
RPC Características
Depende de la red y del estado del servidor, en consecuencia el manejo de errores debe considerar esta característica
Una RPC opera en forma mas lenta que una llamada a un procedimiento local
Requiere de autenticación Puede ser implementado sobre UDP o TCP El espacio de memoria del cliente y servidor son
independientes
RPC Características
La transferencia de datos en una RPC puede darse entre maquinas de diferentes arquitecturas y sistemas operativos
XDR proporciona el estándar de codificación de datos (por ejemplo la longitud mínima de cualquier campo ha de ser de 32 bits)
Modelo RPC
RPC Procedimiento
Cuando un cliente realiza una RPC, en primer lugar llama a una función denominada “stub” generada por la RPC
Esta función empaqueta las entradas en un mensaje de red que enviá al servidor
El mensaje llega al servidor “stub”, que llama al procedimiento pasándole los parámetros
Cuando se ha ejecutado el procedimiento, el servidor “stub” empaqueta los resultados en un mensaje de red que enviá al cliente
El cliente “stub” extrae los resultados y se los devuelve a la aplicación
Ejemplo de una llamada a procedimiento local
Llamada a una función que imprime un mensaje en la consola
#include <stdio.h>
int main(argc, argv) int argc; char *argv[]; { char *message; message = argv[1];
/* llamada a procedimiento */ printmessage(message)
return 0; }
/* Procedimiento que imprime un mensaje*/printmessage(msg) char *msg; { printf("%s\n", msg); return(1); }
Ejemplo de llamada a procedimiento remoto
#include <stdio.h>#include "msg.h" /* archivo de definición RPC */
main(argc, argv) int argc; char *argv[];{ CLIENT *clnt; int *result; char *server; char *message;
if (argc != 3) { fprintf(stderr, "uso: %s host mensaje\n",
argv[0]); return 1; }
server = argv[1];message = argv[2];
/* crea un manejador del procedimiento remoto */
clnt = clnt_create(server, /*servidor*/ MESSAGEPROG, /*N° Prog*/PRINTMESSAGEVERS, /*N° Ver*/ ”udp” /*Transp*/ );
if (clnt == (CLIENT *)NULL) { /* Si no hay comunicacion
con el servidor, se imprime mensaje de error */
clnt_pcreateerror(server); return 1; }
Ejemplo de una Llamada a procedimiento remoto
/* Llamada a procedimiento remoto */ result = printmessage_1(&message, clnt);
if (result == (int *)NULL) { /* Si hay un error mientras se llama al procedimiento remoto */ clnt_perror(clnt, server); return 1; }
if (*result == 0) { /* Si el servidor tuvo problema para imprimir nuestro mensaje */ fprintf(stderr,"%s: no se pudo imprimir su mensaje \n",argv[0]); return 1;
}
/* El mensaje fue impreso en la consola del servidor */ printf("Mensaje enviado a %s\n", server); clnt_destroy( clnt ); return 0;}
Procedimiento remoto
#include <stdio.h>#include "msg.h"
int *printmessage_1(msg, req) char **msg; struct svc_req req; /* detalles de la llamada */ { static int result; result = 0; printf("%s\n", *msg); result = 1; return (&result);}
Formato RPC
Se identifica univocamente al procedimiento a ejecutar (programa, versión, procedimiento)*
Credenciales y verificador son empleados para la autentificación del que llama
RPC Autentificación
En RPC existe la posibilidad de elegir entre varios protocolos de autentificación Nula Unix DES Además del identificador de usuario, se cifra una
llave conocida solo por el cliente y servidor (intercambio por Diffie-Hellman)
PortMapper
Es un servicio que asocia un número de programa y versión de RPC a un puerto UDP o TCP
Cada vez que se arranca uno de los servicios RPC en un servidor, se registra en el servicio “PortMapper” de dicho “host” asociándole un determinado valor de puerto a dicho servicio
Un cliente RPC contacta con el servicio “PortMapper” para obtener el valor del puerto para determinado RPC. Después envía el RPC a dicho puerto
PortMapper