Thorrent

Sign in or create your account | Project List | Help

Thorrent Commit Details

Date:2010-03-14 17:58:45 (5 months 21 days ago)
Author:Antoine Millet
Commit:e848749fcb4b9156cde6805d52283ebdd3c5403a
Message:Ajout de la doc (pas finalisée)

Files: doc/index.html (1 diff)
doc/medias/style.css (1 diff)

Change Details

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>
doc/medias/style.css
1body {
2    width: 50em;
3    margin: 0 auto 0 auto;
4    font-family: sans-serif;
5    font-size: 100%;
6}
7
8h1 {
9    text-align: center;
10    background: green;
11}
12
13h2 {
14    background: #F2F2F2;
15    padding: 0.4em;
16    border-bottom: solid 0.05em #CCCCCC;
17    border-right: solid 0.05em #CCCCCC;
18}
19
20h2, h3, h4, h5, h6 {
21    color: #355F7C;
22}
23
24a {
25    color: #6D8B9F;
26}
27
28pre {
29    margin: 1em;
30    margin-bottom: 1em;
31    background: #EEFFCC;
32    border-top: solid 0.05em #AACC99;
33    border-bottom: solid 0.05em #AACC99;
34    padding: 0.5em;
35    color: #363A48;
36}
37
38#menu {
39    display: none;
40    text-align: center;
41    font-size: 80%;
42}
43
44#menu li {
45    list-style-type: none;
46    display: inline;
47}
48
49#menu li:before {
50    color: #355F7C;
51    content: " — ";
52}
53
54#menu li:first-child:before {
55    content: "";
56}
57
58#menu li a {
59    color: black;
60    text-decoration: none;
61    padding: 0.5em;
62}
63
64#menu li a:hover {
65    background: #F2F2F2;
66}

Archive Download the corresponding diff file

Branches:
master