Pour un petit proof-concept, j'ai décidé de tenter la connexion à un tracker via PHP.
Subtilité du protocole
Premièrement, avant de débuter quoique ce soit, il est nécessaire de trouver comment vous aller communiquer.
Je vous conseille de rechercher dans votre Google "Bittorrent Specs". Deux sites apparaissent, l'officiel et un wiki très bien documenté.
Il faut savoir que ce protocole utilise un système de codage très sympathique, pour ses communications, le bencode. Il permet des listes, dictionnaires, entiers et chaines.
Commençons.
Pour se connecter à un tracker, il va nous falloir un identifiant du fichier torrent, il est unique, c'est le info_hash. Pour l'obtenir, il faut faire une petite opération sur le fichier torrent. Ouvrez par exemple le torrent de Pioneer One avec HxD.
Voici ce que vous devriez obtenir, il s'agit d'un hexdump :

Vous avez un exemple de bencode avec par exemple "infod5:filesld6:lengthi1219[...]", on a donc un dictionnaire "info".
J'en reviens à mon info_hash, pour l'obtenir, sélectionnez TOUT le contenu de info, cela commence à "d5" et cela s'arrête à l'avant-dernier "e". Allez dans le menu "Analyse > Sommess de contrôle" , choisissez SHA-1 et cochez "Sélection".

Le "hash" apparaîtra en bas de la fenêtre.

Qui est donc : 38EDEE1E687462442E40FA8E988D67F198AE7DFC
Si vous avez un doute, ouvrez le torrent dans votre logiciel de Torrent.
Avant de le passer en paramètre au tracker, il faut le hash, mais il faut aussi le convertir
Note that all binary data in the URL (particularly info_hash and peer_id) must be properly escaped. This means any byte not in the set 0-9, a-z, A-Z, '.', '-', '_' and '~', must be encoded using the "%nn" format, where nn is the hexadecimal value of the byte. (See RFC1738 for details.)
For a 20-byte hash of \x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a,
The right encoded form is %124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
Ainsi, il faut découper le hash par paquet de deux lettres et voir si elles existent en ASCII (c'est de l'hexa).
38 ED EE 1E 68 74 62 44 2E 40 FA 8E 98 8D 67 F1 98 AE 7D FC
S'il y a correspondance (qui est dans l'intervalle A-Z, a-z ou 0-9), on remplace par le caractère, sinon, on laisse le code (en minuscule) avec un % au début.
Ce qui donne donc avec le hash de Pioneer One :
8%ed%ee%1ehtbD.%40%fa%8e%98%8dg%f1%98%ae%7d%fc
Nous pouvons désormais questionner le tracker http://tracker.vodo.net:6970/announce.
On contacte un tracker avec une requête GET toute simple.
Ainsi, pour obtenir des infos du tracker
http://tracker.vodo.net:6970/announce?info_hash=8%ed%ee%1ehtbD.%40%fa%8e%98%8dg%f1%98%ae%7d%fc&peer_id=%111111111111111111111&port=10930&uploaded=0&downloaded=0&left=1253704885&event=started&numwant=1000&compact=0
Quelques précisions s'imposent.
info_hash, on l'a vu.
peer_id, c'est votre identifiant, il est généré aléatoirement sans aucune règle, néanmoins, il faut qu'il soit avec un % et d'une longueur de 20 caractères (ici, un % suivi de 20 "1"). Nous verrons plus tard qu'il s'agit d'un moyen d'identifier le logiciel client.
port, le port sur lequel vous allez discuter avec les autres.
uploaded, la quantité de données envoyée.
downloaded, la quantité de données reçues.
left, la quantité qu'il reste à recevoir.
event, votre état (started, stopped, completed).
compact, si vous acceptez une liste des peers compacte.
Une fois que vous avez envoyé la requête, le tracker devrait vous envoyer une réponse :

C'est pas toujours sous forme de fichier, mais là, comme le port était différent du web, Firefox a décidé de l'enregistrer.
De retour sous HxD, ouvrez votre fichier.

Si c'est pas magnifique, vous avez maintenant la liste de 300 IPs contenue dans un fichier d'1Ko de peers prêts à communiquer avec vous.
Vous ne les voyez pas ? Vous êtes sûrs ?
Et si je vous dis de prendre sur la colonne du milieu 4 bits comme ça :

Et ensuite, d'entrer chacun des bits dans le mode calculette programmeur en Hexa et de passer en Décimal ?

N'est-ce pas étonnant de trouver une forme pratiquement similaire à une IP dans un fichier qui est une base pour faire vos transferts de pair à pair ?
Il y a tout de même une petite subtilité. Tous les nombres ne sont pas des IPs. Il y a en effet les PORTS des IPs qui s'étalent sur deux octets (16*16*16*16 = 65 536 et il y a 65 536 ports logiciels disponibles : logique).
Passons à la pratique
Vous voyez tout ce qu'on vient de se farcir ? Ben maintenant, on va le faire en PHP ! (*rire démoniaque*).
Mais don't worry, pleins de fonctions existent pour vous faciliter la vie !
Ce sera dans la prochaine "journée coding"
.