• Nenhum resultado encontrado

Arquiteturas de Redes Par-a-Par

2.2.2 Estrutura Baseada em Malha

Em uma estrutura baseada em malha (mesh-based), os participantes não se organizam em uma topologia estática. As relações são estabelecidas baseando-se nos recursos disponíveis momentaneamente. Um participante se conecta a um subconjunto de outros participantes do sistema e, periodicamente, eles trocam informações. Os dados são buscados nos participantes que já os têm. Como um participante tem múltiplos vizinhos ao mesmo tempo, a organização em malha é robusta à dinâmica dos nodos. Entretanto,

Figura 2.3: Sistema baseado em múltiplas árvores com dois subfluxos.

essa relação dinâmica faz com que a distribuição de vídeo se torne imprevisível. Diversos trabalhos recentes na área de fluxo contínuo P2P adotam uma estrutura baseada em malha [35,99,103,106]. Em um sistema desse tipo, não existe uma topologia fixa da rede P2P. Os nodos estabelecem suas conexões dinamicamente, de acordo com seus interesses. Os participantes sempre mantêm parcerias com vários outros vizinhos. Eles podem fazer envio ou recepção de dados de múltiplos parceiros e, se um participante deixa o sistema, seus vizinhos continuam recebendo o conteúdo desejado dos demais nodos, com os quais eles mantêm contato. Caso seja do interesse de um participante, ele poderá encontrar novos parceiros para manter um nível de conectividade alto. Um alto grau de conectividade faz com que a estrutura em malha torne-se robusta à dinâmica dos participantes do sistema. Trabalhos recentes, como [57], mostram que uma estrutura baseada em malha tem um desempenho superior que uma estrutura baseada em árvores.

De maneira similar ao que acontece a um dos sistemas de compartilhamento de arquivos mais populares, o Bittorrent [5], uma estrutura em malha, tem um servidor centralizado. Esse servidor mantém uma lista dos participantes ativos na sessão de vídeo. Quando um usuário junta-se à aplicação de distribuição de mídia contínua ao vivo, ele contata este servidor e se cadastra. O servidor de bootstrap, rendevouz ou

tracker, como costuma ser chamado [35,50,103], retorna ao novo participante uma lista com informação de um subconjunto aleatório de participantes da sessão de vídeo. Após receber a lista com os possíveis parceiros, o novo participante tenta realizar as parcerias. Se a parceria é aceita pelo nodo contatado, o novo participante irá adicioná-lo a sua lista de vizinhos. Depois de obter alguns vizinhos, o novo participante começa a trocar pedaços de vídeo com seus parceiros. A Figura2.4 mostra o processo inicial de cadastro no sistema e realização das parcerias iniciais.

a) Novo participantes se registra

b) Servidor retorna

um subconjunto de participantes

c) Novo participante requisita parcerias

d) Interessados estabelecem as parcerias com o novato

Figura 2.4: Atividade inicial de um novato - rede P2P baseada em malha. Para lidar com a dinâmica na rede P2P, ou seja, as frequentes chegadas e partidas dos usuários, um participante sempre se mantém atualizado sobre o estado de seus parceiros. Caso o número de conexões ou o nível de serviço caia, ele pode recorrer ao servidor centralizado para obter novas listas de possíveis parceiros. Também pode tentar achar novos parceiros enquanto troca dados e mensagens de controle.

vida (keep-live messages ou ping). Caso um vizinho não responda às mensagens de vida, um participante o remove da lista e, possivelmente, tenta obter novos parceiros para manter sua conectividade [103]. Uma parceria é estabelecida por um acordo mútuo entre os participantes. Os diferentes sistemas existentes possuem estratégias variadas para estabelecimento destes acordos. Por exemplo, o número de vizinhos que os participantes possuem, a banda de rede disponível, a dinâmica dos seus vizinhos e a qualidade percebida do fluxo de vídeo [50]. Com base nesses critérios, um participante se conecta a um novo vizinho e também procura por novas parcerias.

Em uma estrutura baseada em árvore, o fluxo de vídeo é transmitido a partir de uma fonte geradora para todos os participantes do sistema, seguindo a estrutura lógica da árvore formada. Em uma estrutura baseada em malha, não existe um fluxo contínuo transmitido nestes mesmos moldes. Nesses sistemas, a fonte do vídeo (servidor) faz a codificação e a divisão do vídeo, criando os pequenos pedaços chamados chunks. Cada chunk contém dado para um pequeno intervalo de tempo de visualização. Por exemplo, as aplicações atuais transmitem dados a uma taxa aproximada de 6 chunks por segundo de vídeo [20]. Esses chunks são numerados em uma sequência temporal, para que os participantes possam identificar e executar o vídeo correspondente de forma apropriada. Os pedaços do fluxo são disseminados a partir do servidor para diversos participantes da rede, que os disseminam para seus companheiros, e assim por diante. Como os chunks tomam diferentes caminhos para atingir os diversos pontos da rede, eles chegam a um usuário fora de ordem e, para uma execução contínua do vídeo, os participantes guardam os chunks em um armazenamento temporário de memória, onde são ordenados antes de sua apresentação. Dependendo do tipo de aplicação, o armazenamento pode variar de segundos a minutos. Em uma sessão de vídeo ao vivo, que é o período em que um fluxo de mídia é transmitido, a sequência de identificação dos chunks cresce enquanto o vídeo é disseminado.

Os dados são trocados principalmente através de duas estratégias: requisitando ou enviando (pull e push). Em um sistema do tipo mesh-push (malha e requisição), um usuário envia os dados que recebe aos seus vizinhos que provavelmente ainda não os obtiveram. Não há uma relação clara de pai-filho neste esquema e o envio dos dados é estabelecido por interações passadas entre os participantes, onde indicam quais são os dados desejados. Um participante pode estabelecer parcerias com diversos outros e, anunciar a necessidade por dados a todos estes. Por consequência, pode existir envio de dados redundantes na rede, pois mais de um dos parceiros pode responder por um pedido. Para tratar esse problema deve existir um planejamento entre os participantes do sistema, com escalonamento das transferências dos dados [103].

entre si um mapa de chunks. Este mapa tem informações dos chunks disponíveis localmente por um participante. Contém também informações sobre os dados faltantes. Ao obter os mapas de seus vizinhos, um participante decide como escalonar o pedido de chunks (e a qual vizinho enviar o pedido). As transmissões redundantes são evitadas, uma vez que os participantes solicitam chunks a um único parceiro. Porém, as frequentes trocas de mapas de chunks e mensagens por pedidos aumentam a sobrecarga do protocolo e podem introduzir novos atrasos ao sistema.

A Figura 2.5 ilustra a troca de chunks em uma aplicação com estrutura baseada em malha. Por esta figura, o nodo 2 gera seu mapa, indicando quais chunks ele tem disponível em seu armazenamento temporário. Ele troca este mapa com os participantes 1 e, como resposta, o nodo 1 envia o seu mapa. Observe que o nodo 1 possui uma lista com os diversos mapas de seus parceiros. Os pedaços de vídeo faltantes no nodo 2, e que o nodo 1 possui, serão requisitados. Finalmente, o nodo 1 responde às requisições pelo nodo 2.

a) Nodo 2 pede mapa ao seu parceiro

b) Mapa é recebido e escolha de trocas é feita

c) Nodo 2 pede transferência por chunks

d) Dados são enviados ao Nodo 2