Wie funktionieren BitTorrent-Magnetverbindungen?

157

Zum ersten Mal habe ich eine Magnetverbindung verwendet . Ich war neugierig, wie es funktioniert, habe die technischen Daten nachgeschlagen und keine Antworten gefunden. Das Wiki sagt xt"genaues Thema" und wird vom Format ( btihin diesem Fall) mit einem SHA1-Hash gefolgt . Ich habe gesehen, dass base32 erwähnt wurde, da ich wusste, dass es 5 Bit pro Zeichen und 32 Zeichen sind. Ich fand, dass es genau 160 Bit enthält, was genau der Größe des SHA1 entspricht.

Es gibt keinen Platz für eine IP-Adresse oder etwas anderes, es ist nur ein SHA1. Wie findet der BitTorrent-Client die eigentliche Datei? Ich habe URL Snooper aktiviert, um zu sehen, ob es eine Seite besucht (mit TCP) oder eine Suche oder ähnliches durchführt, aber nichts ist passiert. Ich habe keine Ahnung, wie der Kunde Peers findet. Wie funktioniert das?

Wovon ist der Hash? Ist es ein Hash eines Arrays aller Datei-Hashes zusammen? Vielleicht ist es ein Hash der tatsächlich benötigten Torrent-Datei (bestimmte Informationen entfernen)?


In einer VM habe ich versucht, eine Magnetverbindung mit uTorrent (das frisch installiert wurde) herzustellen, und es ist gelungen, Peers zu finden. Woher kam der erste Peer? Es war frisch und es gab keine anderen Ströme.

Barmar
quelle
3
Ist das überhaupt für die Programmierung relevant?
Krypton

Antworten:

156

Eine BitTorrent-Magnetverbindung identifiziert einen Torrent unter Verwendung von 1 a SHA-1 oder abgeschnittenem SHA-256-Hashwert, der als "Infohash" bekannt ist. Dies ist derselbe Wert, den Peers (Clients) verwenden, um Torrents bei der Kommunikation mit Trackern oder anderen Peers zu identifizieren. Eine herkömmliche Torrent-Datei enthält eine Datenstruktur mit zwei Schlüsseln der obersten Ebene: announceIdentifizieren der für den Download zu verwendenden Tracker und infoder Dateinamen und Hashes für den Torrent. Der "Infohash" ist der Hash der codierten infoDaten.

Einige Magnet-Links enthalten Tracker oder Web-Seeds, aber oft nicht. Ihr Kunde weiß möglicherweise nichts über den Torrent außer seinem Infohash. Das erste, was es braucht, ist, andere Peers zu finden, die den Torrent herunterladen. Dies geschieht über ein separates Peer-to-Peer-Netzwerk 2, das eine "Distributed Hash Table" (DHT) betreibt. Ein DHT ist ein großer verteilter Index, der Torrents (identifiziert durch Infohashes) Listen von Peers (identifiziert durch IP-Adresse und Ports) zuordnet, die an einem Schwarm für diesen Torrent teilnehmen (Hochladen / Herunterladen von Daten oder Metadaten).

Wenn ein Client zum ersten Mal dem DHT-Netzwerk beitritt, generiert er eine zufällige 160-Bit-ID aus demselben Bereich wie Infohashes. Anschließend wird die Verbindung zum DHT-Netzwerk mithilfe von fest codierten Adressen von Clients, die vom Cliententwickler gesteuert werden, oder von DHT-unterstützenden Clients, die zuvor in einem Torrent-Schwarm angetroffen wurden, gebootet. Wenn sie will in einem Schwarm für einen bestimmten Strom teilnehmen, sucht es die DHT - Netzwerk für mehrere andere Kunden , deren IDs sind so nah 3 wie möglich an der infohash. Es benachrichtigt diese Kunden, dass sie am Schwarm teilnehmen möchten, und fragt sie nach den Verbindungsinformationen aller Peers, von denen sie bereits wissen, wer am Schwarm teilnimmt.

Wenn Peers einen bestimmten Torrent hochladen / herunterladen, versuchen sie, sich gegenseitig über alle anderen Peers zu informieren, von denen sie wissen, dass sie am selben Torrent-Schwarm teilnehmen. Auf diese Weise werden Peers schnell voneinander informiert, ohne dass ein Tracker oder DHT ständigen Anforderungen ausgesetzt ist. Sobald Sie einige Peers aus dem DHT kennengelernt haben, kann Ihr Client diese Peers nach den Verbindungsinformationen von noch mehr Peers im Torrent-Schwarm fragen, bis Sie alle Peers haben, die Sie benötigen.

