as funcoes necessarias devem estar em todos os processos que constituem o sistema distribuido. Como consequencia, a maior parte da interacao entre os processos e simetrica: cada processo atua como um "cliente" e um "servidor" ao mesmo tempo.[2]CaracteristicasSistemas peer-to-peer compartilham essas caracteristicas:O seu design garante que cada usuario contribui com recursos para o sistema. Apesar de que eles podem diferir nos recursos que contribuem, todos os nodos em um sistema peer-to-peer possuem as mesmas capacidades funcionais e responsabilidades. DescentralizacaoA correta operacao de sistemas P2P nao depende da existencia de um sistema de administracao centralizado. Assim, sistemas P2P se confudem com sistemas descentralizados. Num sistema totalmente descentralizado, nao so todos os hospedeiros sao iguais, mas tambem nao ha hospedeiros com atribuicoes especiais, como administracao e descoberta de servicos. Na pratica, construir sistemas totalmente descentralizados pode se tornar dificil, o que faz os projetistas geralmente adotarem paradigmas hibridos na construcao de aplicacoes P2P. O DNS por exemplo, e um protocolo peer-to-peer, porem com um senso embutido de hierarquia. Ha outros exemplos de sistemas P2P no seu nucleo e com alguma organizacao semi-centralizada, como o Napster[3] e BitTorrent[4]HeterogeneidadeEm redes peer-to-peer, a heterogeneidade dos recursos envolvidos e uma preocupacao que deve ser levada em conta durante o seu projeto. Computadores e conexoes administrados por diferentes usuarios e organizacoes nao tem garantias de ficarem ligados, conectados ou sem falhas, o que os torna necessariamente recursos volateis. Isso torna a disponibilidade dos nodos de uma rede peer-to-peer imprevisivel. Essa imprevisibilidade nao permite garantir acesso a recursos individuais, ja que eles podem falhar. Para contornar isso, e possivel lancar mao da tecnica de replicacao, diminuindo consideravelmente a probabilidade de falha ao acessar um objeto replicado. A replicacao pode tambem tornar o sistema mais confiavel se utilizada para neutralizar a acao de nodos maliciosos, que interceptam o sistema e corrompem os dados, atraves de tecnicas de tolerancia a falhas bizantinas.Sistemas HibridosOs sistemas centralizados sao simples de implementar e gerenciar, entretanto sao um gargalo em potencial, uma vez que o servidor central tem capacidade limitada e pode nao suportar o aumento da demanda. Por outro lado, os sistemas descentralizados sao escalaveis e robustos, mas isso demanda certa complexidade de implementacao, principalmente nas questoes de tolerancia a falhas e descoberta de recursos. Muitos sistemas distribuidos combinam caracteristicas das duas arquiteturas, parte do sistema no tradicional modelo cliente-servidor e outra parte peer-to-peer.Estruturas hibridas sao implantadas notavelmente em sistemas distribuidos colaborativos. A principal preocupacao em muitos desses sistemas e como se juntar ao sistema, para o qual muitas vezes um esquema tradicional cliente-servidor e adotado. Uma vez que o nodo se junta ao sistema, ele pode utilizar um esquema totalmente descentralizado para colaboracao. Um exemplo de servidor que utiliza essa abordagem e o BitTorrent.[4]Para um usuario de um servico de comunicacao instantanea, a aplicacao parece peer-to-peer ao enviar os dados diretamente ao amigo sendo contactado. Mas todos os servicos de comunicacao instantanea possuem uma especie de servidor por tras que facilita a comunicacao entre os nodos. Por exemplo, o servidor mantem uma associacao entre o nome do usuario e o seu endereco IP, grava