Die Libtorrent 2.0 bringt unter anderem Support für BitTorrent 2 mit. Das rangiert SHA-1 aus, verwendet Merkle-Hash-Trees, um die Piece Hashes zu verschlanken und verbessert den Umgang mit ausufernden Verzeichnisstrukturen.
Begonnen wurde die Arbeit am BitTorrent-v2-Protokoll, als Google entdeckte, dass SHA-1 nicht mehr sicher ist. Als klar wurde, dass die Hashfunktion mit dem Einführen von SHA-256 nicht mehr rückwärtskompatibel zu BitTorrent v1 sein wird, verbesserten die Entwickler auch gleich noch ein paar andere Dinge. Die nicht kompatiblen Komponenten von BitTorrent v2 sind aber laut Blogpost klar gekennzeichnet, was hybride Torrents ermöglicht, die gleichermaßen an v1- und v2-Schwärmen teilnehmen dürfen. So verwenden die v1-Infohashes zum Beispiel “urn:btih:” als Präfix, die v2-Versionen “urn:btmh:”, wobei ein Magnet-Link auch beide Infos-Hashes zugleich verwenden darf.
Hash-Bäume
Bislang hasht BitTorrent alle Splitter einer großen Datei, was die “.torrent”-Dateien mitunter recht stark aufbläst. BitTorrent v2 setzt dafür auf Merkle Hash Trees, die auch bei der Blockchain zum Einsatz kommen und bei denen es genügt, den Root-Hash zu kennen, um die anderen Hashes davon abzuleiten. Diese Trees werden für die Pieces, also die Teile einer Datei, eingesetzt, wobei die “Blätter” der Bäume jeweils 16 kiB groß sein dürfen. Das reduziert die Torrent-Metadaten und macht die “.torrent”-Dateien deutlich kleiner, Magnet-Links deutlich effizienter. Zugleich lassen sich fehlerhaft heruntergeladene Daten und die dazugehörigen Peers schneller verifizieren, was erneute Downloads wesentlich effizienter macht. Auch interessant: BitTorrent v2 bildet Hash Trees auch für die Dateien selbst. Das erlaubt es, identische Dateien einfach zu identifizieren und über Schwärme hinweg zu verteilen.
Pfade verschwinden lassen
Bei Torrents mit vielen kleinen Dateien verbraucht nicht das Info-Dictionary den meisten Platz, sondern die Dateilisten mitsamt den Pfaden der Dateien. BitTorrent v2 enkodiert diese Verzeichnisstrukturen eleganter und verwendet dazu ebenfalls Trees und Bencode-Wörterbücher. Das erlaubt es zum Beispiel, Verzeichnisnamen, die bei jeder Datei auftauchen, auf eine Nennung zu reduzieren, was die Dateilisten kleiner macht. Änderungen betreffen auch die Größen der Dateisplitter, die nun einerseits eine Potenz von zwei sein muss und andererseits größer oder gleich 16 Kibibyte.
Die neuen SHA-256-Hashes sind übrigens 32 statt 20 Bytes lang. Das bereitet jedoch Probleme mit DHT (Distributed Hash Tables) und Trackern, die nach 20-Byte-Hashes Ausschau halten. In der Folge sind die v2-Hashes auf 20 Bytes gekürzt und gibt es nun eben jeweils zwei Hashes, einen für BitTorrent v1 und einen für v2. Die Libtorrent erkennt, ob Peers tatsächlich schon BitTorrent v2 unterstützen oder nicht.
Encoding-Vorgaben und Beispiele
Auch am Encoding der Baumstruktur von “.torrent”-Dateien haben die Entwickler geschraubt. Hintergrund ist, dass bestimmte Encodings zwar nicht gewollt sind, aber sich dennoch parsen lassen, was später zu Problemen führt. Libtorrent lädt daher bestimmte Torrents nicht mehr, die gegen die Encoding-Vorgaben verstoßen. Die Regeln für richtige Schreibweisen liefert der Blogpost. Dort sind auch Beispiele für reine v2- und Hybrid-Torrents verlinkt sowie ein Referenz-Torrent-Creator in Python.





