# Gnutella2

Gnutella2 é uma das redes utilizadas em alguns programas de compartilhamento de arquivos.
O protocolo peer-to-peer Gnutella2 é uma reformulação do protocolo Gnutella, escrito principalmente por Michael Stokes (criador do Shareaza). Do protocolo original Gnutella, Stokes só manteve o handshake de conexão e adotou um algoritmo de pesquisa inteiramente novo. A Gnutella2 é frequentemente abreviada para G2.

## Como ele funciona

A Gnutella2 divide nós em dois grupos: folhas (leaves) e concentradores (hubs). As folhas mantêm uma ou duas conexões com os concentradores, os concetradores aceitam milhares de folhas e muitas conexões de outros concentradores. Quando uma pesquisa é iniciada, o nó obtem uma lista de concentradores se necessário, e contacta todos os concentradores da lista até o fim da lista ou se atingir um limite definido na consulta. Isso permite um usuário encontrar um arquivo desejado facilmente sem sobrecarregar a rede, enquanto teoricamente mantém a habilidade do usuário pesquisar um único arquivo localizado em qualquer lugar da rede.
Os concentradores indexam os arquivos que chegam das folhas na Tabela de Roteamento de Pesquisa, a qual é preenchida com entradas de bit do tipo hashes de palavras-chaves, que são recombinadas com as tabelas enviadas pelas folhas e cria uma nova versão da tabela a ser enviada aos concentradores próximos. Isso permite os concentradores reduzir a uso da banda enormemente simplesmente não encaminhando consultas às folhas e concentradores próximos se as entradas que atendem à consulta atual não são encontradas nas tabelas de roteamento.
A Gnutella2 usa extensivamente o UDP, no lugar do TCP, durante as pesquisas. A sobrecarga imposta pelo TCP faria o sistema de consulta se tornar improdutivo.

## Diferenças entre Gnutella2 e Gnutella

No geral, as duas redes são razoavelmente similares, com as diferenças preliminares se dando no formato do pacote e na metodologia da busca. O formato do pacote de Gnutella sempre foi criticado por, originalmente, não ter sido projetado com extensibilidade em mente, e através dos anos sofreu muitas adiçôes, deixando a estrutura do pacote desordenada e ineficiente. A Gnutella2 partiu daqui e, ao contrário da Gnutella, já embutia no seu projeto inicial a tão desejada extensibilidade futura.
A outra diferença principal é o algoritmo da busca. Enquanto a Gnutella usa o método de consulta por inundação query flooding, a Gnutella2 usa um sistema da caminhada onde o nó de pesquisa recolhe uma lista dos hubs e os contata diretamente, um por vez. Isto traz diversas vantagens sobre a consulta no Gnutella de inundação da rede. A Gnutella2 é mais eficiente, tanto que continuar uma busca não aumenta o tráfego da rede exponencialmente, as consultas não são roteadas entre tantos nós, e isso aumenta a granularidade da busca, permitindo que um cliente parar uma vez que um condição pré-definida de resultados foi obtido mais eficazmente do que em Gnutella. Isso também aumenta a complexidade e manutenção das redes requeridas, como também requer proteções para impedir que um atacante malicioso use a rede para ataque de negação de serviço.
Há também uma diferença na terminologia usada diferentemente para os nós mais capazes e que são usados para condensar a rede que está sendo consultada, Ultrapeer em Gnutella e Hub em Gnutella2. Eles também são usados diferentemente na topologia. Em Gnutella, o Ultrapeers mantém geralmente um número relativamente pequeno das folhas e um número elevado de conexões do par, quando os Hubs Gnutella2 mantiverem distante mais folhas, e de poucas conexões do par. A razão para esta é que os métodos da busca das várias redes têm topologias das mais diferentes.

## Clientes

Alguns clientes que implementam o protocolo Gnutella2:
* Shareaza (Windows), Open source C++ under the GPL.
* Kiwi Alpha (Windows), Closed source.
* Morpheus (Windows), Closed source.
* Gnucleus (Windows), Open source core in C/C++ under the LGPL.
* Adagio (Cross Platform), Open source Ada under the GPL.
* Pocket G2 (Windows Pocket PC), Closed Source.
* FileScope (Cross Platform), Open source C# under the GPL.
* iMesh (Windows), Closed source.
* MLDonkey (Cross Platform), Open source Ocaml under the GPL.
* TrustyFiles (Windows), Closed source.
* LimeWire (Cross Platform), Open source Java under the GPL.