implementing bittorrent (teil 2)
Was macht ein BitTorrent-Tracker? In diesem Teil gehe ich auf die Funktion eines BitTorrent-Trackers ein. Zuerst sollte man sich den Grundsätzlichen Ablauf eines Torrent Downloads anschauen.
1. Download der .torrent-Datei
Der User sucht sich aus seiner Lieblings-Torrent-Quelle (zb TPB, Demonoid, dnbtracker.org ) einen den gewünschten Torrent heraus und lädt ihn auf Seine Festplatte oder öffnet ihn gleich mit seinem BitTorrent-Client.
2. Der Client parst die .torrent-Datei
Für die Kommunikation mit dem Tracker sind nur ein Paar Informationen aus der Metafile interessant (Metafile Infos im ersten Teil)
- der info hash
- die announce urls
3. Der Client kontaktiert den Tracker und sendet ihm den SHA Hash
Die Tracker-Kommunikation läuft über HTTP.
Der Client Schickt einen GET-Request an den Tracker.
Dieser Request besteht aus:
- announce url
- info hash – der SHA1 Hash des Info Dictionaries
- peer id
- port
- uploaded
- downloaded
- left
- compact
- event
Optional aber auch interessant ist:
- key (damit der Tracker einen Client auch nach einem reconnect mit neuer IP wiedererkennt)
Ein Request an einen Tracker könnte dann wie folgt aussehen ( der Tracker laeuft auf example.com):
- http://example.com/announceUrl+”?info_hash=”+urlencode(info)+”&peer_id=-ST-0001%29%7B%D6%40%F4%21%7B%5C%DA%05%DE&port=6881&uploaded=0&downloaded=0&left=0&compact=1&event=started”
Der Tracker erfährt damit von uns folgende Informationen:
- den Hash von der Info-Map (info_hash)
- nsere Peer-ID (peer_id) [zur ID bald mehr]
- den Port auf dem unser Client lauscht (port)
- wir haben noch 0 Pieces hochgeladen (uploaded=0)
- wir haben 0 Pieces heruntergeladen (downloaded=0)
- wir möchten eine Peer-Liste im Kompakten Format (compact=1), das ist auch üblich so. Das alte Format wird praktisch kaum noch genutzt.
- mit dem Event (event=started) teilen wir dem Tracker mit das wir gerade erst mit dem Download beginnen.
4. Tracker Antwort
Der Tracker antwortet mit einer Liste von Peers. Aus dieser Liste kann der Client entnehmen welche Peers die File besitzen. Ob Sie die ganze File besitzen oder nur Fragmente (aus dieser Information wird die obligatorische anzeige der Seeder [complete] bzw Peers [incomplete] realisiert).
Zu den Einzelnen Peers sind die Informationen die dieses bei ihrem Request an den Tracker übertragen haben enthalten, also:
- peer_id
- port
- ip
Zusätzlich teilt einem der Tracker den Intervall mit in dem man diese Informationen auffrischen sollte, bzw einen erneuten Request an den Tracker schicken sollte. Clients sollten sich daran halten um ein hämmern bzw Sinnlosen Overhead zu unterbinden.
Das war es für diesen Teil im großen und ganzen. Ein kleiner überblick auf die Tracker Kommunikation.
Ganz Informativ zu diesem Thema ist auch der Vortrag “Tracker fahrn” (@24C3 – download via http://chaosradio.ccc.de/24c3_m4v_2355.html) von Erdgeist, Denis und Cristian Yxen.
Im nächsten Teil wird es um die Kommunikation unter den Peers gehen.
Tagged: bittorrent, Coding, p2p