Diferente de uma rede cliente-servidor, onde há a uma centralização no partilhamento de dados, a rede P2P é caracterizada pela descentralização. Na primeira, um servidor possui um banco de dados contendo todos os arquivos a serem compartilhados. Ele recebe os pedidos dos usuários (clientes) e decide se disponibilizará ou não o acesso ao pedido. Já na rede ponto a ponto, a arquitetura é feita de forma com que cada ponto da rede seja um cliente e um servidor simultaneamente.
Overlay
Um sistema P2P pode ser representado como sendo uma camada abstrata sobre a rede física da Internet, denominada rede overlay. Esta rede, por sua vez, pode ser representada por um grafo onde os nós representam os terminais e as arestas, a conexão entre os mesmos.
Logo, baseado neste tipo de rede overlay, podemos definir dois tipos de P2P: as redes não estruturadas, utilizam, em geral, algoritmos de busca baseados em técnicas de inundação e não apresentam boa escalabilidade; as estruturadas possuem uma topologia e organização, onde os dados são armazenados em localizações específicas, o que torna as buscas mais simples, e tipicamente, utiliza-se um esquema DHT (Distributed Hash Table).
Redes Não-Estruturadas
As redes P2P classificadas como redes não-estruturadas possuem suas estruturas de conexão e organização dos nós de maneira praticamente aleatória. Isto significa que quando algum usuário novo entra em uma rede já formada, não existe uma posição pré-determinada para ele. Como não há nenhum indício de organização, estas redes podem ficar desbalanceadas, pois nós podem se conectar concentradamente entre um pequeno grupo de outros nós, de acordo com uma dada Lei de Potência, tornando-se com isso mais difícil de encontrar o objeto dentro da rede.
Porém, redes não-estruturadas são mais simples de serem implementadas e o controle de buscas também é fácil de ser feito. Além disso, arquivos muito grandes como vídeos, programas e outros, possuem uma difusão bem acentuada, visto que algoritmos de organização e replicação poderiam tornar o tempo e os recursos de processamento maiores. Em contrapartida, como todos os usuários estão em uma organização aleatória, quando se quer fazer uma busca, por exemplo, deve-se recorrer à toda rede, pois não há uma escalabilidade nos mecanismos de busca, o que faz com que ocorra muitas vezes uma inundação na rede.
![](figs/topologiacentralizada.jpg)
Este tipo de redes é subdividido dentre os seguintes casos:
Centralizada:
Neste caso, existe um servidor que funciona como gerenciador de tarefas, consulta e conexão. Não há trocas de dados entre o nó e o servidor, apenas um fornecimento por parte do primeiro de sua lista de arquivos, que será indexada pelo servidor. Então, quando outro nó fizer sua pesquisa, ele consulta ao servidor sobre a informação da localização do dado procurado. A partir daí restará ao nó entrar em contato diretamente com o alvo (Fig. 1).
A vulnerabilidade dessa estrutura é que ela ainda depende de uma central. Portanto, uma falha no servidor poderá comprometer toda a rede (Single Point of Failure). Devido a esta vulnerabilidade, em casos de acusação de compartilhamento ilegal o sistema pode ser facilmente interrompido, simplesmente fechando-se o servidor central. O responsável pelo servidor é também responsável por tudo aquilo que estiver em fluxo, sofrendo processos como por exemplo de violação de direitos autorais. Um exemplo de uma rede deste tipo fechada por este motivo foi o Napster.
Parcialmente Centralizada:
Aqui entra o conceito de supernós. Ele consiste no fato de que alguns nós terão funções como as do servidor centralizado P2P. Há então, uma clara formação de hierarquia entre os nós. Como o trabalho do antigo servidor agora é dividido, há também uma maior escalabilidade. Quando solicitado, um supernó busca em sua base e nas de nós adjacentes se alguém possui o arquivo (Fig. 2). Esta estrutura possui uma menor vulnerabilidade, já que há uma maior descentralização no compartilhamento dos arquivos. Apesar disso, há uma possibilidade de um ataque de negação de serviços focando nos supernós, apesar de ser complicado atacar todos eles simultaneamente. Um exemplo de um sistema que se baseia nessa topologia é o Kazaa.
![](figs/topologiaparcialmentecentralizada.jpg)
Descentralizada:
Nestes casos existe uma lista de servidores (hosts) e qualquer pessoa pode colocar no ar um deles para fazer a inicialização da rede. Apesar das autoridades já terem inutilizados alguns deles que eram notórios na rede, outros surgem muito facilmente e rapidamente.
Os servidores se comunicam entre si, garantindo que todos os usuários tenham acesso a todos os arquivos. Qualquer consulta de um nó é requisitada a todos seus vizinhos, que requisitam aos seus vizinhos (exceto àquele de onde veio a mensagem), e assim sucessivamente (Fig. 3).
Para tal objetivo acontecerá uma inundação da rede e para isto utiliza-se comumente o algoritmo TTL (Time To Live). Essa topologia possui uma vulnerabilidade ainda menor do que a parcialmente centralizada, porém se o TTL for muito grande, inunda demais a rede, assim como se for muito pequeno e os nós extremos muito distantes, as requisições podem não alcançar o destino.
Devido à grande quantidade de informação em fluxo nessa estrutura, percebe-se uma necessidade de armazenamento de pedidos para que mensagens repetidas por conexões separadas sejam encaminhadas uma única vez, evitando loops e desperdícios de rede.
![](figs/topologiadescentralizada.jpg)
Redes Estruturadas
Nas redes estruturadas há um nível de organização muito grande. Elas são baseadas em diferentes funções hash, onde cada nó fica responsável por um subconjunto do total de chaves. Entretanto, consultas mais complexas, como graus de relevância na pesquisa não são permitidas, pois os armazenamentos e consultas são feitos através das chaves e através do conteúdo. Com isso, dados similares podem estar em lugares totalmente diferentes.
Diferentemente das redes não-estruturadas, neste modelo um novo nó na rede tem um lugar de conexão no grafo de nós determinado por um algoritmo bootstrap. O estágio de alta descentralização em seu funcionamento faz com que não existam divisões da arquitetura. Isto significa que a diferenciação fica destinada à função hash utilizada. De maneira mais voltada ao P2P, temos o DHT (Distributed Hash Table) cujos conceitos gerais são:
- Objetivo: obter e alocar informações de maneira descentralizada, escalável, balanceada e de excelente performance.
- Detalhe:o que são guardadas são pares de chave-valor. As chaves controlam quais nós guardam os valores, e cada nó é responsável por uma seção do espaço.
- Operações Básicas: Guardar(Chave,Valor) e Valor=Recupera(Chave)
- Informações:Aqui, todos os nós trocam informações entre si sobre todos os arquivos possíveis, ou seja, para qualquer comunicação, basta rastrear qualquer outro usuário conectado à rede. Além disso, enquanto um rastreador estiver ativo, mesmo para um Torrent (no caso do BitTorrent, por exemplo) legal, todos os outros Torrents, mesmo os ilegais, poderão continuar funcionando por meio do DHT, pois um único rastreador já é suficiente para descobrir outros membros online e começar a busca e compartilhamento.
![](figs/chord.png)
Como exemplo de uma rede P2P Estruturada, temos a Chord (Fig. 4). Aqui, o mapeamento idealizado é da forma de um anel ao qual todos os nós fazem parte e cuja posição nele é determinado por uma DHT, quando este nó entra na rede. Para organizar e melhorar o desempenho do roteamento das informações, foi criada uma “Finger Table”, uma tabela formada por ponteiros que indicam onde estão os nós e os seus sucessores em ponto na rede. Isso otimiza o esquema, pois as mensagens não precisam passar por todos os nós procurando, agora pode pular de forma mais direta quando se encontra com o objetivo.
Para posicionamento e requisições, o processo é bem similar. Necessitasse, quando um usuário é novo, cria-se uma chave através da função hash, a qual indicará quem é o indivíduo. Quando ele faz algum pedido a chave ao qual o objeto está ligado indica sua posição.