Frage

Ich habe ein paar Fragen bezüglich der Bittorrent Peer Wire Protocol. Ich versuche, es in Java zu implementieren mit diesem spec .

In Peer Wire Protocol Abschnitt heißt es, dass alle ganzen Zahlen vier Byte Big-Endian-Werte sind. AFAIK Java verwendet Big-Endian. Heißt das, sagen, wenn ich eine Drossel Nachricht senden möchten

Drossel:

Sie ich schreibe gerade an den sokcet 1, gefolgt von 0?

Was meine zweite Frage. wenn man für ein Stück anfordernden halte ich mehrere Dateien als eine große kontinuierliche Datei? oder denken in einzelnen Dateien? da Stücklänge mit Dateien nicht ausrichten wird so ein Index beide Ende einer Datei und Beginn eines anderen können enthalten?

Was meine letzte Frage, wenn ich eine Verbindung mit dem Peer öffnen und meine Handshake senden, nicht anfordernden ich einfach Stücke oder fordern Sie dann eine Weile warten, um zu sehen, ob es etwas von uns verlangen wird? Wie erfolgt die Reden statt? Ich habe meistens http Typ Netzwerk-Programmierung getan, wo ich auf eine Antwort auf etwas warten zu fragen. aber wenn ich Stücke halten anfordernden Wie soll ich Stücke schicken?

War es hilfreich?

Lösung

Frage 1

Das Festhalten an einfachen Methoden, wenn Sie Stream-basierte I verwenden / O verwenden Sie Datainputstream und Dataoutputstream beim Schreiben von primitiven Typen (zB Byte , int , lang , usw.):

Socket s; // assume this is already connected
DataOutputStream out = new DataOutputStream( s.getOutputStream );
out.writeByte( 1 );
out.writeInt( 0 );
out.flush(); // optional

Wenn Sie mit nicht-blockierende I / O (zB Klassen aus dem java.nio Paket), dann verwenden ByteBuffer s:

Socket s; // assume this is already connected
SocketChannel = s.getChannel();
ByteBuffer buf = ByteBuffer.allocate(8); // two 4-byte integers
buf.put( 1 ).putInt( 0 );
buf.flip();
c.write( buf ); // assuming channel is writable :)

Jede dieser Methoden wird von Byteanordnung Fragen in Ihrem Namen kümmert.

Frage 2

(Beachten Sie, dass in der Regel die Sie übertragen Blöcke , die Fragmente von Stücken, auf dem Draht sind. Ich werde beschönigen, dass hier :))

Wenn Stücke Senden / Empfangen, ist es am besten die Dateien zu denken (oder Datei) als kontinuierliches, wie du gesagt hat. Die .torrent-Datei enthält Informationen über Dateigrenzen, im Info-Wörterbuch. Im Mehrdateien Fall weist jeder Dateipfad und eine Länge; die einzigen Datei Fall optional einen Namen und Länge hat. Da kennen Sie die Stückgröße, Stückzahl und Gesamtgehalt Länge (alle aus der .torrent-Datei), können Sie Stücke setzen „an der richtigen Stelle“, wie Sie sie empfangen.

Eine einfache Sache zu tun ist, um eine einzelne Datei mit der Größe des Stromes gleich erstellen. Wenn Sie ein Stück erhalten, schreiben Sie es auf die richtige Byte innerhalb dieser einzelnen Datei-Offset (manchmal auch als „.downloading“ Datei). Betrachten wir zum Beispiel einen reißenden Strom, bestehend aus zwei Dateien:

a/b/file1.txt [100 bytes]
a/b/file2.txt [200 bytes]

piece size (pz) = 50 bytes
total size (tz) = 100+200 = 300 bytes
number pieces (np) = 300/50 = 6
file = my_torrent.downloading

Angenommen, wir Anzahl Stück und Byte-Offsets mit Null beginnt. Sagen Sie bitte alle Stück erhalten 1. Auf welche (Start) Byte-Offset ist es in my_torrent.downloading gehen? Es geht bei (1 * pz) = (1 * 50) = 50 . Wo kommt Stück 0 gehen? Bei (0 * pz) = (0 * 50) = 0 . Und so weiter ...

Ich werde darauf wetten, dass jetzt können Sie herausfinden, wie Sie machen diese .downloading Datei in den „echten“ Inhalt in Ihrem torrent.

Frage 3

Wenn in einem BitTorrent Schwarm teilnehmen, das Sie hochladen und das Herunterladen von Stücken und von mehreren Peers gleichzeitig . Denken Sie darüber nach, dass man für eine Sekunde. Zur gleichen Zeit, die Sie ein Stück von einem Peer fordern, könnte ein anderer Peer die von Ihnen gleiche tun. Ganz anders als die Semantik von HTTP, wie Sie bereits erwähnt. Also, zu sprechen direkt auf Ihre Frage, andere Kollegen werden Sie für Daten fragen sie interessiert sind. :)

Nur um sicher zu machen, bevor Sie ein Stück eines von einem Peer anfordern sicherstellen, dass Peer das Stück hat Sie wollen (Besuche das bitfield und haben Nachrichten ) und Sie haben die richtigen Würgen / interessiert Verhalten. Da, was Sie normalerweise tun wollen Anforderungsdaten aus der Liste der bekannten Peers ist (dass der Tracker oder DHT Ihnen erzählt habe) in seltensten erste um. Die Spezifikation spricht über dies und es gibt eine Menge von Optimierungen und Höflichkeit Überlegungen hier. (Tit-for-tat Verhalten, zum Beispiel.) Sie könnten feststellen, dass die spec ein nicht buchstabieren viele dieser heraus. Das ist, weil ein großer Teil der geheimen Sauce von BitTorrent-Clients in diesem Teil der Umsetzung liegt. :)

Ich hoffe, das hilft Ihnen, einige!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top