# JXTA

O JXTA (do inglês juxtapose) é uma especificação independente de linguagem e plataforma para a peer-to-peer, numa comunicação entre dispositivos sem considerar sua localização física e tecnologia de rede no qual se encontram instalados. É uma plataforma livre, criada pela Sun Microsystems em 2001.
Diversas plataformas para prover comunicação peer-to-peer já foram desenvolvidas, cada uma com seu próprio foco, mas a JXTA é considerada a mais madura atualmente.
Ela foi especificada na forma duma arquitetura micronúcleo, ou seja, mesmo os serviços mais básicos estão implementados como módulos, restando para o núcleo propriamente dito poucas funções, em geral, de comunicação entre os próprios módulos. Portanto, serviços básicos como a descoberta de nós (peers) ou de recursos na rede, comunicação entre dois ou mais nós, entre outros, são todos providos por módulos específicos.

## Conceitos básicos

Aplicações desenvolvidas para suportar o trabalho em grupo devem, obviamente, organizar seus usuários em grupos. Os grupos podem ser organizados segundo diferentes critérios e esta, bem como outras atividades, é parte do projeto da aplicação colaborativa. Para tornar esta aplicação realidade, devemos ter entidades na plataforma JXTA para os quais possam ser mapeados os principais conceitos de computação distribuída. Por isso, nesta seção, será detalhado o que constitui uma rede P2P na visão do JXTA.

## Nós e grupos

Uma rede virtual JXTA consiste de alguns tipos de nós (peers), sendo que um nó conectado à rede pode, em teoria, assumir qualquer um destes papéis descritos a seguir:
* Nós de ponta - são os nós simples, podendo tanto ser computadores desktop, conectados por uma LAN ou modem à Internet, e outros dispositivos computacionais.
   * Nós mínimos - dispositivos com restrições de recursos, como celulares e palms. Geralmente, não possuem toda a funcionalidade disponível pela plataforma JXTA aos nós.
   * Nós proxy - nós instalados em computadores que realizam funções de proxy (para mensagens da plataforma JXTA) para nós mínimos que não possuem endereço IP público; para nós que, mesmo possuindo IP, não podem realizar operações intensivas em termos de recursos computacionais; ou para nós localizados atrás dum firewall (neste caso, todas as requisições são transmitidas através de HTTP.)
* Nós rendezvous - papel que costuma ser assumido por nós com maior poder computacional, com endereço IP fixo, que atuam como cache de informação (anúncios) sobre os nós conectados, facilitando a descoberta de recursos e provendo operações de resolução, tal como resolução do nome de nós para endereço IP.
* Nó relay - nós que adquirem informação de roteamento. Realizam a passagem de mensagens para outros nós atrás dum firewall, um NAT ou, simplesmente, através de roteador. Normalmente, os papéis de rendezvous e relay são assumidos por um mesmo nó.
Nós se organizam em grupos. A especificação não define o que esses grupos são ou porque eles existem. Porém, em geral, grupos são usados para definir um conjunto de serviços e recursos, prover uma região de acesso controlado, criação de escopo, monitoração de membros, entre outras aplicações deste conceito.

## Anúncios

Todas as entidades da plataforma JXTA, incluindo nós, grupos, conexões e serviços, são representadas usando anúncios (advertisements). Eles são documentos XML bem formados contendo informação a respeito dessas entidades (um metadado). Todas as entidades possuem um identificador único e universal, além de informações adicionais específicas. A disponibilização dum recurso na rede significa a criação e publicação do seu anúncio, enviando-o a outros nós da rede.
Um anúncio possui um tempo de vida, que visa evitar descrever entidades que já não existem na rede, uma vez que eles podem ser armazenados nos caches locais dos nós. A cada inicialização dum nó, os anúncios expirados são eliminados. Note que um anúncio só existe enquanto algum nó conectado armazenar uma cópia do mesmo. Logo, o recurso associado a este anúncio só estará disponível se este também estiver.
A plataforma JXTA define seis anúncios básicos: nó, grupo, conexão (canal virtual de comunicação ponto-a-ponto), serviço (abstração para serviço oferecido por um nó ou grupo), conteúdo (abstração para conteúdo publicado) e ponto de conexão.

## Conexões e mensagens

Nós transmitem mensagens apenas através de conexões, canais virtuais que são, em geral, unidirecionais e não-confiáveis, anexáveis a um ponto de entrada e outro de saída (pontos de conexão). Conexões possuem identificadores únicos, e não estão associadas a um dispositivo de rede real, havendo um serviço de resolução de identificadores para dispositivos de rede. Também estão disponíveis conexões bidirecionais ou confiáveis, implementados sobre as conxões convencionais.
Mensagens são documentos XML bem formados, que possuem roteamento baseado no identificador da fonte, carregando em seu cabeçalho a informação de roteamento necessária, tal como a seqüência de nós a ser percorrida.

## Protocolos

São sete os serviços básicos fornecidos pela plataforma JXTA e, a princípio, providos por qualquer grupo criado.

### Protocolo de descoberta de nó

Os nós utilizam este protocolo para descobrir recursos do JXTA dinamicamente. Em uma rede IP, a implementação deste protocolo consiste de duas tarefas: o envio de uma mensagem multicast através da rede local do próprio nó e dos nós rendezvous para a descoberta de nós além da rede local. Este protocolo é implementado pelo serviço de descoberta.
Alguns nós presentes na rede podem não responder uma mensagem de consulta a um recurso, pois o protocolo é não-confiável. Felizmente, quanto mais nós existirem na rede, mais rápida será a descoberta dos mesmos, pois quando um nó responde a consulta, ele envia todos os anúncios relacionados a mesma que ele tenha descoberto anteriormente.
Os nós rendezvous são usados para armazenar anúncios de recursos que ele conhece, incluindo nós. Alguns rendezvous são providos pela própria Sun Microsystems com o objetivo de permitir a localização de rendezvous dinâmicos, ou seja, aqueles que assumem dinamicamente este papel. Cada grupo pode, inclusive, fixar uma taxa de rendezvous presentes, caso sirva a algum propósito específico.

### Protocolo de consulta de nó

Permite o envio de uma consulta genérica a outros nós (unicast ou multicast). Este protocolo serve de infraestrutura para outros protocolos do JXTA, tais como os protocolos descoberta de nó e de informação de nó.

### Protocolo de informação de nó

Coleta informações sobre o estado dum nó, sendo útil para o consumo de serviços providos, o monitoramento de desempenho da rede, a execução de algoritmos que baseados em informação global, entre outras aplicações. Ele provê uma funcionalidade de polling para verificar se um dado nó está conectado, bem como solicitar o seu anúncio.

### Protocolo rendezvous

É o protocolo responsável por propagar mensagens dentro de um grupo e controlar esta propagação, bem como permitir a conexão a serviços. Ele é base para dois outros protocolos: consulta de nó e conexão.

### Protocolo de conexão

É o protocolo responsável por associar uma conexão a seus dois pontos de conexão. Uma mensagem de consulta é enviada pela rede para encontrar um ponto de conexão já conectado a conexão desejada.

### Protocolo de roteamento

Estabelece um conjunto de mensagens de busca usadas para encontrar informações de roteamento, antes da execução do envio de uma mensagem entre nós. As rotas encontradas são armazenadas localmente, e incluem informações sobre o identificador do remetente, o identificador do destinatário, o tempo de vida da mensagem e a seqüência ordenada de nós na rota.

### Protocolo de associação

Utilizado para serviços de validação de nós para entrada em grupos. A implementação padrão deste protocolo é precária, consistindo de uma senha única para entrada no grupo.