Schließlich können wir diese Peers nach den infoMetadaten des Torrents fragen , die die Dateinamen und die Hash-Liste enthalten. Nachdem wir diese Informationen heruntergeladen und anhand der bekannten Informationen überprüft haben, ob sie korrekt sind infohash, befinden wir uns praktisch an der gleichen Position wie ein Client, der mit einer regulären .torrentDatei begonnen und eine Liste der Peers vom enthaltenen Tracker erhalten hat.

Der Download kann beginnen.

1 Der Infohash ist normalerweise hexadezimal codiert, aber einige alte Clients verwendeten stattdessen Basis 32. v1 ( urn:btih:) verwendet den SHA-1-Digest direkt, während v2 ( urn:bimh:) ein Multihash- Präfix hinzufügt , um den Hash-Algorithmus und die Digest-Länge zu identifizieren.
2 Es gibt zwei primäre DHT-Netzwerke: das einfachere "Haupt" -DHT und ein komplizierteres Protokoll, das von Azureus verwendet wird.
3 Der Abstand wird mit XOR gemessen.

Weiterführende Literatur

Jeremy Banks
quelle
1
Ist der Bootstrap-Knoten z. B. dht.transmission.comeinfach ein Tracker? Ich verstehe es so, dass es die Liste der Peers pro Info-Hash verfolgen muss - genau das macht ein Tracker.
Kar
3
@ Kate Nicht genau. Ein typischer DHT-Knoten speichert Peer-Listen für einige Torrents, die sich im "Raum" des DHT-Netzwerks "in der Nähe" befinden. Ein Tracker versucht stattdessen, Peer-Listen für jeden ihm bekannten Torrent zu speichern. Darüber hinaus speziell Knoten Bootstrap DHT speichern keine Peer - Listen für irgendwelche Ströme. Stattdessen verteilen sie nur Listen anderer DHT-Knoten, um Ihnen die Verbindung zum gesamten Netzwerk zu erleichtern. Sie können dann einen typischen DHT-Knoten mit der Peer-Liste finden, an der Sie interessiert sind.
Jeremy Banks
"Einige Magnet-Links enthalten Tracker oder Web-Seeds" - ich bin etwas verwirrt. Magnet wird zum Herunterladen der von Ihnen beschriebenen Torrent-Datei verwendet . In der Magnet-URI-Spezifikation sehe ich "akzeptable Quelle" und "Tracker" als Informationen, die in der URI codiert werden können. Jetzt ist der Tracker offensichtlich Bittorrent-spezifisch und wird höchstwahrscheinlich zusätzlich zu den in der Torrent-Datei aufgeführten Trackern verwendet. Soll die "akzeptable Quelle" zum Herunterladen der Torrent-Datei oder (einer von) der tatsächlichen Dateien verwendet werden, die über die Torrent-Datei heruntergeladen werden sollen?
Frederick Nord
@FrederickNord Bei der Unterstützung von Torrent-Clients ws=verweist der Parameter auf eine BEP-19-Web-Seed-URL der tatsächlichen Daten und der xs=Parameter auf eine URL mit der .torrentDatei selbst. Ich denke, das ist ein bisschen unvereinbar mit anderen Verwendungen des magnet:Schemas, aber so ist es. Ich vergesse, ob Kunden as=etwas verwenden ... vielleicht nur als xs=Ersatz für IIRC, aber nicht allgemein unterstützt.
Jeremy Banks
46

Peer Discovery und Resource Discovery (in Ihrem Fall Dateien) sind zwei verschiedene Dinge.

Ich bin mit JXTA besser vertraut, aber alle Peer-to-Peer-Netzwerke arbeiten nach denselben Grundprinzipien.

Das erste, was passieren muss, ist die Peer-Entdeckung.

Peer Discovery

Die meisten P2P-Netzwerke sind "Seed" -Netzwerke: Beim ersten Start stellt ein Peer eine Verbindung zu einer bekannten (fest codierten) Adresse her, um eine Liste der ausgeführten Peers abzurufen. Dies kann ein direktes Seeding sein, wie das Herstellen einer Verbindung zu, dht.transmissionbt.comwie in einem anderen Beitrag erwähnt, oder ein indirektes Seeding, wie dies normalerweise bei JXTA der Fall ist, bei dem der Peer eine Verbindung zu einer Adresse herstellt, die nur eine Klartextliste der Netzwerkadressen anderer Peers liefert.

Sobald die Verbindung mit den ersten (wenigen) Peers hergestellt wurde, führt der verbindende Peer eine Ermittlung anderer Peers durch (durch Senden von Anforderungen) und verwaltet eine Tabelle mit diesen. Da die Anzahl der anderen Peers sehr groß sein kann, verwaltet der verbindende Peer nur einen Teil einer verteilten Hash-Tabelle (DHT) der Peers. Der Algorithmus zum Bestimmen, welcher Teil der Tabelle der verbindende Peer verwalten soll, hängt vom Netzwerk ab. BitTorrent verwendet Kademlia mit 160-Bit-Kennungen / Schlüsseln.

