# Gnutella

Gnutella é uma rede de compartilhamento de arquivos usada principalmente para a troca de músicas, filmes e softwares. É uma verdadeira rede peer-to-peer, ou seja, opera sem um servidor central. Os arquivos são trocados diretamente entre os usuários.
O software cliente Gnutella conecta-se à rede e compartilha arquivos. As pesquisas são passadas de um nó para o outro circularmente. Clientes Gnutella estão disponíveis em várias plataformas.
De acordo com o extinto site de compartilhamento de arquivos Sklick.com, a Gnutella é a segunda rede de troca de arquivos mais popular da Internet, perdendo apenas para a eDonkey 2000.

## História

O primeiro cliente foi desenvolvido por Justin Frankel e Tom Pepper, da Nullsoft, no início do ano 2000, logo após a aquisição da companhia pela AOL. Em 14 de março, o programa se tornou disponível para download dos servidores da Nullsoft. O evento foi prematuramente anunciado no Slashdot, e milhares de usuários baixaram o programa naquele dia. O código-fonte seria liberado mais tarde, supostamente sob licença GPL (GNU General Public License).
No dia seguinte a AOL tirou do ar a disponibilidade de download do software por causa de interesses legais e proibiu a Nullsoft de fazer quaisquer tipos de avanços no projeto. Isso não parou a Gnutella. Após alguns dias, o protocolo passou por um processo de engenharia reversa, e clones compatíveis de código aberto começaram a aparecer. Este desenvolvimento em paralelo de diferentes clientes por diferentes grupos é que mantém em operação o desenvolvimento do Gnutella hoje.
A rede Gnutella é uma alternativa completamente distribuída para sistemas semi-centralizados, como KaZaA, e sistemas centralizados, como Napster. A popularidade inicial da rede foi acelerada pela ameaça legal de morte do Napster no início de 2001. Esta onda crescente de popularidade revelou os limites de escalabilidade do protocolo inicial. No início de 2001, variações do protocolo (primeiro implementado em clientes de código proprietário) permitiram uma melhora na escalabilidade. Em vez de tratar todo usuário como cliente e servidor, alguns usuários passaram a ser tratados como "ultrapeers", direcionando requisições de busca e respostas para usuários conectados a eles.
Isto permitiu a rede a crescer em popularidade. Na segunda metade de 2001, o cliente Gnutella LimeWire tornou-se código aberto. Em fevereiro de 2002, o Morpheus, um grupo comercial de compartilhamento de arquivos, abandonou o seu software peer-to-peer baseado no FastTrack e lançou um novo cliente baseado no Gnucleus, que era um software de código aberto compatível com Gnutella.
A palavra "Gnutella" não se refere a algum projeto ou software, mas ao protocolo aberto usado por vários clientes. Já que vários desenvolvedores estão criando novos clientes, e o protocolo provavelmente continuará a evoluir, é difícil dizer o que a palavra 'Gnutella' significará no futuro.
O nome é uma fusão de Gnu e Nutella: supostamente, Frankel e Pepper comeram uma grande quantidade de Nutella enquanto trabalhavam no projeto original, e pretendiam lançar o seu programa finalizado sob licença GNU General Public License. Gnutella não está associado ao Projeto GNU.

## Como funciona

Para entender como o Gnutella funciona, imagine um grande círculo de usuários (chamados nós), onde cada um possui um cliente Gnutella. O software cliente no seu uso inicial precisa encontrar pelo menos um dos outros nós. Métodos diferentes vêm sendo usados para isto, o que pode incluir uma lista preexistente de endereços de nós possivelmente ativos enviada com o software, o uso de sites Gwebcache para encontrar nós, como também o uso de IRC para encontrar nós. As chances são de que ao menos um nó (que chamaremos de B) irá funcionar. Uma vez conectado, o nó B enviará ao nó A sua própria lista de nós ativos. O nó A tentará se conectar aos nós de sua lista, assim como aos nós das listas que recebe de outros nós, até alcançar uma certa cota, normalmente classificável por usuário. Se conectará apenas a esses nós, mantendo os nós que ainda não foram tentados e descartando os nós que foram tentados mas não funcionaram.
Agora, quando o usuário A quer fazer uma busca, ele envia o pedido para cada um dos nós aos quais ele está ativamente conectado. É possível que alguns deles não esteja mais funcionando. Nesse caso o usuário A tentará se conectar aos nós que ele salvou como backup. O número de nós ativamente conectados para o usuário A é normalmente bem pequeno (em torno de 5), então cada nó reenvia o pedido para todos os outros nós aos quais estão conectados. Estes, por sua vez, repassam o pedido e assim por diante. Teoricamente, o pedido irá alcançar todos os usuários da rede Gnutella. Como o tamanho da rede Gnutella tem crescido e seus desenvolvedores têm lutado contra o excesso de tráfego, o tempo de procura global da rede tem se depreciado.
Se um pedido de busca retornar um resultado, o nó que obteve o resultado contata o que fez a busca direta ou indiretamente. Se o nó que enviou o pedido de busca não estiver por trás de um Firewall, o nó com o resultado retorna o resultado diretamente. Se o nó que enviou o pedido de busca estiver por trás de um firewall (muitos estão), então o resultado é (indiretamente) direcionado. Depois que o resultado é retornado, eles negociam a transferência do arquivo e os procedimentos de transferência. Se mais de uma cópia do mesmo arquivo for encontrada, o buscador pode realizar um download em grupo. Partes do arquivo são baixadas de nós diferentes a la BitTorrent. O resultado são altas taxas de transferência.
Finalmente, quando o usuário A desconecta, o software cliente salva a lista de nós aos quais ele estava conectado e a que estava mantendo como backup para usar da próxima vez que se conectar.
Na prática, uma procura na rede Gnutella é frequentemente pouco confiável. Cada nó é um usuário de computador, portanto eles estão constantemente conectando-se e desconectando-se, o que faz com que a rede nunca fique completamente estável. Como o tamanho da banda de cada usuário é limitada, alguns pedidos de busca podem ser interrompidos antes de alcançarem toda a rede. Como resultado, a maioria das buscas nunca alcançarão mais de 50% da rede.
O real benefício de se ter a Gnutella tão descentralizada é fazer com que seja muito difícil da rede cair. Diferente do Napster, onde a rede inteira depende de um servidor central, a rede Gnutella não cai ao se desligar qualquer um dos nós. Como é preciso ter pelo menos dois usuários, a Gnutella continuará existindo.

