IEEE LATIN AMERICA TRANSACTIONS, VOL. 7, NO. 1, MARCH 2009 107 Integrating Multiplexing Facilities in the Set of JRMP Subprotocols P. Basanta-Val, M. Garcia-Valls, I. Estévez-Ayres, J. Fernádez-González Abstract— With the process of adaptation and redefinition of Java Remote Method Invocation for J2ME (Java 2, Micro Edition) environments, a reduced version of the Remote Method Invocation (RMI) came up. In this reduced version, called RMIOP, some heavy features such as multiplexing facility or its capacity to go through firewalls offered by the wire protocol, called Java Remote Method Protocol (JRMP), have been eliminated. In the present article it is explored how the recovery of the multiplexing facilities of JRMP, rejected during the RMIOP definition, can be carried out maintaining the J2ME idiosyncrasy. The article begins showing how to extend the triad of subprotocols already defined (SingleOpProtocol, StreamProtocol and MultiplexProtocol) with a new one (MultiplexConnnectionLessProtocol) equipped with special facilities to multiplex connections. It gives support for fast and light connection connectionless virtual connections generation and recycling. The paper ends with an empirical evaluation of the proposed subprotocols together with the already existing ones, in terms of end-to-end response time and the size of the frames transmitted through the network, showing the goodness of the protocols. Keywords— Communication protocols, algorithms. I. INTRODUCCIÓN Especialmente durante estos últimos años, las aplicaciones y los sistemas distribuidos han proliferado hasta hacerse prácticamente indispensables en el mundo de la telecomunicación, de la informática y de la ciencia e ingeniería en general. Los estándares para el desarrollo de este tipo de aplicaciones se han ido perfeccionando al mismo tiempo que se ha conseguido que su implementación sea cada vez más rápida, sencilla y eficiente. Este avance se ha traducido en protocolos de comunicaciones bien definidos como pueden ser el GIOP de CORBA ([1] y [2]), el aún reciente SOAP [3] o el protocolo propietario de comunicaciones JRMP, utilizado por el modelo de objetos distribuidos RMI [4] de Java. Si bien los sistemas se han distribuido no es menos cierto que también ha habido, en estos últimos años, un fuerte crecimiento en el terreno embebido. De esta manera, hemos asistido a la aparición de una nueva generación de dispositivos electrónicos (teléfonos móviles, PDAs o incluso electrodomésticos) cuya característica común es la de operar Pablo Basanta Val, Universidad Carlos III de Madrid, [email protected] Marisol García Valls, Universidad Carlos III de Madrid, [email protected] Iria Estévez Ayres, Universidad Carlos III de Madrid, [email protected] Jorge Fernández González, Universidad Carlos III de Madrid, [email protected] en escenarios donde existe algún tipo de escasez de recursos (memoria, capacidad de cómputo o procesado, acceso a redes de comunicación, etc.), y que comúnmente se conocen como “dispositivos limitados”. Ese crecimiento pasado, acompañado de unas buenas previsiones para el futuro (algún informe relacionado [5] habla de crecimientos situados entre el 10% y el 16% de aquí al 2009) hace que exista un fuerte interés en adecuar los protocolos y modelos middleware existentes para propósito general a las restricciones impuestas por este nuevo tipo de sistemas. A día de hoy, se puede decir que ya se han dado algunos pasos importantes en esa dirección. Uno de ellos es Minimum CORBA ([6]), una versión recortada de CORBA donde han sido eliminadas ciertas características causantes de una gran sobrecarga tanto computacional como espacial, e introducidas otras simplificaciones en el modelo de comunicaciones (véase [7]). De la misma manera, en el mundo Java, en el modelo original de RMI, se ha eliminado el soporte para el acceso transparente a través de cortafuegos, así como las capacidades de multiplexación proporcionadas por el subprotocolo MultiplexProtocol, dando todo ello lugar a RMIOP [8]. Así, a fin de mostrar cómo se puede recuperar la capacidad de multiplexación de RMI eficientemente bajo las restricciones impuestas por J2ME, el resto de este artículo se estructura tal y como sigue. En la sección II son introducidos ciertos conceptos básicos de JRMP como son los diferentes tipos de mensajes o el concepto de subprotocolo. La sección III describe cómo los diferentes subprotocolos, diseñados originalmente para RMI, participan en la realización de una invocación remota RMI. La sección IV describe el protocolo diseñado y su papel dentro de una invocación remota. En la sección V, se comparan los tiempos de respuesta y el ancho de banda consumido por los tres subprotocolos ya existentes con los del protocolo propuesto, viendo su efectividad a la hora de atender peticiones remotas. Por último, la sección VI cierra el artículo esbozando las conclusiones y líneas futuras que se desprenden del trabajo realizado. II. CABECERAS, SUBPROTOCOLOS Y MENSAJES EN JRMP Antes de adentrarnos en la definición del protocolo propuesto, esta sección presenta de forma parcial algunos detalles del protocolo de comunicaciones RMI también conocido como Java Remote Method Protocol (JRMP, o simplemente Wire Protocol, tal y como aparece descrito en el capítulo 8 de la especificación [9]). 108 IEEE LATIN AMERICA TRANSACTIONS, VOL. 7, NO. 1, MARCH 2009 Internamente, este protocolo hace uso a su vez, de otros dos protocolos: del de serialización de objetos Java [10] y del popular HTTP. En cuanto al primero, su uso esta destinado a la operación de serialización y deserialización en las llamadas remotas así como a la devolución de datos. Por otra parte, el protocolo HTTP puede ser empleado para realizar un POST de una invocación a método remoto y para la obtención de resultados. A. Flujos de entrada y flujos de salida Una de las primeras consideraciones a tener en cuenta en este punto es que el contenido de la cabecera de transporte no estará formateado mediante la serialización de objetos Java. Por otro lado, los flujos o streams de comunicación en RMI siempre estarán emparejados, es decir, cada flujo de salida siempre estará relacionado con un flujo de entrada y viceversa. De esta manera, el flujo de salida estará referido a los mensajes salientes desde un nodo (y por tanto, hará referencia al flujo de salida de un socket desde la perspectiva de un cliente), mientras que los mensajes entrantes serán aquellos que llegan hasta el nodo (y se corresponderán con el flujo de entrada del socket). diferenciados. En el caso de SingleOpProtocol, sólo habrá un mensaje después de la cabecera y, por tanto, no habrá información adicional a parte del mensaje encapsulado. En el caso del StreamProtocol y MultiplexProtocol, el servidor deberá responder con el octeto 0x4E a modo de asentimiento o ACK, con lo que el cliente podrá interpretar que el protocolo a emplear es soportado por el otro extremo de la comunicación. La sección III incluye esquemas empíricos de la realización de una invocación remota con cada uno de estos tres subprotocolos. En la figura 2 se muestran más en detalle los mensajes que acompañan la cabecera del protocolo. En total, JRMP distingue tres tipos de mensajes: • Call que sirve para invocar a un método remoto. • Ping que es un mensaje del nivel de transporte destinado a probar la existencia o funcionamiento de una máquina virtual remota. • DgcAck que es un mensaje de asentimiento dirigido al recolector de basura distribuido del servidor. Call: 1) Flujo de salida en JRMP Un flujo de salida RMI estará compuesto por una cabecera de transporte seguida de una secuencia de mensajes. Alternativamente, un flujo de salida podrá contener una invocación encapsulada dentro del protocolo HTTP. Lo que en la práctica nos lleva a la existencia de dos tipos de mensajes: • • Mensaje encapsulado en HTTP o HttpMessage. Este tipo de encapsulación sirve de envoltorio permitiendo que la información pueda atravesar fácilmente, por ejemplo, un cortafuegos. Desde el punto de vista del protocolo diseñado este tipo de mensaje carece de gran relevancia. Cabecera con mensajes (tal y como se muestra en la figura 1) de gran relevancia a la hora de introducir el nuevo subprotocolo manteniendo la compatibilidad hacia atrás. De toda esta trama, son especialmente relevantes tanto los campos protocolo como mensaje. El primero de ellos permite escoger, de entre los tres subprocolos existentes, el utilizado durante el intercambio de mensajes mientras que el segundo permite el intercambio de mensajes entre los dos extremos de la aplicación. Cabecera 0x4A 0x52 0x4D Mensajes Versión Mensaje CallData 0x52 Ping: DgcAck: 0x54 Unique Identifier Figura 2: Formato de los principales mensajes de salida del protocolo JRMP 2) Formato de los flujos de entrada Si en vez de considerar el conjunto de mensajes que envía un cliente, consideramos los que recibe, observaremos la existencia de tres tipos de mensajes: • • • HttpReturn, que se utiliza para devolver el resultado de una invocación encapsulada mediante HTTP. ReturnData, que será el resultado de la realización de una invocación remota normal. PingAck que es el asentimiento a un mensaje de tipo Ping. La figura 3 nos muestra el formato de los mensajes recibidos. En primer lugar, se recibe la confirmación (con 0x4E) de la recepción de un mensaje o, por el contrario (con 0x4F), la indicación de que el protocolo utilizado no es soportado por el servidor. En caso de que sea exitoso, el flujo de salida se acompañará de una serie de mensajes adicionales. ProtocolAck Protocolo 0x50 Returns Return Mensaje 0x00 0x02 Men Returns Men StreamProtocol (0x4B) SingleOpProtocol (0x4C) MultiplexProtocol (0x4D) Figura 1: Esquema con las cabeceras y mensajes del flujo de salida del protocolo JRMP Como podemos observar en la figura 1, cada uno de los mensajes será encapsulado dentro de un subprotocolo (campo Protocolo) determinado, existiendo dos comportamientos Return 0x4E, 0X4F Figura 3: Formato de un ProtocolAck y lista de mensajes retornados Estos mensajes adicionales, tal y como esquematiza la figura 4, pueden ser de dos tipos: ReturnData o PingAck. El primero de ellos se utiliza típicamente como respuesta a un proceso de invocación remota y viene acompañado VAL et al.: INTEGRATING MULTIPLEXING FACILITIES 109 (ReturnValue) de una serie de resultados de la invocación remota. El segundo de ellos se encarga de dar fe del buen funcionamiento del otro extremo. Por último, ha de notarse que el DGCAck carece de mensajes de entrada asociados. 0x51 ReturnData: ReturnValue Return 0x53 PingAck: Figura 4: Los diferentes tipos de mensajes de entrada definidos por JRMP III. INVOCACIÓN REMOTA Y SUBPROTOCOLOS JRMP A fin de ver las diferencias existentes entre los tres subprotocolos descritos, esta sección muestra la forma en que éstos participan durante las invocaciones remotas. En todos los casos, las secuencias de mensajes mostradas han sido obtenidas empíricamente tomando trazas reales con el Ethereal [11] aplicándolo directamente sobre la implementación de referencia de Sun Microsystems. A. Invocación remota con SingleOpProtocol La figura 5 muestra cómo SingleOpProtocol participa en una invocación remota cuando la red subyacente es de tipo TCP. En este caso, cada invocación remota requiere del establecimiento de una nueva conexión TCP, con su correspondiente señalización del canal de comunicaciones mediante mensajes SYN y SYN-ACK. Tras ello, el cliente podrá enviar, ya en el siguiente mensaje, una petición de tipo Call que será contestada de inmediato, en el caso de que la invocación remota haya sido exitosa con un mensaje de tipo ReturnData. Tras ello, se procede a cerrar la conexión mediante los mensajes de FIN y ACK descritos en TCP. CLIENTE relevante en condiciones normales, es que al coste de enviar los datos necesarios para realizar la invocación remota hay que añadirle el de introducir, enviar y procesar, tanto en cliente como en el servidor, las cabeceras específicas del subprotocolo SingleOpProtocol. B. Invocación remota con StreamProtocol El protocolo StreamProtocol se puede entender como un protocolo que ataca estos dos problemas, proponiendo, al igual que el modelo orientado a conexión de TCP, la negociación previa de un canal de comunicaciones. La figura 6 muestra cómo StreamProtocol colabora a la hora de realizar una invocación remota. En primer lugar, al igual que en el caso precedente se establece el canal TCP de comunicaciones. Tras ello, y de forma distinta a lo que ocurría antes, se establece la conexión del StreamProtocol, enviando desde el servidor al cliente el EndPointIdentifier recibido. Tras esta primera fase de comunicaciones el canal ya puede ser utilizado para enviar y recibir datos. CLIENTE SERVIDOR SYN Establecimiento de la conexión TCP Establecimiento de la conexión RMI SYN, ACK ACK Cabecera (con protocolo StreamProtocol 0x4B) ProtocolAck (0x4E) con EndPointIdentifier Mensaje Continuation de la fase de negociación en que el cliente puede indicar otro EndPointIdentifier Invocación remota RMI Call (0x50) con su correspondiente CallData para la serialización de datos ReturnData (0x51) con su correspondiente ReturnValue para la serialización de datos SERVIDOR SYN Establecimiento de la conexión TCP SYN, ACK ACK FIN Invocación remota en RMI Cabecera (con protocolo SingleOpProtocol (0x4C) + Call con la correspondiente serialización de datos ReturnData (0x51) con su correspondiente ReturnValue para la serialización de datos ACK Cierre de la conexión TCP FIN, ACK ACK Cierre de la conexión TCP FIN Figura 6: Invocación remota con StreamProtocol. Esquema de mensajes ACK A diferencia de lo que ocurría con SingleOpProtocol, ya no es necesario que en cada mensaje aparezca encapsulado con el tipo de protocolo utilizado sino que se puede enviar sin el envoltorio, ganando eficiencia durante las invocaciones remotas. Otra diferencia relevante es que tras la primera invocación remota ya no es necesario cerrar el canal sino que éste puede reutilizarse para otras invocaciones remotas. Lo que se traduce en unos tiempos de respuesta menores en aquellas aplicaciones capaces de reaprovechar el canal de comunicaciones ya establecido. FIN, ACK ACK Figura 5: Invocación remota con SingleOpProtocol. Esquema de mensajes El subprotocolo descrito adolece, al menos, de dos inconvenientes. El primero de ellos es la alta sobrecarga que supone abrir y cerrar una conexión TCP cada vez que se quiere realizar una invocación remota. El segundo, menos 110 IEEE LATIN AMERICA TRANSACTIONS, VOL. 7, NO. 1, MARCH 2009 Una limitación que presenta este protocolo es la carencia de un soporte nativo para la concurrencia: dos clientes que quieran acceder de forma independiente a un mismo objeto remoto habrán de abrir, cada uno, su propia conexión de tipo StreamProtocol. Consciente de esta limitación, JRMP define un tercer subprotocolo: MultiplexProtocol. C. Invocación remota con MultiplexProtocol El protocolo MultiplexProtocol, replica varios de los mecanismos presentes en TCP, como por ejemplo el control de flujo o el propio mecanismo de establecimiento de conexiones, en el nivel middleware, definiendo para ello soporte a subconexiones. A fin de comprender cómo funciona, la figura 7 muestra la manera en que MultiplexProtocol es utilizado a la hora de realizar una invocación remota. CLIENTE SERVIDOR SYN Establecimiento de la conexión TCP Establecimiento de la conexión RMI SYN, ACK ACK Cabecera (con protocolo MultiplexProtocol 0x4D) ProtocolAck (0x4E) con EndPointIdentifier Mensaje Continuation de la fase de negociación en que el cliente puede indicar otro EndPointIdentifier OPEN + Identificador de conexión Establecimiento de la subconexión multiplexada REQUEST + Identificador de conexión TRANSMIT + Identificador de conexión + Call (0x50) con su correspondiente CallData para la serialización datos REQUEST + Identificador de de conexión Invocación remota RMI TRANSMIT + Identificador de conexión + Return (0x51) con su correspondiente ReturnValue para la serialización de datos Figura 7: Invocación remota con MultiplexProtocol. Esquema de mensajes Al igual que en los dos casos precedentes, se comienza por la apertura de la conexión TCP. Tras haber abierto la conexión TCP, y al igual que ocurre en StreamProtocol, se negocia el tipo de protocolo utilizado. Tras esta negociación inicial hay que abrir una conexión virtual con el otro extremo. Eso se consigue mediante la primitiva OPEN que una vez confirmada con un REQUEST permite el envío de datos. REQUEST es una primitiva especial que indica al otro extremo el número de octetos que puede recibir un extremo sirviendo, por tanto, para controlar el flujo de la comunicación. Tras abrir la conexión y ya mediante una primitiva TRANSMIT se puede transmitir el mensaje de Call que es contestado con otro TRANSMIT que encapsula el correspondiente Return. A partir de esta primera comunicación, el esfuerzo se reduce ya que no es necesario proceder a la apertura de ningún tipo de conexión virtual. Por tanto, la gran ventaja proporcionada por el MultiplexProtocol, en contraste con lo que ocurre en SingleOpProtocol y StreamProtocol, es que posibilita que por una única conexión TCP viajen mensajes de diferentes comunicaciones mediante el concepto de conexión virtual. Sin embargo el coste del mecanismo multiplexor descrito por MultiplexProtocol puede ser, a veces, demasiado costoso para ser ejecutado de una forma mucho más dinámica. Al coste extra de tener que procesar los diferentes paquetes del subprotocolo MultiplexProtocol (y que no aparecen en StreamProtocol ni en SingleOpProtocol) hay que añadirle que el mecanismo de control del flujo propuesto (basado en mensajes REQUEST y TRANSMIT) consume recursos que no tienen por qué estar siempre disponibles en entornos J2ME. Es por ello, que en el paquete RMIOP, se elimina el soporte ofrecido para MultiplexProtocol, dejando sólo el de SingleOpProtocol y el de StreamProtocol. Pero sin embargo, la capacidad de multiplexación sigue siendo interesante pues hay entornos que limitan el número de conexiones que pueden ser aceptadas. IV. MULTIPLEXCONNECTIONLESSPROTOCOL El nuevo subprotocolo que se ha propuesto, i.e. MultiplexConnectionLessProtocol, puede entender se como un subprotocolo de tipo StreamProtocol dotado de un mecanismo ligero de multiplexación. En vez de un modelo orientado a conexión con control del flujo, como el que es incorporado por el MultiplexProtocol, el protocolo en su diseño opta por un modelo de multiplexación no orientada a conexión de bajo coste, capaz de gestionar conexiones virtuales de forma ágil y dinámica. A. Cambios introducidos en JRMP En primer lugar es necesario integrar el nuevo subprotocolo dentro de JRMP. Esto se puede conseguir de forma sencilla asignándole, tal y como se expresa gráficamente en la figura 8, un identificador libre (se ha escogido arbitrariamente el identificador 0x60, en principio libre) para el subprotocolo MultiplexConnectionLessProtocol. Magic 0x4A 0x52 0x4D 0x49 Versión 0x00 0x02 Protocolo StreamProtocol (0x4B) SingleOpProtocol (0x4C) MultiplexProtocol (0x4D) MultiplexConnectionLessProtocol (0x60) Figura 8: Cambios introducidos por MultiplexConnectionLessProtocol La negociación del protocolo así como el establecimiento de la conexión no requiere de cambios en las tramas. El esquema de MultiplexProtocol y de StreamProtocol puede ser utilizado sin cambios sustanciales. De esta manera, en los tres casos se VAL et al.: INTEGRATING MULTIPLEXING FACILITIES 111 procede al intercambio de los identificadores entre los dos extremos de la comunicación. No ocurre lo mismo con el conjunto de mensajes intercambiados, donde existe la necesidad (no presente en las soluciones previas) de indicar la conexión virtual a la que pertenecen los mensajes. MultiplexConnectionLessProtocol solventa el problema introduciendo una cabecera corta (de 2 octetos) con el identificador de conexión virtual a la que pertenece el mensaje. Tal y como se puede ver en la figura 9, en la cabecera, se añade a dos de los tres mensajes de salida: Call y Ping (y no a DGCAck) y a todos los de entrada: PingAck y Return. Identificador de conexión virtual (2 octetos) Call (0x50) Identificador de conexión virtual (2 octetos) Ping (0x52) Identificador de conexión virtual (2 octetos) Return (0x51) Identificador de conexión virtual (2 octetos) PingAck (0x53) Serialization Data (CallData) Serialization Data (Return) Figura 9: Cabeceras ligeras de conexión virtual introducidas por MultiplexConnectionLessProtocol B. Participación en la invocación remota A fin de comprender un poco mejor cómo funciona una invocación remota con este nuevo subprotocolo, la figura 10 muestra cómo el protocolo participa en una invocación remota. CLIENTE SERVIDOR SYN Establecimiento de la conexión TCP SYN, ACK Establecimiento de conexión RMI Cabecera (con protocolo MultiplexConnectionLessProtocol 0x60) ACK ProtocolAck (0x4E) con EndPointIdentifier Mensaje Continuation de la fase de negociación en que el cliente puede indicar otro EndPointIdentifier Invocación remota RMI Identificador de conexión virtual + Call (0x50) con su correspondiente CallData para la serialización de datos conexiones virtuales, sino que se trata de una característica dinámica. De la misma manera, también se observa que, al igual que en StreamProtocol, para la realización de una invocación remota es suficiente con dos mensajes. Se puede entender, por tanto, que el protocolo diseñado aúna por un lado la eficiencia de diseño de StreamProtocol con, por otro lado, la capacidad de multiplexación de MultiplexProtocol. V. COSTES Y VENTAJAS ASOCIADAS A MULTIPLEXCONNECTIONLESSPROTOCOL A fin de evaluar, de una forma empírica, las ventajas, así como las sobrecargas introducidas por el nuevo protocolo propuesto, se ha realizado una implementación del mismo. Se ha partido de la implementación de RMIOP disponible en la página Web de Sun Microsystems para J2ME [8] y se la ha dotado de soporte adecuado para el protocolo MultiplexConnectionLessProtocol descrito, así como para SingleOpProtocol y MultiplexProtocol (por defecto, la implementación tan sólo ofrece soporte para StreamProtocol), tomados de la implementación tradicional para J2SE. Las pruebas han sido realizadas en un escenario donde los costes de procesado del protocolo JRMP se hacen más visibles. Este escenario es aquél formado por un cliente y un servidor en ejecución sobre un mismo ordenador y donde el método remoto invocado es de tipo void doNothing(). Todos los resultados que se mencionan han sido obtenidos utilizando una maquina virtual comercial de tipo CVM llamada JTime [12], dotada de soporte para la especificación RTSJ de tiempo real [13], en un entorno de ejecución Redhat 9.0, sobre un procesador Pentium IV a 2400 Mhz dotado de 512 Mb de memoria. A fin de eliminar interferencias, cada medida temporal ha sido realizada 150 veces, comprobándose que la distribución resultante es modelable por una gaussiana y procediéndose a la estimación de su media y desviación típica. A. Tiempos de respuesta extremo a extremo La tabla 1 contiene los resultados obtenidos en este escenario de pruebas relativos a lo que es la latencia extremo a extremo. Se presentan dos casos, la primera invocación (donde es necesario establecer la conexión TCP) y el resto (donde dependiendo del protocolo utilizado, la conexión, podrá ser reutilizada o no), reduciéndose, en consecuencia, los tiempos de respuesta observados. TABLA I: TIEMPO DE RESPUESTA MEDIO (EN MICROSEGUNDOS) Y DESVIACIÓN TÍPICA EN UN PROCESADOR A 2400 MHZ Identificador de conexión virtual + ReturnData (0x51) con su correspondiente ReturnValue para la serialización de datos Primera Media Desv 1836,75 6,036 Resto Media Desv 1830,03 8,62 StreamProtocol 1848,07 5,174 444,773 3,63 MultiplexProtocol 79887,0 21,38 673,5 8,03 MultiplexConnectionLessPr otocol 3840,11 10,82 544,24 4,51 SingleOpProtocol Figura 10: Invocación Esquema de mensajes remota con MultiplexConnectionLessProtocol. En ella se puede observar, a diferencia de lo que ocurría en MultiplexProtocol, que el envío de la llamada de Call no requiere la utilización de ningún tipo de establecimiento de Los resultados para la primera invocación muestran que MultiplexConnectionLessProtocol es capaz de ofrecer un rendimiento (3840 μs) superior al del protocolo de 112 IEEE LATIN AMERICA TRANSACTIONS, VOL. 7, NO. 1, MARCH 2009 multiplexado de RMI (79887 μs), ligeramente peor que el de los protocolos SingleOpProtocol (1836 μs) y StreamProtocol (1848,7 μs). Porcentualmente, la mejora obtenida al sustituir MultiplexProtocol por el protocolo sin conexión es del 95 %. Esta mejora inicial se reduce tras la primera invocación remota (dado que la conexión TCP y la negociación de la conexión iniciales se pueden reutilizar). Se obtienen tiempos medios de 544,24 μs en el caso del protocolo diseñado y de 673,5 μs en el caso multiplexado, lo que porcentualmente hace que pasemos de reducciones de un 95 % a un 19,22 %. Se puede concluir, por tanto, que el protocolo propuesto es capaz de recuperar las capacidades de multiplexación introduciendo unas latencias inferiores a las de MultiplexProtocol, cercanas a las ofertadas por StreamProtocol. B. Ancho de banda consumido Por último, si en vez de medir la latencia extremo a extremo tenemos en cuenta lo que es el ancho de banda consumido (véase ahora la tabla de resultados 2), se puede observar que el protocolo diseñado se encuentra, en términos de rendimiento, también entre MultiplexProtocol y StreamProtocol. Si se compara con StreamProtocol, se puede comprobar la existencia de un coste fijo adicional de cuatro octetos (de la cabecera de comunicaciones y su identificador de conexión virtual), lo que porcentualmente, en el peor de los casos hace que el tamaño de la trama transmitida aumente como mucho en un 6,34 %. TABLA II: TAMAÑO (EN OCTETOS) DE LAS TRAMAS TRANSMITIDAS EN UNA INVOCACIÓN REMOTA SingleOpProtocol StreamProtocol MultiplexProtocol MultiplexConnectionLessProtocol extensión ofrecidas por JRMP, de una forma sencilla y conservando la compatibilidad hacia atrás mediante conexiones virtuales ligeras, no orientadas a conexión. Los resultados de la implementación nos sugieren, con notables reducciones en lo que es el tiempo de respuesta y una baja sobrecarga en el tamaño de trama, que la capacidad de multiplexación propuesta puede resultar altamente interesante. Por el momento se han identificado ya algunas líneas de trabajo futuro. Una de ellas consiste en la realización de un mayor número de pruebas empíricas, en diferentes escenarios (como los descritos en [14]) y con diferentes cargas de aplicación, con el fin de determinar de forma más precisa el dominio de aplicabilidad del protocolo propuesto. Otra de ellas consiste en la adecuación del protocolo no sólo a las necesidades de los sistemas embebidos, sino a las de los sistemas de tiempo real (como los descritos en [15] y [16]), lo que requerirá, entre otras tareas, la readaptación del protocolo propuesto y su sensibilización con las necesidades impuestas por tales aplicaciones. REFERENCIAS [1] [2] [3] [4] [5] [6] [7] Primera Resto 70 101 135 105 70 63 88 67 [8] [9] En cambio, las reducciones que se pueden experimentar (si lo comparamos con su competidor MultiplexProtocol) son de un 22,5 %, para la primera invocación remota, y de un 23 %, en adelante. Si tomamos los resultados obtenidos y hacemos un balance conjunto veremos que en el caso de estudio propuesto, tanto el tamaño de trama como los tiempos obtenidos para la respuesta extremo a extremo se encuentran entre los de StreamProtocol y los de MultiplexProtocol. [10] [11] [12] [13] [14] [15] VI. CONCLUSIONES [16] Los protocolos de comunicaciones actualmente existentes para sistemas de propósito general han de ser adecuadamente armonizados con las restricciones impuestas por los sistemas embebidos. En este artículo se ha revisado el protocolo JRMP de RMI y se ha visto cómo optimizarlo de tal manera que incorpore facilidades de multiplexación en entornos J2ME. La adaptación se ha hecho utilizando las posibilidades de Vinoski, S. New features for CORBA 3.0. Commun. ACM 41, 10 (Oct. 1998), 44-52. Object Management Group. Common Object Request Broker Architecture. July, 1995. W3C. SOAP v 1.2. Available on-line at http://www.w3.org/TR/soap12/ Waldo, J. Remote Procedure Calls and Java Remote Method Invocation. IEEE Concurrency 6, 3 (Jul. 1998), 5-7 Ravi Krishnan. Future of embedded systems technology. Technical report, BCC, Inc. June 2005 Object Management Group. Minimum CORBA - Joint Revised Submission. OMG Document orbos/98-08-04 ed., August 1998. Andy Gokhale and Douglas C. Schmidt. Optimizing a CORBA IIOP Protocol Engine for Minimal Footprint Multimedia Systems. IEEE Journal on Selected Areas in Communications special issue on Service Enabling Platforms for Networked Multimedia Systems, September, 1999. Sun Microsystems. J2ME RMI Optional Package (RMI OP). On-line, http://www.sun.com/software/communitysource/j2me/rmiop/index.xml Sun Microsystems. Java remote method invocation RMI v1.5. 2004. Available on-line at http://java.sun.com/j2se/1.5/pdf/rmi-spec-1.5.0.pdf Sun Microsystems. Java serialization v1.5. 2004. Available on-line at http://java.sun.com/j2se/1.5/pdf/serial-spec.pdf Ethereal, Inc. Ethereal: The world's most popular network protocol analyzer. Available on line at http://www.ethereal.com/ Timesys. JTime virtual machine. Available on-line at http://www.timesys.com/java/ Bollella, G. and Gosling, J. 2000. The Real-Time Specification for Java. Computer 33, 6 (Jun. 2000), 47-54. Reyna Ballesteros, A., and Gama Moreno, L. A. Embedded file manager for mobile devices design and implementation. IEEE Latin America Transactions, 5,8, (Dec. 2007). 638-643. Basanta-Val, P., Almeida, L., Garcia-Valls, M., and Estevez-Ayres, I. 2007. Towards a Synchronous Scheduling Service on Top of a Unicast Distributed Real-Time Java. In Proceedings of the 13th IEEE Real Time and Embedded Technology and Applications Symposium (April 03 - 06, 2007). 123-132. Estévez-Ayres, I., García-Valls, M., Almeida, L., and Basanta-Val, P. 2008. Solutions for Supporting Composition of Service-Based RealTime Applications. In Proceedings of the 2008 11th IEEE Symposium on Object Oriented Real-Time Distributed Computing (May 05 - 07, 2008). 42-49. VAL et al.: INTEGRATING MULTIPLEXING FACILITIES Pablo Basanta Val nació en O Valadouro, provincia de Lugo (España) en 1978. Obtuvo su título de Ingeniero de Telecomunicación en la Universidad de Vigo en el año 2001 y el de doctor por la Universidad Carlos III de Madrid en el año 2007. Actualmente trabaja en el departamento de Ingeniería Telemática de la Universidad Carlos III de Madrid dentro del grupo de aplicaciones telemáticas (GAST) en el laboratorio de tiempo real. Su investigación gira alrededor del mundo de los sistemas distribuidos de tiempo real Java, donde recientemente completó su tesis doctoral: “Técnicas y Extensiones para Java de tiempo real distribuido”. Marisol García Valls nació en Castellón de la Plana, provincia de Castellón (España) en 1973. Obtuvo su título de Ingeniera en Informática en la Universitat Jaume I de Castellón en el año 1996 y el de doctora por la Universidad Politécnica de Madrid en el año 2001. Actualmente es Profesora Titular de Universidad en el Departamento de Ingeniería Telemática de la Universidad Carlos III de Madrid. Es la coordinadora del Laboratorio de Sistemas Distribuidos y de Tiempo Real que pertenece al Grupo de Aplicaciones Telemáticas (GAST) de esta universidad. Su investigación se centra en la gestión de recursos y calidad de servicio en plataformas middleware para sistemas embarcados de tiempo real distribuidos. Iria Estévez Ayres nació en Vigo, provincia de Pontevedra (España) en 1978. Obtuvo su título de Ingeniera de Telecomunicación en la Universidad de Vigo en el año 2001 y el de doctora por la Universidad Carlos III de Madrid en el año 2007. Actualmente trabaja en el departamento de Ingeniería Telemática de la Universidad Carlos III de Madrid dentro del grupo de aplicaciones telemáticas (GAST) en el laboratorio de tiempo real. Su investigación gira alrededor de la composición dinámica de servicios de tiempo real, donde recientemente completó su tesis doctoral: “Técnicas de soporte a la flexibilidad funcional en sistemas embarcados distribuidos de tiempo real”. Jorge Fernández González nació en Madrid, provincia de Madrid (España) en 1984. Obtuvo su título de Ingeniero Técnico de Telecomunicación en la especialidad de Telemática en la Universidad Carlos III de Madrid en el año 2007. Actualmente realiza los estudios conducentes a la obtención del título de Ingeniero de Telecomunicación. 113