- Gnutella está mais para um protocolo de compartilhamento de arquivos esquecido, mas foi um caso real em que milhões de usuários, sem qualquer preocupação consciente com tecnologia descentralizada, resolveram o problema de baixar MP3
- Em 2000–2001, a penetração da internet nos EUA chegou a 50%, os tocadores de MP3 ficaram mais baratos, o streaming ainda tinha limitações e a cultura de gerenciar arquivos diretamente impulsionou a adoção
- Graças à arquitetura sem servidor e à ausência de ponto único de falha, mesmo depois do cancelamento pela AOL ficou difícil reverter a situação, e ele continuou funcionando por anos apesar das tentativas de interrupção
- A estrutura básica é a combinação de transferência de arquivos via HTTP com um protocolo de fofoca TCP, em que PING/PONG, QUERY/QUERYHIT e PUSH cuidam de busca, resposta e contorno de firewall
- O motivo de ter desaparecido do mainstream não foi um fracasso técnico imediato, mas o desaparecimento do ambiente do usuário daquela época; a rede continua viva em escala reduzida
Por que o Gnutella sobreviveu por tanto tempo
- Gnutella é um protocolo de compartilhamento de arquivos que muita gente esqueceu, mas foi um caso em que milhões de usuários comuns, sem querer entender tecnologia descentralizada, o usaram para resolver um problema real
- Os usuários participavam da rede Gnutella não por motivos como valorização de tokens, mas por causa de downloads de MP3; a rede cresceu de forma explosiva, depois entrou em um período estável de quase 10 anos e, mais tarde, manteve uma longa cauda com uso reduzido
- O Gnutella era uma tecnologia subjacente escondida por trás de projetos mais visíveis como o LimeWire, e o modelo de jardim murado das plataformas modernas fez com que muitos usuários da internet nem se lembrassem mais do próprio sistema de arquivos
- O projeto Gnutella começou quando uma demo interna cancelada pela AOL vazou publicamente e, por causa do design descentralizado sem servidores, depois de publicado ficou difícil voltar atrás
- O Gnutella continuou funcionando por anos apesar das tentativas de desligá-lo, e cópias do
Gnutella.exe original ainda podem ser encontradas no archive.org
- É difícil tratá-lo como um protocolo fracassado por motivos claros
- Escalou até milhões de usuários ativos simultaneamente e prosperou por cerca de 10 anos como caso de uso mainstream
- O motivo de ter desaparecido do mainstream não foi uma falha imediata do protocolo em si, mas o desaparecimento do ambiente do usuário em que o Gnutella nasceu
- Ele continua funcionando até hoje, embora em escala reduzida
Condições históricas que levaram à adoção
- Por volta de 2000–2001, a penetração da internet entre consumidores nos EUA chegou a 50%, e a internet estava deixando de ser uma ferramenta de entusiastas para virar infraestrutura do dia a dia
- Várias condições atuaram ao mesmo tempo para tornar comum o compartilhamento de arquivos de música
- A indústria musical não conseguiu se adaptar às mudanças nas preferências dos consumidores
- Tocadores de MP3 e armazenamento em estado sólido ficaram baratos e amplamente difundidos
- Em conexões discadas lentas, streaming de música não era algo viável
- Gerenciar diretamente espaço em disco, diretórios, backups e arquivos baixados ainda era aceitável até para usuários comuns de computador naquela época
- Essas condições criaram a era de ouro do compartilhamento de arquivos, que durou até o início dos anos 2010, e o LimeWire acabou virando o nome mais representativo daquela experiência
- O Gnutella era difícil de matar porque não tinha ponto único de falha, e o protocolo básico era simples, mas podia ser expandido com facilidade graças às extensões opcionais incluídas na especificação
A natureza básica do protocolo
- Para a maioria dos usuários, o Gnutella era uma ferramenta de transferência de arquivos, mas em sua essência era mais parecido com um mecanismo de busca P2P de blobs
- Em princípio, poderia ser usado para algo como DNS simplificado, tabela global de consulta de metadados chave/valor ou serviço de matchmaking de ligas de Unreal Tournament, mas na prática histórica ele ficou associado a baixar arquivos que correspondiam a uma busca, especialmente MP3
- O rascunho da especificação Gnutella 0.6 afirma que os recursos compartilhados poderiam ser qualquer coisa: mapeamentos para outros recursos, chaves criptográficas, arquivos de qualquer formato ou metadados de recursos identificáveis por chave
- O fluxo de uso típico era o seguinte
- Executar um cliente Gnutella como LimeWire, BearShare ou GTK-Gnutella
- O cliente se conectava a alguns peers em algum lugar da internet
- O usuário digitava uma consulta como
LinkinPark.mp3.exe
- A consulta se espalhava de peer para peer em direção às bordas da rede
- Os resultados iam voltando lentamente de computadores aleatórios ao redor do mundo
- O usuário olhava os nomes dos arquivos, tentava adivinhar se eram falsos, comparava a velocidade das conexões e torcia para não haver vírus
- Ao escolher um arquivo, o cliente baixava diretamente os pedaços via HTTP do computador do outro usuário
- Ao receber arquivos errados, o usuário podia acabar descobrindo conteúdo novo por acaso ou pegando malware, e esse comportamento de coleta exploratória desapareceu com a ascensão dos mecanismos de recomendação
- Os clientes normalmente ofereciam quatro funções principais
- Gerenciador de consultas: lidava com buscas que se espalhavam lentamente por milhares de peers
- Gerenciador de arquivos: definia diretórios ou caminhos a compartilhar e onde salvar os downloads
- Gerenciador de transferência: cuidava de retomada, divisão e gerenciamento de transferências de arquivos em ambas as direções
- Recursos adicionais: incluíam chat via IRC, fóruns, monitor de consultas de busca e exploração de hosts específicos, embora muitos deles não fizessem parte do protocolo em si
- Havia líderes de mercado no ecossistema Gnutella, como o LimeWire, mas vários clientes coexistiam, e desenvolvedores independentes também podiam escrever clientes do zero
- Durante a implementação do Gnutella Bun Client, ficou claro que havia muitos comportamentos fora da especificação, recursos não documentados e funcionalidades espalhadas em especificações adicionais, mostrando que o protocolo evoluiu de forma orgânica
A combinação de HTTP com protocolo de fofoca
- Pode parecer que basta rodar um servidor HTTP em um computador pessoal e divulgar o endereço IP para compartilhar arquivos, mas hoje é difícil expor portas TCP de entrada por causa de NAT, firewalls e políticas de ISPs residenciais
- Há 20 anos, era bem mais comum do que hoje conseguir rodar um pequeno servidor HTTP na máquina local e expô-lo com um IP público
- O Gnutella aproveitou esse ambiente para permitir que cada participante hospedasse arquivos dentro de uma malha de peers que trocavam mensagens entre si
- A etapa de transferência ao baixar um arquivo no LimeWire era parecida com receber um arquivo usando
curl ou wget
- Mas só um servidor HTTP não basta para formar uma rede P2P de compartilhamento de arquivos
- Mesmo naquela época, muitos ISPs não forneciam IP estático confiável
- O endereço IP compartilhado hoje podia mudar amanhã
- Uma URL aleatória como
http://74.6.231.21:4000 provavelmente não seria indexada por mecanismos de busca e sairia do ar quando o notebook fosse fechado
- Por isso, os clientes Gnutella executavam, junto com o servidor HTTP, um protocolo de fofoca baseado em TCP
- Eles anunciavam sua presença dentro da malha de peers que expunham diretórios compartilhados via HTTP para outros participantes do Gnutella
- Informações como endereços de peers, largura de banda, latência e consultas de busca circulavam pela malha
- Havia ferramentas para lidar com firewalls, mas extensões posteriores seriam necessárias para resolver os problemas modernos de NAT
- Os papéis básicos de um nó Gnutella eram três
- Transferir arquivos para quem quisesse usando um servidor HTTP local
- Buscar e anunciar arquivos disponíveis por meio de mensagens de fofoca
- Em alguns casos, usar técnicas para contornar firewalls
- Como o Gnutella não tinha ponto central de entrada nem registro de usuários, depois de entrar na malha o participante começava a descobrir novos peers, consultas de busca de entrada e outros tipos de tráfego da rede
Bootstrapping
- Bootstrapping é o processo de encontrar alguns peers iniciais para entrar pela primeira vez em uma malha P2P sem convite e sem porta da frente
- A rede global do Gnutella é um conjunto misto de endereços IP de participantes, e basta se conectar a um único peer confiável ligado à rede principal para começar a enxergar o tráfego de rede de um grande conjunto de usuários
- Com o tempo, mais peers são descobertos por meio de mensagens PONG, e essa lista é salva em disco para futuras reconexões
- Como endereços IP mudam e participantes podem ficar offline, a lista salva acaba falhando parcialmente com o tempo, e o cliente vai tentando os endereços até encontrar peers válidos
- Ao entrar na rede pela primeira vez ou voltar depois de muito tempo desconectado, a lista salva pode não ser suficiente, então é preciso fazer bootstrapping
- O método mais comum é o Gnutella Web Cache (GWebCache)
- Trata-se de uma federação de servidores web independentes mantidos por voluntários, geralmente pequenas aplicações web em CGI ou PHP
- Eles registram endereços IP de participantes do Gnutella que forneceram suas informações voluntariamente
- Também registram IPs ou domínios de outros servidores GWebCache, para o caso de o servidor atual sair do ar
- Fornecem uma lista de servidores GWebCache alternativos
- Fornecem uma lista de endereços IP de participantes atualmente conhecidos na rede Gnutella
- Alguns clientes Gnutella acessam esses servidores de cache automaticamente, enquanto outros exigem copiar os IPs para um arquivo de configuração ou menu de preferências
- Depois de se conectar aos peers iniciais, o cliente passa a coletar mais peers indiretamente pelas próprias mensagens da rede, reduzindo a dependência do cache
- O GWebCache não é um gargalo central
- Existem vários servidores GWebCache sem relação entre si
- Também há várias formas de inicializar um cliente Gnutella sem GWebCache
- Mesmo sem GWebCache, o Gnutella pode sobreviver de forma menos conveniente
- Um exemplo de solicitação de lista de bootstrap é o seguinte
- Adicionando
?get=1&client=TEST&version=1 ao fim da URL, é possível obter uma lista, embora muitas requisições levem rapidamente a limitação de taxa
http://cache.jayl.de/g2/gwc.php
http://gweb.4octets.co.uk/skulls.php
http://midian.jayl.de/g2/bazooka.php
http://p2p.findclan.net/skulls.php
http://skulls.gwc.dyslexicfish.net/skulls.php
- Um exemplo de saída é o seguinte
H|106.107.193.27:23459|88579
H|182.233.59.26:23464|88581
U|http://bj.ddns.net/skulls/skulls.php|208999
U|http://scissors.gwc.dyslexicfish.net:3709/|341201
- Entradas que começam com
H são peers, e entradas que começam com U são servidores de cache redundantes para uso posterior
Tipos de mensagem principais
- O Gnutella é um protocolo baseado em TCP e, ao se conectar a um peer que aceita conexões de entrada, primeiro acontece um handshake
- O cliente envia
GNUTELLA CONNECT/0.4 ou GNUTELLA CONNECT/0.6; se a outra ponta responder positivamente, a conexão é estabelecida e mensagens binárias do Gnutella começam a circular
- Toda mensagem binária começa com um cabeçalho de 23 bytes
- O cabeçalho inclui ID da mensagem, tipo de payload, TTL, número de hops e comprimento do payload
- TTL é a vida restante da mensagem, e hops é a distância que ela já percorreu
TTL + Hops representa o alcance originalmente pretendido da mensagem
- Na prática, existem cinco tipos de mensagem centrais
- PING: descobre peers ativos, payload type
0x00
- PONG: responde a PING com endereço IP, porta e estatísticas de compartilhamento, payload type
0x01
- QUERY: pedido de busca iniciado pelo usuário ou por peers próximos, payload type
0x80
- QUERYHIT: resposta positiva a QUERY, contendo registros de resultados e informações de conexão para download, payload type
0x81
- PUSH: mecanismo de contorno para uploaders atrás de firewall, pedindo ao detentor do arquivo que se reconecte ao downloader, payload type
0x40
- Também existe a mensagem
BYE, mas ela não é estritamente obrigatória
- As mensagens do protocolo suportam campos de dados de extensão, permitindo que clientes adicionem recursos sem quebrar a rede inteira
- O GTK-Gnutella suporta recursos como TLS, IPv6 e UDP, que não existiam no pequeno protocolo central original
Extensões do protocolo
- Pode até ser possível criar um cliente Gnutella funcional implementando apenas os cinco tipos de mensagem, mas a especificação tem quase 30 anos e o ecossistema não ficou parado
- O Gnutella deixou espaço para encaixar ideias novas em pacotes antigos
- GGEP (Gnutella Generic Extension Protocol) oferece um espaço genérico para inserir dados de extensão em mensagens comuns
- HUGE (Hash/URN Gnutella Extensions) permite que clientes identifiquem arquivos por hash SHA, em vez de depender apenas do nome do arquivo
- Há relatos de suporte a payloads de extensão em XML, mas a especificação os trata no passado e eles não foram observados no tráfego de rede moderno
- O design original era pequeno, mas tinha flexibilidade suficiente para continuar crescendo
Como funcionam busca e transferência
- As mensagens PING/PONG funcionam como batimentos cardíacos entre nós
- PING não exige payload além do cabeçalho padrão de 23 bytes, mas pode incluir dados opcionais de extensão GGEP
- PONG carrega a porta, o endereço IPv4, o número de arquivos compartilhados e a quantidade de kilobytes compartilhados do servent que respondeu
- Os nós coletam as informações de IP/porta anexadas aos PONGs para se tornarem membros mais bem conectados da malha e guardam essas informações para sessões futuras
- QUERY/QUERYHIT funcionam de forma parecida com PING/PONG, mas transportam tráfego de busca em vez de anúncios de peers
- QUERY carrega um campo de velocidade mínima, isto é, largura de banda de transferência, seguido por uma string de busca terminada em NUL
- Exemplo:
beethoven.mp3
- A mensagem QUERY se espalha em inundação para fora a partir do emissor, e QUERYHIT volta na direção dele quando há resultados
- QUERYHIT inclui endereço IP, porta, velocidade e conjunto de resultados do respondente
- Cada resultado inclui índice do arquivo, tamanho do arquivo, nome do arquivo e metadados ou extensões opcionais
- O índice do arquivo é usado depois para solicitar o arquivo via HTTP
- Por causa da natureza de roteamento por inundação do Gnutella, os resultados chegavam devagar e às vezes levavam minutos para se completar
- Engenheiros do LimeWire criaram o roteamento dinâmico de consultas para lidar com isso de forma mais escalável
- Usando filtros de Bloom e topologias de rede inteligentes
- Essa arquitetura avançada permitiu escalar para milhões de usuários sem os problemas do roteamento por inundação
- Até hoje, a maioria dos clientes mainstream implementa esse sistema
PUSH e firewalls
- A mensagem PUSH é um mecanismo de contorno que ajuda alguns servidores HTTP a escapar de firewalls, mas não resolve todos os casos
- Em vez do cliente se conectar ao servidor como no HTTP comum, a lógica é mais próxima de pedir ao servidor que se conecte de volta ao cliente
- A mensagem PUSH carrega o identificador do servent e outros identificadores necessários para que o uploader encontre o downloader
- Como o cliente não consegue se conectar diretamente, ele pede ao outro lado que se reconecte e envie o arquivo
- Mais detalhes podem ser encontrados na especificação do Gnutella
- Clientes modernos usam técnicas adicionais e extensões via UDP para lidar com esse problema de forma mais natural
Significado remanescente e materiais de referência
- O Gnutella escalou para milhões de usuários simultâneos, evitou bloqueios e permaneceu online por décadas sem ajuda externa graças a um bom design inicial
- O fato de não ter sido uma rede que colapsou assim que chegou tráfego real, mas sim uma rede que fazia parte da cultura Y2K e ainda não desapareceu, mostra a robustez do seu design
- A conclusão fica próxima de que o verdadeiro motivo de o Gnutella ter se apagado foi ter sobrevivido mais do que o mundo que o criou
- A própria rede sobreviveu por mais tempo do que os sites que hospedavam materiais sobre o protocolo
-
Links de referência
1 comentários
Opiniões no Lobste.rs
Lembro que o Gnutella facilitava baixar muitos arquivos que batiam com a busca, geralmente MP3, mas também tinha “outra coisa”
É bom pela nostalgia, e é uma pena que a web de hoje tenha virado um monstro
Nos dormitórios universitários de meados dos anos 2000, a rede era plana, e o iTunes era muito popular, compartilhando música com qualquer pessoa da rede
Em uma semana, enchi meu novo notebook HP de 64 bits comprado na Circuit City com Evanescence e Green Day, e senti que o Columbia House CD Club não era mais necessário
Alguns anos depois de eu me formar, alguém comentou isso na frente da pessoa errada, a TI ficou oficialmente sabendo, e no fim tiveram de encerrar tudo
Mais tarde percebi que não queria dizer uma “rede plana” de nós de compartilhamento de arquivos construída sobre a rede da universidade, e sim que a própria rede era plana
Ainda assim, a época de faculdade era um momento divertido para fazer esse tipo de coisa
O Soulseek ainda está bem vivo e funcionando bem
A parte mais engraçada do Gnutella é que não tinha absolutamente nada a ver com o projeto GNU, só colocaram GNU no nome porque parecia legal
Frequentemente me pergunto quanto da tecnologia central do Gnutella poderia ser reaproveitada para descoberta de conteúdo em algo mais novo como a small-web ou algo parecido com o Gemini
Dizer que “fracassou” é incompleto. Em geral, as coisas não simplesmente dão certo ou errado; elas só podem ser bem-sucedidas ou fracassar em relação a algum objetivo
Há basicamente dois motivos para os usuários de Gnutella não existirem mais, e ambos podem ser vistos como fracassos
Primeiro, o Gnutella e vários softwares não protegiam suficientemente a privacidade dos usuários, expondo-os a riscos reais e percebidos
Segundo, como sistema de distribuição de arquivos de mídia, era muito bom, mas não conseguiu oferecer o equilíbrio entre qualidade e preço que satisfaria a maioria dos usuários. Dava o acesso ilimitado que as pessoas queriam, mas não garantia conteúdo autêntico, enquanto o Spotify ofereceu os dois
Nesse sentido, os usuários do Gnutella ainda existem, mas agora usam outra coisa
Pensei em criar um arquivo de arquivos
*.gmi, torná-lo pesquisável por meio de uma extensão do Gnutella, e usar um sistema de ponteiros para que as pessoas possam assinar e publicar documentos em gemtextNão é uma ideia totalmente nova, mas a combinação de distribuição via Gemtext + Gnutella parece nova: https://github.com/RickCarlino/gnutella-bun-client/…
Este texto foi resultado de um brainstorming com o GPT-5.4, então estou só deixando guardado para o futuro e ainda não pretendia compartilhá-lo, então veja com cautela
Gostaria de ouvir ideias de quem estiver no espaço Gemini + Gnutella; sou fácil de encontrar no Linkedin, Reddit, Fediverse etc., e também há contato no meu blog
O OnionShare também é bem interessante: https://onionshare.org/
Pode virar parte da DaRkWeB
Pela documentação, parece mais próximo de uma ferramenta de transferência direta de arquivos
Acho que faltou um ponto sobre por que o Gnutella sobreviveu tanto tempo nas condições da época: não havia muito incentivo prático para fazer spam em buscas P2P
Mais tarde, spam em buscas P2P de fato apareceu
Acho que o fato de quase não haver spam em IRC hoje em dia é por um motivo parecido
É interessante como boa parte do protocolo confia no cliente
GUIDs deveriam ser aleatórios, mas como o usuário controla isso, todo mundo poderia configurar o GUID como
0000. Se alguém refizesse o Gnutella hoje, provavelmente colocaria um sistema complexo de troca de chaves e identidades baseadas em chaves ED25519O número de arquivos anunciados, largura de banda etc. também funciona essencialmente na base de acreditar que o usuário está dizendo a verdade. Em um protocolo mais complexo, talvez tentassem verificar essas alegações de fato
Se tivessem colocado muitas assinaturas de chave ou gestão de reputação, a implementação poderia ter ficado complexa demais, e talvez justamente a simplicidade tenha sido o motivo do sucesso. Clientes Gnutella realmente podem ser feitos
Acho que muitos projetos P2P modernos deixam isso passar. O Secure Scuttlebutt, de que gosto muito, dá a impressão de ter tentado fazer algo quase perfeito considerando vários fracassos e abusos possíveis, e no fim virou um ecossistema em que só existe um cliente funcional, feito por quem escreveu a especificação
O mesmo exemplo vale para
gemini://. Não é P2P, e sim um protocolo federado, mas mesmo com problemas e brechas na especificação, as pessoas realmente fizeram clientes, e apesar dos problemas o ecossistema tem implementações bem variadasO papel de Gene Kan e Spencer Kimball, membros da XCF de Berkeley, foi grande para o Gnutella decolar naquele momento
Spencer depois fez muito trabalho de engenharia excelente no Google e hoje é CEO da empresa de bancos de dados Cockroach Labs
Gene teve um sucesso precoce ao vender sua empresa de busca para a Sun, mas infelizmente morreu de forma trágica em 2002, ainda muito jovem