1 Punkte von GN⁺ 2025-06-15 | 1 Kommentare | Auf WhatsApp teilen
  • Go-Torrent ist eine in Go geschriebene BitTorrent-Client-Implementierung, die die Kernfunktionen zum Herunterladen von Dateien über das BitTorrent-Protokoll umsetzt
  • Der Implementierungsumfang umfasst das Parsen von .torrent-Dateien, Peer-Erkennung, Peer-Kommunikation und den Dateidownload und verarbeitet sowohl Single-File- als auch Multi-File-Torrents
  • Bencode unterstützt String-, Integer-, Listen- und Dictionary-Typen und enthält Fehlerbehandlung sowie Validierung
  • Die Download-Funktion bietet Stück-(piece-) und Blockverwaltung, gleichzeitige Downloads, Fortschrittsverfolgung und Speicherverwaltung auf Blockebene
  • Das Projekt ist noch aktiv in Entwicklung; Unterstützung für Magnet links, das Metadata Exchange Protocol und DHT ist für die Zukunft geplant

Von Go-Torrent implementierte Funktionen

  • Go-Torrent ist eine in Go geschriebene BitTorrent-Client-Implementierung
  • Es implementiert die Kernfunktionen, um Dateien über das BitTorrent-Protokoll herunterladen zu können
  • Der Hauptumfang der Implementierung ist wie folgt
    • Parsen von Torrent-Dateien
    • Peer-Erkennung
    • Dateidownload

Bencode und Verarbeitung von Torrent-Dateien

  • Bencode-Kodierung/Dekodierung unterstützt alle Bencode-Typen
    • Strings
    • Integer
    • Listen
    • Dictionaries
  • Enthält Fehlerbehandlung und Validierung
  • Verarbeitung von Torrent-Dateien unterstützt das Parsen von .torrent-Dateien
    • Single-File-Torrents
    • Multi-File-Torrents
  • Unterstützt die Berechnung des Info-Hashs und die Extraktion von Piece-Hashs
  • Unterstützt Standardfelder von Torrent-Dateien

Peer-Erkennung und -Kommunikation

  • Unterstützt Peer-Erkennung über HTTP tracker
  • Implementiert das Peer-Handshake-Protokoll
  • Enthält das vollständige BitTorrent-Nachrichtenprotokoll
  • Bietet Peer-Verbindungsmanagement

Download- und Speicherverwaltung

  • Die Download-Funktion umfasst die Verwaltung von Stücken (pieces) und Blöcken
  • Mehrere Downloads können gleichzeitig ausgeführt werden
  • Verfolgt den Download-Fortschritt
  • Unterstützt die Dateizusammensetzung sowohl für Single-File- als auch für Multi-File-Torrents
  • Die Speicherverwaltung arbeitet mit Granularität auf Blockebene

Struktur, Anforderungen und Entwicklungsstatus

  • Die Projektstruktur ist in folgende Pakete unterteilt
    • cmd/: Kommandozeilenoberfläche und Hauptanwendung
    • internal/bencode/: Bencode-Kodierung/Dekodierung
    • internal/torrent/: Verarbeitung von Torrent-Dateien
    • internal/tracker/: Implementierung des Tracker-Protokolls
    • internal/peer/: Peer-Kommunikation
    • internal/download/: Download-Verwaltung
    • pkg/: öffentliche Pakete
  • Voraussetzung ist Go 1.21 oder höher
  • Die Installation erfolgt durch Klonen des Repositorys und anschließendes Ausführen von go mod download
  • Eine Nutzungsdokumentation soll hinzugefügt werden, sobald das Projekt ausgereifter ist
  • Der aktuelle Implementierungsstand ist in checkpoint.md einsehbar
  • Geplante Funktionen sind wie folgt
    • Unterstützung für Magnet links
    • Metadata Exchange Protocol
    • Unterstützung für DHT (Distributed Hash Table)
  • Referenzmaterial sind die BitTorrent Protocol Specification und die Bencode Specification

