Un client BitTorrent implémenté entièrement from scratch
(github.com/piyushgupta53)- Go-Torrent est une implémentation de client BitTorrent écrite en Go, qui met en œuvre les fonctionnalités essentielles pour télécharger des fichiers via le protocole BitTorrent
- Le périmètre d’implémentation inclut le parsing des fichiers
.torrent, la découverte de pairs, la communication entre pairs et le téléchargement de fichiers, avec prise en charge des torrents mono-fichier et multi-fichiers - Bencode prend en charge les types chaîne, entier, liste et dictionnaire, et inclut la gestion des erreurs ainsi que la validation
- Les fonctions de téléchargement fournissent la gestion des morceaux (pieces) et des blocs, le téléchargement concurrent, le suivi de progression et la gestion du stockage à la granularité du bloc
- Le projet est encore en développement actif, avec au programme la prise en charge des Magnet links, du metadata exchange protocol et de DHT
Fonctionnalités implémentées par Go-Torrent
- Go-Torrent est une implémentation de client BitTorrent écrite en Go
- Il met en œuvre les fonctions essentielles permettant de télécharger des fichiers à l’aide du protocole BitTorrent
- Le périmètre principal de l’implémentation est le suivant
- parsing des fichiers torrent
- découverte de pairs
- téléchargement de fichiers
Bencode et traitement des fichiers torrent
- L’encodage/décodage Bencode prend en charge tous les types Bencode
- chaînes
- entiers
- listes
- dictionnaires
- Inclut la gestion des erreurs et la validation
- Le traitement des fichiers torrent prend en charge le parsing des fichiers
.torrent- torrents mono-fichier
- torrents multi-fichiers
- Prend en charge le calcul de l’info hash et l’extraction des piece hashes
- Prend en charge les champs standard des fichiers torrent
Découverte des pairs et communication
- Prend en charge la découverte de pairs via HTTP tracker
- Implémente le protocole de handshake entre pairs
- Inclut l’intégralité du protocole de messages BitTorrent
- Fournit la gestion des connexions entre pairs
Téléchargement et gestion du stockage
- Les fonctions de téléchargement incluent la gestion des morceaux (pieces) et des blocs
- Plusieurs téléchargements peuvent être exécutés simultanément
- Suit la progression du téléchargement
- Prend en charge l’assemblage des fichiers pour les torrents mono-fichier comme multi-fichiers
- La gestion du stockage fonctionne avec une granularité au niveau du bloc
Structure, exigences et état du développement
- La structure du projet est répartie dans les packages suivants
cmd/: interface en ligne de commande et application principaleinternal/bencode/: encodage/décodage Bencodeinternal/torrent/: traitement des fichiers torrentinternal/tracker/: implémentation du protocole trackerinternal/peer/: communication entre pairsinternal/download/: gestion du téléchargementpkg/: packages publics
- La configuration requise est Go 1.21 ou supérieur
- L’installation consiste à cloner le dépôt puis à exécuter
go mod download - Une documentation d’utilisation sera ajoutée lorsque le projet aura davantage mûri
- L’état actuel de l’implémentation peut être consulté dans checkpoint.md
- Les fonctionnalités prévues sont les suivantes
- prise en charge des Magnet links
- Metadata exchange protocol
- prise en charge de DHT (Distributed Hash Table)
- Les ressources de référence sont BitTorrent Protocol Specification et Bencode Specification
1 commentaires
Avis sur Hacker News
Excellent. Cela dit, comme l’entrée n’est pas fiable, il vaudrait mieux limiter la taille des allocations dynamiques dans le décodeur bencode
Une entrée malveillante dans un fichier torrent ou une réponse announce peut demander une allocation très importante pendant l’analyse d’une chaîne et pousser le client vers un déni de service. Un torrent bien formé ne peut pas contenir de chaîne plus longue que la longueur d’entrée restante ; utiliser cette longueur restante comme borne supérieure semble donc raisonnable
J’aime le fait que ce soit propre et simple. Ce serait bien d’ajouter dans le README une ligne d’exemple d’utilisation qui télécharge réellement un fichier
.torrentExemple :
./go-torrent My-Linux-Distro-Wink-ISO.torrentEt ce serait encore mieux d’ajouter aussi
torrent.ParseFromUrl. Ce genre de projet vaut vraiment la peine d’être tenté au moins une fois comme exercice personnelSuper. Codecrafters propose un challenge qui guide un peu ce processus et fournit aussi des tests. J’y ai passé un peu de temps pendant le mois gratuit, c’était amusant
https://app.codecrafters.io/courses/bittorrent/overview
Sympa. J’ai déjà envisagé de faire ce genre de chose. Je me demande à quel point c’était difficile, et dans quelle mesure on peut considérer que c’est “terminé”. Je me demande aussi si ça gère DHT, Magnet et toutes sortes de fonctions de traversée de NAT
Le point sur lequel j’ai toujours bloqué, c’est que je ne sais pas quelle liste de fonctionnalités est nécessaire pour créer un client qui fonctionne simplement avec la plupart des torrents qu’on trouve réellement. Il semble y avoir des dizaines de protocoles liés aux torrents, et je ne sais même pas vraiment ce que chacun fait, sans parler d’en avoir une liste complète
C’était clairement difficile. Il m’a fallu presque un mois pour comprendre le fonctionnement du protocole et du bencoding, construire un modèle mental, puis écrire le code effectif
Magnet et DHT n’ont pas encore été ajoutés
La difficulté dépend beaucoup de l’expérience, de la familiarité avec le langage de programmation utilisé et de l’attitude expérimentale. Pour référence, j’ai moi aussi commencé à écrire un client Bittorrent en Go la semaine dernière, et en une semaine j’en suis arrivé à environ 80 % du projet publié
Mais j’ai beaucoup d’expérience en Go, de bonnes connaissances des protocoles et du réseau, et l’expérimentation est presque devenue une seconde nature chez moi
Si ça t’intéresse, la spécification de base de Bittorrent est en fait assez courte ; elle se lit et se comprend facilement en une heure environ : https://www.bittorrent.org/beps/bep_0003.html
Il y a beaucoup de choses “autour” de Bittorrent, comme des extensions de protocole, mais d’après ce que j’ai vu jusqu’ici, le niveau de prise en charge varie selon les clients. Par exemple, Protocol Encryption relève en réalité plutôt de l’obfuscation : on tente d’abord de communiquer avec cette méthode, puis, si ça ne marche pas, on revient au protocole standard selon la configuration
Si l’objectif est de télécharger une distribution Linux, par exemple Debian, via un fichier
.torrentdepuis un site web, c’est relativement direct. Il s’agit d’un seul fichier, il y a un tracker, beaucoup de pairs utilisent le protocole standard, et si l’on est derrière un NAT, on peut quand même s’en sortir dans une certaine mesure sans accepter de connexions entrantesDès qu’on glisse naturellement vers des contenus en zone grise, on peut vouloir parser des liens Magnet, trouver des pairs via DHT, et aussi implémenter UPnP pour essayer de mapper automatiquement un port sur le modem. Mais là encore, on peut construire tout cela progressivement, une brique à la fois. Plus il y a de fonctionnalités, plus on a de chances de trouver davantage de pairs et de réussir les échanges
Je ne suis pas développeur Go, donc je me demande pourquoi utiliser l’ancien Go 1.21. Y a-t-il une raison de rester sur une vieille version ?
Modification : il semble que le support ait pris fin il y a 10 mois
La prise en charge de Windows 7 est l’une des raisons de rester sur une ancienne version de Go. Les projets construits avec Go 1.21.4 ou inférieur fonctionnent sur toutes les versions de Windows et sur les ordinateurs fabriqués depuis 2009 ; passer à v1.21.5 les limite aux ordinateurs plus récents et à Windows 10/11, sans grand bénéfice
https://github.com/golang/go/issues/64622
Le README semble probablement avoir été généré par IA. Dans le fichier
go.modréel, la version de Go indiquée est 1.23.1[1], ce qui signifie que Go 1.23.1 ou supérieur est requis[2][1] https://github.com/piyushgupta53/go-torrent-client/blob/6130...
[2] https://go.dev/doc/modules/gomod-ref#go-notes
Très sympa. Ça me rappelle mes années à l’université. On avait fait ça comme projet final dans le cours de réseaux de Georgia Tech
J’ai perdu le code depuis longtemps, mais les leçons apprises à l’époque me sont restées. Ce genre de projet est aussi une bonne façon d’apprendre un nouveau langage
C’est le genre de projet agréable à tenter. J’ai fait quelque chose de similaire, et regarder les encodeurs/décodeurs bencode écrits par d’autres m’a rendu humble
C’est aussi une bonne façon d’explorer les fonctionnalités d’un langage. Bien sûr, essayer de rattraper toutes les fonctionnalités des grosses bibliothèques est assez vain, et je pense que l’interopérabilité entre clients est déjà insuffisante
Je me demande s’il est prévu de publier une documentation sur le processus d’implémentation. Personnellement, ça m’intéresse davantage que le code lui-même
Il n’y a pas beaucoup de ressources qui traitent en profondeur des approches ou du processus d’implémentation des différents aspects du protocole
Je me demande si v2 et les mutable torrents ont aussi été faits. J’aimerais vraiment que quelqu’un implémente les mutable torrents
Les liens Magnet sont-ils pris en charge ?
Modification : ah, c’était dans les fonctionnalités prévues