1 pontos por GN⁺ 10 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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

    • Havia uma rede de compartilhamento de arquivos no dormitório, e o departamento de TI, extraoficialmente, sabia de tudo, mas oficialmente fingia que não sabia
      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
    • Será que era o Dtella? Tenho boas lembranças de ter participado por um tempo da equipe de releases da rede Dtella não oficial e não aprovada pela TI da universidade, e foi minha primeira chance de trabalhar relativamente de perto com o pessoal mais técnico
      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

    • Se alguém quiser fazer algo na linha de Gemini + Gnutella, pode entrar em contato. Eu tinha uma ideia parecida
      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 gemtext
      Nã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

    • Fico curioso se isso oferece uma camada de busca ou se é só para transferência
      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

    • O Gnutella tinha um nível de confiança maior do que sistemas P2P posteriores, então era fácil inserir spam, mas hoje provavelmente há só alguns milhares de usuários, então o incentivo deve ser baixo
      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 ED25519
      O 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 variadas
  • O 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