1 Kommentare

 
GN⁺ 2025-06-15
Hacker-News-Kommentare
  • Großartig. Da es sich jedoch um nicht vertrauenswürdige Eingaben handelt, wäre es sinnvoll, im bencode-Decoder die Größe dynamischer Allokationen zu begrenzen.
    Bösartige Eingaben in Torrent-Dateien oder announce-Antworten könnten beim Parsen von Strings sehr große Allokationen verlangen und den Client so in einen Denial of Service treiben. Ein korrekt gebautes Torrent kann keinen String enthalten, der länger ist als die verbleibende Eingabelänge; diese als Obergrenze zu verwenden, scheint daher vernünftig.

  • Gefällt mir, sieht sauber und einfach aus. Es wäre gut, im README eine einzeilige Nutzungsbeispiel aufzunehmen, das tatsächlich eine .torrent-Datei herunterlädt.
    Beispiel: ./go-torrent My-Linux-Distro-Wink-ISO.torrent
    Noch besser wäre zusätzlich torrent.ParseFromUrl; solche Projekte sollte eigentlich jeder einmal als Übung für sich selbst machen.

  • Cool. Bei codecrafters gibt es eine Challenge, die einen dabei ein Stück weit anleitet und Tests bereitstellt. Ich habe das während eines kostenlosen Monats ein bisschen ausprobiert, und es hat Spaß gemacht.
    https://app.codecrafters.io/courses/bittorrent/overview

  • Cool. Über so etwas habe ich auch schon einmal nachgedacht. Ich frage mich, wie schwierig es war und ab wann man es als einigermaßen „fertig“ betrachten kann. Mich interessiert auch, ob DHT, Magnet und all die NAT-Traversal-Funktionen abgedeckt sind.
    Der Punkt, an dem ich immer hängen geblieben bin, war: Ich wusste nicht, welche Funktionen man braucht, damit ein Client mit den meisten Torrents, die tatsächlich im Umlauf sind, einfach funktioniert. Es scheint Dutzende Protokolle rund um Torrents zu geben, und ich kenne weder die vollständige Liste noch wirklich, was jedes davon macht.

    • Es war definitiv schwierig. Es hat fast einen Monat gedauert, zu lernen, wie das Protokoll und bencoding funktionieren, ein mentales Modell dafür aufzubauen und dann den eigentlichen Code zu schreiben.
      Magnet und DHT sind noch nicht hinzugefügt.

    • Der Schwierigkeitsgrad hängt stark von Erfahrung, Vertrautheit mit der verwendeten Programmiersprache und einer experimentierfreudigen Haltung ab. Zum Vergleich: Ich habe letzte Woche ebenfalls angefangen, einen Bittorrent-Client in Go zu bauen, und bin nach einer Woche ungefähr bei 80 % des veröffentlichten Projekts angekommen.
      Allerdings habe ich viel Go-Erfahrung, ziemlich gute Kenntnisse über Protokolle und Networking, und Experimentieren ist für mich fast schon zur zweiten Natur geworden.

      Falls es dich interessiert: Die Kern-Spezifikation von Bittorrent ist tatsächlich recht kurz und lässt sich in etwa einer Stunde leicht lesen und verstehen: https://www.bittorrent.org/beps/bep_0003.html

      Rund um Bittorrent gibt es viele Dinge wie Protokollerweiterungen, aber nach allem, was ich bisher gesehen habe, unterstützen Clients diese in unterschiedlichem Maße. Protocol Encryption zum Beispiel ist im Grunde eher Obfuskation; man versucht zuerst, auf diese Weise zu kommunizieren, und fällt, wenn es nicht klappt, je nach Einstellung auf das normale Protokoll zurück.

      Wenn man von einer Website per .torrent-Datei eine Linux-Distribution herunterlädt, etwa Debian, ist das vergleichsweise geradlinig. Es ist eine einzelne Datei, es gibt einen Tracker, viele Peers nutzen das normale Protokoll, und wenn man hinter NAT sitzt, kommt man bis zu einem gewissen Grad auch ohne eingehende Verbindungen aus.

      Wenn man sich dann naturgemäß in Inhalte aus der Grauzone bewegt, möchte man vielleicht Magnet-Links parsen, Peers per DHT finden und auch UPnP implementieren, um Ports am Modem automatisch zu mappen. Aber auch das kann man iterativ Stück für Stück aufbauen. Je mehr Funktionen vorhanden sind, desto größer ist die Chance, mehr Peers zu finden und erfolgreich Daten auszutauschen.

  • Ich bin kein Go-Entwickler, daher die Frage: Warum wird das alte Go 1.21 verwendet? Gibt es einen Grund, auf einer älteren Version zu bleiben?
    Edit: Scheint vor 10 Monaten aus dem Support gefallen zu sein.

  • Sehr cool. Erinnert mich an meine Studienzeit. Das haben wir als Abschlussprojekt im Networking-Kurs an der Georgia Tech gemacht.
    Den Code habe ich vor langer Zeit verloren, aber die Lektionen daraus sind geblieben. Solche Projekte sind auch eine gute Möglichkeit, eine neue Sprache zu lernen.

  • Das ist genau die Art von Projekt, die sich gut zum Ausprobieren eignet. Ich habe etwas Ähnliches gemacht und wurde ziemlich demütig, als ich mir bencode-Encoder/-Decoder anderer Leute angesehen habe.
    Es ist auch eine gute Möglichkeit, Sprachfeatures zu erkunden. Natürlich ist es ziemlich aussichtslos, alle Funktionen großer Libraries nachzubauen, und ich denke, die Kompatibilität zwischen Clients ist ohnehin schon unzureichend.

  • Ich frage mich, ob geplant ist, eine Dokumentation zum Implementierungsprozess zu veröffentlichen. Persönlich interessiert mich das sogar mehr als der Code selbst.
    Denn es gibt nicht viele Materialien, die den Ansatz oder Prozess zur Implementierung der verschiedenen Aspekte des Protokolls ausführlich behandeln.

  • Ich frage mich, ob auch v2 und mutable torrents umgesetzt wurden. Bitte, irgendjemand soll endlich mutable torrents implementieren.

  • Unterstützt es Magnet-Links?
    Edit: Ah, war als geplantes Feature aufgeführt.

    • Noch nicht. Soll bald hinzugefügt werden.