Redes Rpc

Preview:

DESCRIPTION

Llamada a procedimiento remoto

Citation preview

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

Recommended