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 :
- choked : Indique si le client a été choqué. Ainsi quand un client choque un autre client, ceci indique qu'aucunes réponses ne sera envoyées par le client choqué tant que son étant n'aura pas changé. Aucunes requetes ne doit ainsi être envoyées à un client choqué.
- interested : Indique si le client est intéréssé par ce qu'un client peut lui offrir. Dans ce cas des requêtes peuvent être envoyées au client, celui-ci devant normalement répondre.
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 :
- pstrlen : Longueur de la chaîne pstr
- pstr : Identifiant du protocole
- reserved : 8 octets réservés. Ils sont généralement à 0
- info_hash : code de hashage du Dictionary "info" du fichier Torrent
- peer_id : Identifiant unique du client. C'est le même que celui qui avait été transmis au Tracker
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) |
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 |
|
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 |
|
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 |
|
cancel | Message utilisé pour annuler la demande de morceau (requete "request") |