Posts Tagged ‘java’
implementing bittorrent
Mal wieder was technisches. Ich geh mal ein bisschen ins Detail des BitTorrent Protokolls.
Ich werde das ganze in mehrere Teile aufteilen.
In den ersten Teilen wird es sehr Theoretisch.
In Teil 1 möchte ich auf das BEncoding eingehen und auf Metafile die euch sicherlich als “.torrent”-Datei bekannt ist.
Im nächstem Teil gehe ich dann auf grundsätzliches zur Aufgabe eines Trackers ein. Und danach wird es richtig interessant ![]()
Aber erstmal zum BEncoding und der Metafile, ohne die BitTorrent nicht funktioniert -
das BEncoding und die Metafile sind Essentiell!
Bevor ich auf das BEncoding eingehe spreche ich erstmal die MetaFile an, da dies die erste
Stelle (und auch wichtigste) ist an der das BEncoding im Protokoll vorgesehen ist.
Metafile
Die Metafile oder wie es die meisten von euch kennen die “.torrent”-Datei.
In ihr sind alle Informationen (und auch ein paar unwichtige
) die ein Client/Peer benötigt
gespeichert.
Also gehen wir mal näher auf den Inhalt der “.torrent”-Datei ein (optionale Teile sind mit *
gekennzeichnet):
- announce: Die Announce-URL des Trackers
- creation date*: Erstellungsdatum
- comment*: Platz für einen Kommentar zum Torrent oder andere Informationen
- created by*: der Name des Erstellers
- info: das info-Dictionary – der “kern” einer Metafile!(darauf gehe ich weiter unten ein)
Jetzt werden sich sicher einige denken “whuuut?! wtf? dictionary?!”
Ein Dictionary ist die Abbildunge einer Map, oder eines Arrays mit Schlüssel als Index
(ArrayList in Java) auf einen String (bzw. eine ByteFolge xD).
Das Info-Dictionary
Diese Keys enthält ein “info” Dictionary:
- piece length: Die Anzahl der Bytes pro Piece (BitTorrent-Peers tauschen die Daten in Pieces)
- pieces: Enthält die Hashes der Pieces
- info**: Das info-Dictionary für die Spezifizierung der im Torrent enthaltenen Datei/en. (wenn dieses info-Dictionary gemeint ist werde ich es mit ** markieren)
Es gibt 2 verschiedene Modi des Info-Dictionary** den Single-File und den Multifile-Mode,
dementsprechend gibt es auch
2 verschiedene Arten die Datei bzw. die Dateien näher zu Spezifizieren:
“info” im Single-File Mode
- name: Der Dateiname
- length: Länge der Datei in Bytes
“info” im Multi-File Mode
- name: Der Ordnername in dem sich die Dateien befinden
- files: Ein Dictionary das für jede Datei ein weiteres Dictionary enthält
Die Keys des “files”-Dictionaries:
- length: Die grösse der Datei in Bytes
- path: Der Pfad der Datei
Damit waren die wichtigsten Elemente des .torrent-Files erklärt und wir können uns mit de
Kodierung der entsprechenden Elemente/Einträge befassen – dem BEncoding.
BEncoding
Das BEncoding ist so genial wie einfach.
BitTorrent nutzt BEncoding für:
- Strings
- Integer
- Dictionaries
- Listen
Diese Typen werden alle nach dem selben Schema kodiert:
Strings:
: Beispiel: 5:w00t! (für den String "w00t!")
Integer:
ie Beispiel: i7e (Integer: "7") i-1e (Integer: "-1")
Dictionaries:
de Beispiel: d3:nks6:gentoo4:apoc4:arche*** *** Steht für folgendes dictionary: KEY VALUE [nks] = gentoo [apoc] = arch
Listen:
le Beispiel: l3:nks7:torrente (entspricht den Strings "nks" und "torrent")
Ist recht simpel oder?
Trotzdem muss man bei der Implementierung aufpassen, wenn hier ein Fehler passiert kann es sein
das man manchmal hinterher lange nach dem Fehler suchen muss ![]()
Das BEncoding verfolgt einen durch das ganze Protokoll hinweg.
Tagged: bittorrent, Development, java, Networking, p2p, Torrent
bitlet.org privacy
Ich nutze gerne den BitTorrent-Client “BitLet”, wenn ich an maschinen ohne installierten BiTorrent-Client arbeite. Wirklich genial und einfach. Zeigt sehr schön wie man mit Java auch nicht resourcenfressende Ressourcen-schonende torrent-Clients schreiben kann, im Gegensatz zu Azureus/Vuze. Ich nutze BitLet recht häufig jedoch bereitet mir schon seit längerem sorgen, dass auf der Startseite eine history der letzten torrents liegt. Das ist natürlich sehr praktisch fürs resumen bzw. um den aktuellen stand des Downloads zu sehen und ihn bei bedarf zu loeschen oder zu resumen, allerdings liegen diese taten auf dem Server von BitLet.org.
BitLet hat somit auf ihren Servern eine Datenbank laufen die die IPs logt mit denen die User ihre Downloads tätigen und die entsprechenden namen der .torrent-Files (mit ausgelesenen meta-Daten und download-fortschritt). Das wird vermutlich über ein Cookie realisiert.
Also ab und zu mal Cookies löschen…
Bleibt abzuwarten was sich daraus ergibt.
links:
Tagged: bittorrent, java, privacy, Torrent