Cliente BitTorrent implementado do zero
(github.com/piyushgupta53)- Go-Torrent é uma implementação de cliente BitTorrent feita em Go, que implementa as funcionalidades centrais para baixar arquivos usando o protocolo BitTorrent
- O escopo da implementação inclui parsing de arquivos .torrent, descoberta de peers, comunicação entre peers e download de arquivos, lidando tanto com torrents de arquivo único quanto com torrents multifile
- O Bencode oferece suporte aos tipos string, inteiro, lista e dicionário, e inclui tratamento de erros e validação
- A funcionalidade de download fornece gerenciamento de pieces e blocos, downloads simultâneos, rastreamento de progresso e gerenciamento de armazenamento em nível de bloco
- O projeto ainda está em desenvolvimento ativo, com suporte futuro planejado para Magnet link, metadata exchange protocol e DHT
Funcionalidades implementadas pelo Go-Torrent
- Go-Torrent é uma implementação de cliente BitTorrent escrita em Go
- Implementa as funcionalidades centrais para permitir o download de arquivos usando o protocolo BitTorrent
- O principal escopo da implementação é o seguinte
- parsing de arquivos torrent
- descoberta de peers
- download de arquivos
Bencode e processamento de arquivos torrent
- Codificação/decodificação Bencode oferece suporte a todos os tipos de Bencode
- string
- inteiro
- lista
- dicionário
- Inclui tratamento de erros e validação
- O processamento de arquivos torrent oferece suporte ao parsing de arquivos
.torrent- torrents de arquivo único
- torrents multifile
- Oferece suporte ao cálculo do info hash e à extração do piece hash
- Oferece suporte aos campos padrão de arquivos torrent
Descoberta e comunicação com peers
- Oferece suporte à descoberta de peers por meio de HTTP tracker
- Implementa o protocolo de handshake entre peers
- Inclui o protocolo completo de mensagens do BitTorrent
- Fornece gerenciamento de conexões entre peers
Download e gerenciamento de armazenamento
- A funcionalidade de download inclui gerenciamento de pieces e blocos
- É possível executar vários downloads simultaneamente
- Rastreia o progresso do download
- Oferece suporte à montagem de arquivos tanto para torrents de arquivo único quanto para torrents multifile
- O gerenciamento de armazenamento funciona com granularidade em nível de bloco
Estrutura, requisitos e estado de desenvolvimento
- A estrutura do projeto é dividida nos seguintes pacotes
cmd/: interface de linha de comando e aplicação principalinternal/bencode/: codificação/decodificação Bencodeinternal/torrent/: processamento de arquivos torrentinternal/tracker/: implementação do protocolo de trackerinternal/peer/: comunicação entre peersinternal/download/: gerenciamento de downloadpkg/: pacotes públicos
- O requisito é Go 1.21 ou superior
- A instalação é feita clonando o repositório e executando
go mod download - A documentação de uso será adicionada quando o projeto estiver mais maduro
- O estado atual da implementação pode ser consultado em checkpoint.md
- Os recursos planejados são os seguintes
- suporte a Magnet link
- Metadata exchange protocol
- suporte a DHT(Distributed Hash Table)
- Os materiais de referência são BitTorrent Protocol Specification e Bencode Specification
1 comentários
Comentários do Hacker News
Excelente. Mas, como a entrada não é confiável, seria bom limitar o tamanho das alocações dinâmicas no decodificador bencode
Uma entrada maliciosa em um arquivo torrent ou em uma resposta announce pode exigir uma alocação enorme durante o parsing de strings e levar o cliente a uma negação de serviço. Um torrent bem-formado não pode conter uma string maior que o tamanho restante da entrada, então usar o tamanho restante da entrada como limite superior parece adequado
Gosto porque parece limpo e simples. Seria bom colocar no README uma linha de exemplo de uso que realmente baixe um arquivo
.torrentEx.:
./go-torrent My-Linux-Distro-Wink-ISO.torrentAlém disso, incluir
torrent.ParseFromUrlseria ainda melhor; esse tipo de projeto vale a pena todo mundo fazer uma vez como exercício próprioLegal. No codecrafters há um desafio que orienta um pouco esse processo e também fornece testes. Brinquei um pouco durante o mês grátis e foi divertido
https://app.codecrafters.io/courses/bittorrent/overview
Legal. Eu também já pensei em algo assim. Fico curioso para saber quão difícil foi e em que medida dá para dizer que está “completo”. Também queria saber se ele lida com DHT, Magnet e todo tipo de recurso de travessia de NAT
O ponto em que sempre travo é não saber qual é a lista de recursos necessários para criar um cliente que simplesmente funcione com a maioria dos torrents que circulam por aí. Parece haver dezenas de protocolos relacionados a torrents, e nem sei direito o que cada um faz, quanto mais a lista completa
Com certeza foi difícil. Levei quase um mês para entender como o protocolo e o bencoding funcionam, construir um modelo mental e então escrever o código de fato
Magnet e DHT ainda não foram adicionados
A dificuldade depende muito da experiência, da familiaridade com a linguagem de programação usada e da disposição para experimentar. Como referência, eu também comecei na semana passada a criar um cliente Bittorrent em Go e, em uma semana, cheguei a cerca de 80% do projeto publicado
Mas tenho bastante experiência com Go, um bom conhecimento de protocolos e redes, e experimentar já virou quase uma segunda natureza para mim
Se tiver interesse, a especificação principal do Bittorrent é, na verdade, bem curta; dá para ler e entender com facilidade em cerca de uma hora: https://www.bittorrent.org/beps/bep_0003.html
Em torno do Bittorrent há muitas coisas como extensões de protocolo, mas, pelo que vi até agora, o nível de suporte varia de cliente para cliente. Por exemplo, Protocol Encryption é praticamente uma forma de ofuscação: primeiro tenta-se comunicar desse jeito e, se não funcionar, dependendo da configuração, volta-se ao protocolo normal
Para baixar uma distribuição Linux, por exemplo Debian, a partir de um arquivo
.torrentde um site, o caminho é relativamente direto. É um único arquivo, há um tracker, muitos peers usam o protocolo normal e, se você estiver atrás de NAT, ainda é possível em certa medida mesmo sem aceitar conexões de entradaQuando você naturalmente entra em conteúdos de zona cinzenta, pode querer parsear links Magnet, encontrar peers via DHT e também implementar UPnP para tentar mapear portas automaticamente no modem. Ainda assim, isso também pode ser construído aos poucos, de forma iterativa. Quanto mais recursos, maior a chance de encontrar mais peers e trocar dados com sucesso
Não sou desenvolvedor Go, então pergunto: por que usar o Go 1.21, que é antigo? Há algum motivo para ficar em uma versão antiga?
Edit: parece que o suporte foi encerrado há 10 meses
Suporte ao Windows 7 é um dos motivos para permanecer em releases antigos do Go. Projetos criados com Go 1.21.4 ou inferior rodam em todos os releases do Windows e em computadores feitos desde 2009, mas, se você subir para v1.21.5, passa a rodar apenas em computadores mais recentes e no Windows 10/11, sem muito ganho
https://github.com/golang/go/issues/64622
O README provavelmente parece ter sido gerado por IA. No arquivo
go.modreal, a versão do Go está indicada como 1.23.1[1], o que significa que é necessário Go 1.23.1 ou superior[2][1] https://github.com/piyushgupta53/go-torrent-client/blob/6130...
[2] https://go.dev/doc/modules/gomod-ref#go-notes
Muito legal. Me lembra a época da faculdade. Fiz isso como projeto final da disciplina de redes da Georgia Tech
Perdi o código há muito tempo, mas as lições que aprendi naquela época ficaram. Projetos assim também são uma boa forma de aprender uma linguagem nova
É o tipo de projeto bom para tentar. Fiz algo parecido, e ver encoders/decoders bencode feitos por outras pessoas me deixou humilde
Também é uma boa forma de explorar recursos da linguagem. Claro que tentar alcançar todos os recursos de uma biblioteca grande é uma tarefa bastante inútil, e acho que a compatibilidade entre clientes já é insuficiente
Fico curioso para saber se há planos de publicar uma documentação sobre o processo de implementação. Pessoalmente, isso me interessa mais do que o código em si
Porque não há muito material que aprofunde a abordagem ou o processo de implementar os vários aspectos do protocolo
Fico curioso para saber se também fizeram v2 e mutable torrents. Por favor, que alguém implemente mutable torrents
Tem suporte a links Magnet?
Edit: ah, era um recurso planejado