| doc/index.html |
| 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| 2 | <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="fr-FR"> |
| 3 | <head> |
| 4 | <title>Thorrent</title> |
| 5 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
| 6 | <link rel="stylesheet" type="text/css" href="medias/style.css" media="screen, projection" /> |
| 7 | <!-- latex: \usepackage{verbatim} --> |
| 8 | <!-- latex: |
| 9 | \author{Aurélien Dunand et Antoine Millet} |
| 10 | \date{ |
| 11 | \normalsize{\textbf{3ème année de licence d'informatique}} |
| 12 | \vspace{5cm} |
| 13 | } |
| 14 | |
| 15 | --> |
| 16 | </head> |
| 17 | <body> |
| 18 | <!-- latex: |
| 19 | \maketitle |
| 20 | \renewcommand{\contentsname}{Sommaire} |
| 21 | \tableofcontents |
| 22 | \clearpage |
| 23 | |
| 24 | --> |
| 25 | |
| 26 | <!-- latex: \begin{comment} --> |
| 27 | <h1>Thorrent</h1> |
| 28 | <ul id="menu"> |
| 29 | <li><a href="#description">Description</a></li> |
| 30 | <li><a href="#problemes">Problèmes</a></li> |
| 31 | <li><a href="#sources">Sources</a></li> |
| 32 | <li><a href="#binaires">Binaires</a></li> |
| 33 | <li><a href="#captures">Captures d'écrans</a></li> |
| 34 | <li><a href="#conclusion">Conclusion</a></li> |
| 35 | <li><a href="../javadoc/index.html">Javadoc</a></li> |
| 36 | </ul> |
| 37 | <!-- latex: \end{comment} --> |
| 38 | <div id="content"> |
| 39 | <h2 id="description">Description du projet</h2> |
| 40 | <p>Thorrent est un projet de client et serveur pour le protocole de partage |
| 41 | de fichier peer-to-peer Bittorrent. Il est séparé en plusieurs éléments :</p> |
| 42 | |
| 43 | <ul> |
| 44 | <li>Le client qui permet de télécharger des fichiers auprès d'autres clients.</li> |
| 45 | <li>Le tracker, qui permet de mettre en relation les clients.</li> |
| 46 | <li>Des bibliothèques communes qui permettent la réutilisation de code au sein du projet.</li> |
| 47 | </ul> |
| 48 | |
| 49 | <p>Le client <em>tget</em> permet de télécharger les fichiers représenté par un .torrent. |
| 50 | C'est un outils à la ligne de commande qui à l'instar de wget permet de |
| 51 | télécharger un fichier à la fois.</p> |
| 52 | |
| 53 | <p><em>Thor</em> est la partie tracker, il se charge de mettre en relation les différents client |
| 54 | qui partagent un même fichier, identifié par un hash SHA-1, qui est le hash |
| 55 | d'une partie du .torrent. Thor est composé d'un serveur web simplifié qui gère |
| 56 | les requêtes GET faites sur le chemin /announce, à partir de ces requêtes le |
| 57 | tracker va récupérer la liste des peers qui téléchargement également le fichier |
| 58 | demandé et les retourner aux clients sous forme bencodé.</p> |
| 59 | |
| 60 | <p>Le fichier .torrent est un fichier téléchargé à part (par exemple, sur un site web) |
| 61 | qui contient des informations relatives au téléchargement : URL du tracker, hashs sha-1 |
| 62 | des morceaux à télécharger, etc. Il est utilisé par le client pour initier le téléchargement.</p> |
| 63 | |
| 64 | |
| 65 | <h2 id="problemes">Problèmes rencontrés</h2> |
| 66 | |
| 67 | <p>Les problèmes rencontrés au cours du développement ont été multiples. Le |
| 68 | protocole de Bittorrent est en effet très complexe et demande de multiples |
| 69 | petites couches d'abstraction pour être implémenté.</p> |
| 70 | |
| 71 | <h3>Bencoding</h3> |
| 72 | |
| 73 | <p>Les fichiers .torrents et les réponses du tracker sont en format |
| 74 | <a href="http://wiki.theory.org/BitTorrentSpecification#bencoding">Bencodé</a>, |
| 75 | le premier problème a été de décoder le contenu de ces messages pour en |
| 76 | extraire les informations.</p> |
| 77 | |
| 78 | <p>Le bencoding permet de représenter quatres types de valeurs :</p> |
| 79 | |
| 80 | <ul> |
| 81 | <li>Des chaines de caractères (qui peuvent aussi |
| 82 | bien contenir des chaines UTF-8 que des données binaires plus générales)</li> |
| 83 | <li>Des entiers</li> |
| 84 | <li>Des listes, contenant n'importe lequel de ces quatres |
| 85 | types.</li> |
| 86 | <li>Des dictionnaires, associant une chaine de caractère |
| 87 | avec l'un de ces quatres types.</li> |
| 88 | </ul> |
| 89 | |
| 90 | <p>Pour cela, nous avons créé une bibliothèque : bencoding. Cette dernière permet |
| 91 | de lire un flux d'entrée et de générer un arbre représentant le contenu |
| 92 | du flux (fichier .torrent ou réponse du tracker).</p> |
| 93 | |
| 94 | |
| 95 | <h3>Connexion asynchrones</h3> |
| 96 | |
| 97 | <p>Le protocole Bittorrent requiert un grand nombre de connexions entre |
| 98 | les différents client pour s'échanger des morceaux de fichiers. Afin |
| 99 | d'éviter de créer de nombreux threads, nous avons décidé de nous |
| 100 | orienter vers l'utilisation de connexions non blocantes associées |
| 101 | un mécanisme de selection proposé par l'api Java : les channels.</p> |
| 102 | |
| 103 | <p>Le principe est de gérer les multiples connexions dans un seul |
| 104 | et même fil d'exécution. Une boucle permet de "parcourir" les connexions |
| 105 | pour lire les données reçues par chacune d'entre elles. Les connexions étant |
| 106 | non blocante, il faut donc gérer un tampon par connexion qui sera remplit petit |
| 107 | à petit.</p> |
| 108 | |
| 109 | <p>Quand le tampon est remplit, son contenu est traité, on le vide et on |
| 110 | recommence.</p> |
| 111 | |
| 112 | <h3>Les valeurs non signée en java</h3> |
| 113 | |
| 114 | <p>Un des problèmes qui c'est posé avec la manipulation des données binaires |
| 115 | est que les valeurs en java et les valeurs des flux binaires n'étaient |
| 116 | pas les mêmes. En java, les valeurs sont signé, alors que celles que l'on |
| 117 | récupère dans nos flux binaires sont non-signés.</p> |
| 118 | |
| 119 | <p>Pour palier à ce problème il faut utiliser un type plus grand que |
| 120 | celui demandé (utiliser un short pour stocker un unsigned byte, un |
| 121 | long pour un unsigned int, ...). Pour manipuler ces derniers, il a |
| 122 | donc fallu écrire diverses fonctions constituées de déclage et masque |
| 123 | binaire pour lire et écrire des valeurs non signés.</p> |
| 124 | |
| 125 | <h2 id="sources">Sources</h2> |
| 126 | |
| 127 | <p>Les sources se trouvent dans le répertoire <a href="src/">src/</a>, et |
| 128 | il est aussi possible de les récupérer avec le <em>source code manager</em> Git :</p> |
| 129 | |
| 130 | <pre>$ git clone git://idevelop.org/thorrent.git</pre> |
| 131 | |
| 132 | <h2 id="binaires">Binaires</h2> |
| 133 | |
| 134 | <p>Les jar du projet sont séparées en deux, le client, Tget, et le tracker, Thor :</p> |
| 135 | |
| 136 | <ul> |
| 137 | <li><a href="">Tget.jar</a></li> |
| 138 | <li><a href="">Thor.jar</a></li> |
| 139 | </ul> |
| 140 | |
| 141 | <p>Le projet à été séparé en plusieurs packages pour faciliter la réutilisation de code, |
| 142 | Tget et Thor ont donc tout les deux besoin de Bencoding.jar et Helpers.jar en temps |
| 143 | que bibliothèque externe pour fonctionner.</p> |
| 144 | |
| 145 | <h2 id="conclusion">Conclusion</h2> |
| 146 | |
| 147 | <p>Au cours de ce projet nous avons pu mettre en œuvre différentes notions |
| 148 | de nos cours de Technologie Internet</p> |
| 149 | |
| 150 | </div> |
| 151 | </body> |
| 152 | </html> |