## Características do protocolo e extensões

Gnutella opera em um protocolo de fluxos de pedidos. A versão ultrapassada 0.4 de Gnutella emprega cinco tipos de pacotes diferentes, chamados:
* ping: descobre servidores na rede
* pong: responde a ping
* query: procura por um arquivo
* query hit: responde a query
* push: solicitação de download para um nó situado atrás de um firewall
Eles estão principalmente interessados na busca da rede Gnutella. As transferências de arquivos são feitas usando HTTP.
O desenvolvimento do protocolo Gnutella é atualmente liderado pelo GDF (Gnutella Developer Forum). Muitas extensões de protocolo foram e estão sendo desenvolvidas pelos fornecedores de software e pelos desenvolvedores Gnutella do GDF. Essas extensões incluem direcionamento inteligente de requisições, controle SHA-1, query hit transmission via UDP, requisições via UDP, requisições dinâmicas via TCP, transferência de arquivos via UDP, meta dados XML, troca de fontes e download pararelo em pedaços.
Existem esforços para finalizar essas extensões de protocolo na especificação Gnutella 0.6 no site de desenvolvimento do protocolo Gnutella. O padrão Gnutella 0.4, apesar de ainda ser a última especificação do protocolo já que todas as extensões só existem como propostas, está desatualizado. De fato, vai de difícil a impossível conectar hoje com o padrão 0.4.
O protocolo Gnutella continua em desenvolvimento e ainda existem tentativas de fazer uma limpeza na complexidade herdada do Gnutella 0.4 e criar uma arquitetura nova e limpa (tal como Gnutella2). Apesar disso, ainda é um dos protocolos de compartilhamento de arquivos de maior sucesso até hoje.

## Software

| Nome | Plataforma | Licença |
| Acquisition | Mac OS X | software proprietário |
| Acqlite | Mac OS X | GNU GPL |
| AlterGalaxy | Microsoft Windows | freeware |
| Apollon (GUI) | Unix-like/KDE | GNU GPL |
| BearShare | Microsoft Windows | software proprietário |
| Cabos | Java | GNU GPL |
| CocoGnut | RISC OS | freeware |
| DM2 | Microsoft Windows | freeware |
| FrostWire | Java | GNU GPL |
| giFT | Unix-like, Microsoft Windows, Mac OS X, AmigaOS | GNU GPL |
| Gnucleus | Microsoft Windows | GNU GPL, GNU LGPL |
| Gtk-gnutella | Unix-like | GNU GPL |
| Gluz | Java | software proprietário |
| iMesh | Microsoft Windows | software proprietário |
| KCeasy | Microsoft Windows | GNU GPL |
| Kiwi Alpha | Microsoft Windows | software proprietário |
| LimeWire | Java | GNU GPL |
| MLdonkey | Unix-like, Microsoft Windows, Mac OS X, MorphOS | GNU GPL |
| Morpheus | Microsoft Windows | software proprietário |
| Mutella | Unix-like | GNU GPL |
| Phex | Java | GNU GPL |
| Poisoned | Mac OS X | GNU GPL |
| Qtella | Unix-like | GNU GPL |
| Shareaza | Microsoft Windows | GNU GPL |
| Swapper.NET | Microsoft Windows | software proprietário |
| Symella | SymbianOS | GNU GPL |
| XFactor | Mac OS X | Código aberto |
| XNap | Java | GNU GPL |
| XoloX | Microsoft Windows | software proprietário |