BitTorrent

Protocole inter clients

Une fois que la liste des clients possédant les données à télécharger a été récupérée sur le Tracker, le client va se connecter à certains d'entre eux pour commencer l'échange des données

Etats d'un client

Un client, tout au long de l'échange, va maintenir différents états :

Un morceau de données est téléchargé chez un client, si celui-ci n'est pas dans l'état "choked" et que le client récepteur est à l'état "interested".
Un morceau de données est envoyé à un client, si celui-ci est à l'état "interested" et que le client émetteur n'est pas dans l'état "choked".
Il est important pour un client de maintenir ses clients informés de son état. Cette information doit etre maintenue quand l'état d'un client est "choked".

Types de données

Il est important de savoir que pour tous les paquets échangés entre les clients, les types entiers sont encodés sur 4 octets à la norme Big-Endian. Ceci concerne tout particulièrement la longueur indiquée par chacun des paquets de données envoyées suite à la poignée de main (handshake)

Format des trames

Tout d'abord, une trame initiale, de connexion est échangée entre les clients, c'est la poignée de main (handshake). Une fois cet échange effectué des trames décrites plus loin sont échangées.

Handshake

pstrlen (1 octet) pstr (pstrlen octets) reserved (8 octets) info_hash (20 octets) peer_id (20 octets)

Description des différents champs :

Dans la version 1.0 du protocole BitTorrent, pstren=19, et pstr="BitTorrent protocol".

Autres messages

Les autres messages échangés suite à la poignée de main sont de la forme suivante :
length prefix (4 octets) message ID (1 octet) payload ((length prefix + 1) octets)

Il faut rappeler que le champ "length prefix" est encodé à la norme Big-Endian

length prefix message ID payload Nom du message Description
0000 0   keep-alive Message envoyé toutes les 2 minutes (ce délai peut être modifié) pour indiquer la présence du client
0001 1   choke Message pour indiquer qu'un client est choqué
0001 1   unchoke Message pour indiquer qu'un client n'est plus choqué
0001 2   interested Message pour indiquer qu'un client est interessé
0001 3   not interested Message pour indiquer qu'un client n'est plus intéressé
0005 4 piece index have Message indiquant l'indice du morceau qu'un client vient de télécharger et de vérifier, et qui est donc récupérable
0001+X 5 bitfield bitfield Message de taille variable contenant une répresentation des morceaux disponibles d'un client
00013 6
index (4 octets) begin (4 octets) length (4 octets)
request Message utilisé pour demander un morceau de données (avec index : indice du morceau, begin : offset à l'intérieur du morceau, length : longueur du morceau désiré
0009+X 7
index (4 octets) begin (4 octets) block (X octets)
piece Message contenant le morceau demandé avec le message "request" avec comme informations : index : indice du morceau, begin : offset à l'intérieur du morceau, block : tableau d'octets du morceau
00013 8
index (4 octets) begin (4 octets) length (4 octets)
cancel Message utilisé pour annuler la demande de morceau (requete "request")

Valid XHTML 1.0!