Ressourcenerkennung

Sobald einige Peers vom verbindenden Peer entdeckt wurden, sendet dieser einige Anfragen zur Erkennung von Ressourcen an ihn. Magnet-Links identifizieren diese Ressourcen und sind so aufgebaut, dass sie eine "Signatur" für eine Ressource darstellen und garantieren, dass sie den angeforderten Inhalt unter allen Peers eindeutig identifizieren. Der verbindende Peer sendet dann eine Erkennungsanforderung für die Magnetverbindung / -ressource an Peers in seiner Umgebung. Das DHT ist so aufgebaut, dass es hilft, zu bestimmen, welche Peers zuerst nach der Ressource gefragt werden sollen (lesen Sie mehr über Kademlia in Wikipedia). Wenn der angeforderte Peer die angeforderte Ressource nicht enthält, "leitet" er die Abfrage normalerweise an zusätzliche Peers weiter, die von seinem eigenen DHT abgerufen wurden.

Die Anzahl der "Sprünge", an die die Abfrage weitergeleitet werden kann, ist normalerweise begrenzt. 4 ist eine übliche Nummer bei JXTA-Netzwerken.

Wenn ein Peer die Ressource hält, antwortet er mit seinen vollständigen Details. Der verbindende Peer kann sich dann mit dem Peer verbinden, der die Ressource hält (direkt oder über ein Relais - ich werde hier nicht auf Details eingehen) und mit dem Abrufen beginnen.

Ressourcen / Dienste in P2P-Netzwerken sind nicht direkt an Netzwerkadressen gebunden: Sie sind verteilt, und das ist das Schöne an diesen hoch skalierbaren Netzwerken.

Bruno Grieder
quelle
Dies ist meiner Meinung nach die prägnanteste Antwort ohne viel Fachjargon. Vielen Dank.
Desaivv
26

Ich war neugierig auf die gleiche Frage. Beim Lesen des Codes für die Übertragung fand ich Folgendes in libtrnasmission/tr-dht.c:

3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );

Es versucht das 6 Mal und wartet 40 (!) Sekunden zwischen den Versuchen. Ich denke, Sie können es testen, indem Sie die Konfigurationsdateien ( ~/.config/transmissionunter Unix) löschen und die gesamte Kommunikation blockieren dht.transmissionbt.comund sehen, was passiert (warten Sie mindestens 240 Sekunden).

Es scheint also, dass der Client zunächst einen Bootstrap-Knoten eingebaut hat. Sobald es in das Netzwerk gelangt ist, benötigt es diesen Bootstrap-Knoten natürlich nicht mehr.

yhager
quelle
9

Ich habe endlich eine Spezifikation gefunden. Zum ersten Mal hat Google nicht geholfen . (Wiki verlinkt auf bittorrent.com, die die Hauptseite ist. Ich habe auf den Entwickler-Link geklickt und den bittorrent.org-Tab auf der rechten Seite bemerkt. Von dort aus war es einfach. Es ist schwierig, Links zu finden, wenn Sie keine Ahnung haben, wie sie beschriftet sind, und viele klickt weg).

Es scheint, als hätten alle Torrents ein Netzwerk von Peers. Sie finden Peers von Trackern und behalten sie zwischen den Sitzungen. Das Netzwerk ermöglicht es Ihnen, Peers und andere Dinge zu finden. Ich habe nicht gelesen, wie es mit Magnet-Links verwendet wird, aber es scheint undefiniert zu sein, wie ein neuer Kunde Peers findet. Möglicherweise sind einige eingebunden, oder sie verwenden ihren Heimserver oder bekannte Tracker, die in den Client eingebettet sind, um den ersten Peer im Netzwerk zu erhalten.


quelle
Ah, ich glaube, ich hatte Recht damit, dass ich zu DHT ging, um Kunden zu finden. "Wenn kein Tracker angegeben ist, sollte der Client das DHT (BEP 0005 [3]) verwenden, um Peers zu erwerben."
Jeff Mercado
8

Als ich anfing, Ihre Frage zu beantworten, wusste ich nicht, dass Sie gefragt haben, wie das Magnetschema funktioniert. Ich dachte nur, Sie wollten wissen, wie die für das Bittorrent-Protokoll relevanten Teile generiert wurden.


Der im Magnet-Uri aufgeführte Hash ist der in base32 codierte Info-Hash des Torrents. Der Info-Hash ist der sha1-Hash des bencodierten Info-Blocks des Torrents.

