JXTA
# JXTA

JXTA (Juxtapose) es una plataforma interpares (peer-to-peer) open source creada por Sun Microsystems en el año 2001. Esta plataforma está definida como un conjunto de protocolos basados en XML. Dichos protocolos permiten que dispositivos conectados a una red intercambien mensajes entre sí independientemente de la topología de red. JXTA es el framework P2P más maduro que actualmente existe. Además, fue diseñado para permitir que un amplio rango de dispositivos (computadoras, teléfonos móviles, PDAs) se comuniquen de forma descentralizada.

Como JXTA está basado en una serie de protocolos abiertos, en teoría, puede ser portado a cualquier lenguaje moderno de computación. Actualmente, la implementación de JXTA de Java es la más avanzada. Existen versiones para C y C++, JXTA-C y JXTA-C++ respectivamente.

JXTA crea una red virtual que permite a los pares interactuar entre sí, aun cuando algunos de ellos estén detrás de cortafuegos, NATs o usen distintos transportes de red. Además, cada nodo es identificado por un ID único, un URN SHA-1 de 160 bits en la implementación de Java, permitiendo que los pares puedan cambiar su dirección pero conservar su número de identificación.

## Protocolos en JXTA

* Peer Resolver Protocol
* Peer Information Protocol
* Rendezvous Protocol
* Peer Membership Protocol
* Pipe Binding Protocol
* Endpoint Routing Protocol

## Categorías de nodos

JXTA define dos categorías principales de nodos: "super-peers" y "edge-peers". Los "super-peers" pueden ser divididos en "rendezvous" y "relay peers". Cada nodo o par tiene un rol bien definido en el modelo interpares de JXTA.

Los "edge peers" son usualmente definidos como pares que tienen bajo ancho de banda. Normalmente están en los límites de Internet, escondidos detrás de cortafuegos corporativos o acceden a la red a través de conexiones no dedicadas.

Un nodo "rendezvous" tiene la tarea especial de coordinar los pares en la red JXTA. Además provee de las bases necesarias para la propagación de mensajes. Si los nodos están ubicados en distintas subredes deberían tener, al menos, un par "rendezvous".

Un nodo "relay" permite que pares que estén detrás de cortafuegos o sistemas NAT tomen parte en la red JXTA, lo que se logra usando protocolos que pueden atravesar cortafuegos, como por ejemplo, HTTP.

## Anuncios

Un anuncio es un documento XML que describe todos los recursos en la red (nodos, grupos, canales, servicios, etc.). La comunicación en JXTA puede ser tomada como el intercambio de uno o más anuncios a través de la red.

## Canales

Los canales virtuales son usados por JXTA para intercambiar mensajes e información. Los canales son asíncronos, poco fiables, y unidireccionales. Hay básicamente tres tipos de canales:

* Unicast
* Unicast seguro
* Propagación

## Grupos de nodos

Un grupo de nodos provee alcance para la propagación de mensajes y agrupación lógica de nodos. En JXTA, cada nodo es miembro de un grupo por defecto, NetPeerGroup, pero un nodo puede ser miembro de muchos subgrupos al mismo tiempo. Un nodo puede desempeñar diferentes roles en diferentes grupos; puede ser un nodo "edge" en un grupo, pero uno "rendezvous" en otro.

Cada grupo debe tener al menos un nodo "rendezvous" y no es posible mandar mensajes entre dos grupos.

## Funcionamiento

Los nodos "rendezvous" tienen mecanismos optimizados de enrutamiento que permiten una eficiente propagación de mensajes apoyados por los nodos "edge" conectados a ellos. Esto es logrado a través del uso de una red vagamente consistente.

Cada nodo "rendezvous" mantiene una lista de nodos (RPV, Rendezvous Peer Node), una lista de nodos "rendezvous" organizados por su ID de nodo. No hay ningún mecanismo para hacer valer la consistencia de todas las RPVs a través de la red de JXTA, por eso una lista RPV dada puede tener una inconsistencia permanente o temporal con las de los otros nodos. Tan pronto haya baja tasa de cancelación de clientes, esto quiere decir, una red estable donde los nodos no se unen o abandonan frecuentemente, la lista RPV de cada nodo convergerá con la de otros nodos por medio de un intercambio de su lista con la lista de un subconjunto de nodos "rendezvous" de vez en cuando.

Cuando un nodo "edge" publica un anuncio, el índice de este anuncio es enviado al nodo "rendezvous" por medio de un sistema llamado Índice de Recursos Compartidos Distribuidos (SRDI, Shared Resource Distributed Index). Después de eso, el nodo "rendezvous" aplica una función DHT de modo que pueda enviarle el índice a otro nodo en la lista RPV. Para propósitos de reenvío, el nodo enviara el índice a los nodos "rendezvous" vecinos que estén en la lista RPV.

El proceso de búsqueda requiere el uso de la misma función DHT para descubrir que nodos "rendezvous" están a cargo de almacenar ese índice. Una vez que el nodo "rendezvous" es encontrado, enviara la solicitud al nodo "edge" que publicó el anuncio y este nodo se pondrá en contacto con el nodo que hizo la solicitud.

Si la función DHT no puede encontrar el nodo que está a cargo del anuncio, la solicitud será enviada al final y llegara al principio de la lista RPV para repetir el proceso hasta que, se encuentre el nodo, la solicitud sea cancelada o alcance los límites de la lista RPV. Este proceso es llamado caminata aleatoria.

## Programas

* BoxCloud - Un sistema propietario de intercambio P2P de contenido universal
* OneDrum - Una plataforma colaborativa para MS Office
* b2een - Un cliente P2P gratis usado para intercambiar mensajes EDI por compañías como Chevron, Areva o GE Oil&Gas
* Collanos Workplace - Un grupo de colaboración P2P propietario basado en JXTA
* Sixearch - Una aplicación P2P colaborativa basada en JXTA

## Estado

"In November 2010, Oracle officially announced its withdrawal from the JXTA projects" (traducción: "En noviembre de 2010, Oracle anunció oficialmente su retirada de los proyectos JXTA"). Desde agosto de 2011, el proyecto JTXA no ha continuado o anunciado que conservaría sus operaciones, ni se tomó una decisión por la asamblea, ni una respuesta por parte de Oracle en relación con una solicitud pendiente para mover el código fuente a Apache License versión 2.