Dieser Python-Code zeigt, wie er berechnet werden kann.

Ich habe eine (sehr naive) C # -Implementierung geschrieben, um dies zu testen, da ich keinen Bencoder zur Hand hatte und dieser den Erwartungen des Kunden entspricht.

static string CalculateInfoHash(string path)
{
    // assumes info block is last entry in dictionary
    var infokey = "e4:info";
    var offset = File.ReadAllText(path).IndexOf(infokey) + infokey.Length;
    byte[] fileHash = File.ReadAllBytes(path).Skip(offset).ToArray();
    byte[] bytes;
    using (SHA1 sha1 = SHA1.Create())
        bytes = sha1.ComputeHash(fileHash, 0, fileHash.Length - 1); // need to remove last 'e' to compensate for bencoding
    return String.Join("", bytes.Select(b => b.ToString("X2")));
}

Soweit ich weiß, enthält dieser Hash keine Informationen zum Auffinden des Trackers. Der Client muss dies auf andere Weise herausfinden (die angegebene Ankündigungs-URL). Dies ist genau das, was einen Torrent auf dem Tracker von einem anderen unterscheidet.

Alles, was mit dem Bittorrent-Protokoll zu tun hat, dreht sich immer noch um den Tracker. Es ist immer noch das primäre Kommunikationsmittel zwischen den Schwärmen. Das Magnet-Uri-Schema wurde nicht speziell für die Verwendung durch Bittorrent entwickelt. Es wird von allen P2P-Protokollen als alternative Form der Kommunikation verwendet. Bittorrent-Clients haben Magnet-Links als weitere Möglichkeit zur Identifizierung von Torrents akzeptiert, sodass Sie keine Torrent-Dateien mehr herunterladen müssen. Der Magnet uri muss noch den trAcker angeben , um ihn zu lokalisieren, damit der Client teilnehmen kann. Es kann Informationen zu anderen Protokollen enthalten, ist jedoch für das Bittorrent-Protokoll irrelevant. Das Bittorrent-Protokoll funktioniert letztendlich nicht ohne die Tracker.

Jeff Mercado
quelle
2
Das hilft nicht. Aber sagen Sie, dass es die gesamte Torrent-Datei hasht, die den Infokey-Block überspringt? Meine Frage war, wie es die Kollegen findet.
1
@ acidzombie24 Du denkst wahrscheinlich an verteilte Tracker, die DHT verwenden, um Peers zu finden. Dies hat nichts mit Magnetverbindungen zu tun. ( en.wikipedia.org/wiki/… )
Alexander Sagen
2
@ Jeff M: Aber was "sendet" eine Liste von Peers zurück. Ein Link ist nur ein Link, dem kein Tracker zugeordnet ist. Ich habe versucht herauszufinden, WAS Peers zurückschickt.
1
+1. Auch der betreffende Magnetlink gibt tr (acker) nicht an. Nur das hat mich verwirrt. Vor allem, wenn ich eine Neuinstallation verwende, bei der keine Torrents ausgeführt werden (und die nicht mit Peers verbunden sind) und die Magnetverbindung Peers findet. Es ist magisch, ich habe keine Ahnung, wie es funktioniert. Es muss einen Heimserver geben, der nach Peers fragen kann. Aber heißt das, dass ich Anfragen an Peers sende, die nach einem Hash suchen, und der Client die Nachricht an viele Peers weiterleitet, bis einer meinen Anruf beantwortet?
1
Ich bin mir nicht sicher, wie ich das beantworten soll. Alle Magnet-Uris, die ich gesehen habe, geben immer den Tracker an. Es könnte sein, dass Ihr Kunde eine Liste von öffentlichen Trackern ausprobiert, von denen er weiß, und einer hat sie zufällig. Welche Tracker werden in der zugehörigen Torrent-Liste verwendet? Wie wird es angezeigt? Gibt es eine Beziehung zwischen dem Tracker, mit dem er verbunden ist, und der Quelle der Magnetverbindung? Vielleicht ist es ein Torrent, der DHT verwendet? Funktioniert das auch für einen privaten Torrent? Auch hier weiß ich nicht genau, wie DHT funktioniert. Ich werde sehen, ob ich weitere Informationen finden kann.
Jeff Mercado
3

Die Liste der Peers wird wahrscheinlich aus dem Torrent gefüllt, der den Client aktualisiert (z. B. gibt es einen Torrent für Utorrent, der ihn aktualisiert). Solange alle denselben Client verwenden, sollte dies gut sein, da Sie keine andere Wahl haben, als das Upgrade gemeinsam zu nutzen.

Moe
quelle
Das ist ein sehr logischer Ort, um nach dem Hash und anderen Peers zu suchen. +1