Files
i2p.www/www.i2p2/pages/techintro_fr.html
2011-03-19 07:53:55 +00:00

857 lines
65 KiB
HTML

{% extends "_layout_fr.html" %}
{% block title %}Présentation d'I2P{% endblock %}
{% block content %}
<center>
<b class="title">
<h1>I2P: <font size="3">Une plate-forme modulaire pour la communication anonyme</font></h1>
</b>
</center>
Traduction (en cours) de mars 2011. <a href="techintro.html">Version anglaise actuelle</a>
<div id="toc">
<h2>Table des matières</h2>
<ul>
<li><a href="#intro">Introduction</a></li>
<li>
<a href="#op">Fonctionnement d'I2P</a>
<ul>
<li><a href="#op.overview">Aperçu</a></li>
<li><a href="#op.tunnels">Tunnels</a></li>
<li><a href="#op.netdb">Base de donnée du réseau</a></li>
<li><a href="#op.transport">Protocoles de transport </a></li>
<li><a href="#op.crypto">Cryptographie</a></li>
</ul>
</li>
</ul>
</div>
<br/>
<h1 id="intro">Introduction</h1>
<p>
I2P est une couche réseau par paquets commutée, modulaire, à tolérance de panne, auto-adaptative, et anonyme
sur laquelle peuvent fonctionner n'importe quel nombre d'applications conçues pour l'anonymat ou la sécurité.
Chacune de ces applications peut gérer ses propres contraintes d'anonymat, de latence et de débit,
sans avoir à se soucier d'une implémentation correcte d'un
<a href="http://en.wikipedia.org/wiki/Mix_network">réseau croisé (mixnet)</a>
d'accès libre qui leur permet de mêler leur activité au grand groupe d'utilisateurs anonymisés
déjà présents sur I2P.
</p>
<p>
Des applications d'ores et déjà disponibles offrent un large éventail de fonctionnalités Internet classiques
<b>mais anonymes</b>: exploration web, hébergement, chat, partage de fichiers, e-mail,
blogs et publications simultanées, newsgroups, tout comme plusieurs autres applications en cours de développement.
<ul>
<li>Exploration web: en utilisant tout navigateur compatible avec un serveur mandataire (proxy).</li>
<li>Chat: IRC, Jabber, <a href="#app.i2pmessenger">I2P-messenger</a>, ou tout autre compatible proxy.</li>
<li>Partage de fichiers: <a href="#app.i2psnark">I2PSnark</a>, <a href="#app.robert">Robert</a>,
<a href="#app.i2phex">I2Phex</a>, <a href="#app.pybit">PyBit</a>, <a href="#app.i2pbt">I2P-bt</a>
et d'autres.
</li>
<li>E-mail: <a href="#app.i2pmail">susimail</a> et <a href="#app.i2pbote">I2P-Bote</a>.</li>
<li>Newsgroups: via un lecteur de newsgroups compatible proxy.</li>
</ul>
<p>
Contrairement aux sites web hébergés sur des réseaux de distribution de contenu comme
<a href="#similar.freenet">Freenet</a> ou <a href="http://www.ovmj.org/GNUnet/">GNUnet</a>,
les services hébergés sur I2P sont totalement interactifs: il y des moteurs de recherches traditionnels,
des BBS, des blogs sur lesquels vous pouvez déposer des commentaires, des sites pilotés par bases de données,
et des ponts pour interroger les systèmes statiques comme Freenet sans devoir en faire une installation locale.
</p>
<p>
Grâce à toutes ces applications prenant l'anonymat en considération, I2P prend le rôle
de plaque tournante "orientée messages": les applications demandent à envoyer des données
à un identifiant cryptographique (une "destination") et I2P prend soin de s'assurer qu'elles
y parviennent en toute sécurité et anonymat. I2P fournit aussi une bibliothèque simple pour les
<a href="#app.streaming">flux</a> (streaming) pour permettre le transfert fiable et ordonné de messages
de flux anonymes, en offrant de façon transparente un algorithme de contrôle de congestion basé sur TCP
et optimisé pour les applications à haute bande passante au sein réseau.
Bien qu'il y ait eu plusieurs simple mandataires SOCKS disponibles pour attirer des applications existantes
dans le réseau, leur intérêt a été limité car preque toutes exposent intrinsèquement ce qui, du point de vue
de l'anonymat, s'avère être des informations sensibles. La seule façon d'avancer est d'analyser complètement
une application pour s'assurer d'un fonctionnement irréprochable, et pour y aider, nous fournissons
une série d'API dans divers langages, qui permettent d'en faire le plus possible en dehors du réseau.
</p>
<p>
I2P n'est pas un projet de recherche (universitaire, commercial, ou gouvernemental), mais un effort
d'ingénierie dont le but est de faire tout le nécessaire pour assurer
un niveau d'anonymat suffisant à ceux qui en ont besoin. Il est en développement actif
depuis les débuts de 2003 avec un développeur à temps plein et un groupe dédié de
contributeurs à temps partiel répartis dans le monde entier. Tout le travail fourni pour I2P
est "open source" et gratuitement disponible sur le <a href="index_fr.html">site</a>,
pour lequel la plus grande partie du code est publié directement dans le domaine public, bien que
faisant usage de quelques routines cryptographiques sous licences de style BSD. L'équipe d'I2P
ne contrôle pas le cadre légal de publication des applications tierce partie. Il y a plusieurs
applications disponibles sous licence GPL (<a href="#app.i2ptunnel">I2PTunnel</a>,
<a href="#app.i2pmail">susimail</a>, <a href="#app.i2psnark">I2PSnark</a>,
<a href="#app.i2phex">I2Phex</a> et d'autres).
Le <a href="http://www.i2p.net/halloffame">financement</a> d'I2P vient entièrement de dons,
et ne bénéficie pour l'instant d'aucune dispense d'impôts de la part de quelque juridiction que ce soit,
vu que la plupart des développeurs sont anonymes.
</p>
<h1 id="op">Fonctionnement</h1>
<h2 id="op.overview">Aperçu</h2>
<p>
Pour comprendre le fonctionnement d'I2P, quelques concepts fondamentaux sont prérequis.
Tout d'abord, I2P fait une séparation stricte entre le logiciel participant au réseau
(un "routeur") et les point terminaux anonymes (les "destinations") associés aux applications particulières.
Que quelqu'un utilise I2P n'est généralement pas un secret. Ce qui est caché, c'est
c'est tout ce que l'utilisateur en fait, aussi bien qu'à quelle destination particulière le routeur est connecté.
En général, l'utilisateur dispose sur son routeur de plusieurs destinations locales: une, par exemple,
pour se connecter en proxy aux serveurs IRC, une autre pour héberger son propre site Internet
anonyme ("eepsite"), une autre pour une instance I2Phex, une autre encore pour les torrents, etc...
</p>
<p>
Un autre concept majeur est celui de "tunnel".
Un tunnel un chemin orienté passant par une liste de routeurs explicitement sélectionnés.
Un cryptage en couches est utilisé pour que chacun des routeurs n'en puisse décrypter qu'une seule.
L'information décryptée contient l'IP du routeur suivant, avec l'information cryptée à faire suivre.
Chaque tunnel a un point de départ (le premier routeur, appelé "passerelle")
et un point terminal. Les messages ne peuvent être envoyés que dans un seul sens. Pour les réponses,
un autre tunnel est nécessaire.
</p>
<center>
<div class="box">
<img src="_static/images/tunnels_fr.png" alt="Schéma de tunnels entrant et sortant"
title="Schéma de tunnels entrant et sortant" />
<br /><br />
Figure 1: Les deux types de tunnels: entrant et sortant.
</div>
</center><br/>
<p>
Il y deux types de tunnels:
Les <b>tunnels "sortants"</b> expédient des messages depuis le créateur du tunnel, alors
que les <b>tunnels "entrants"</b> ramènent des messages vers le créateur du tunnel.
La combinaison de ces deux tunnels permet aux utilisateurs de s'envoyer des messages les uns aux autres.
L'expéditeur ("Alice" dans l'illustration ci-dessus) crée un tunnel sortant,
et le récepteur ("Bob" ci-dessus) crée un tunnel entrant.
La passerelle d'un tunnel entrant peut recevoir des messages de n'importe quel autre utilisateur
et les envoie jusqu'au point terminal ("Bob").
Le point terminal du tunnel sortant devra pouvoir envoyer le message vers la passerelle du tunnel entrant.
Pour le permettre, l'expéditeur ("Alice") ajoute à son message crypté des instructions cryptées à l'intention
du point terminal sortant. Une fois décryptées par celui-ci, il dispose alors des informations nécessaires
au tranfert vers la bonne passerelle entrante (la passerelle vers "Bob").
</p>
<p>
Le troisième concept fondamental est la <b>"base de données"</b> I2P (ou "netDb"):
une paire d'algorithmes utilisés pour le partage des métadonnées du réseau. Les deux types de métadonnées
transportées sont la <b>"routerInfo"</b> et les <b>"jeux de baux"</b> (leaseSets):
la routerInfo donne aux routeurs les données nécessaires pour contacter un autre routeur particulier
(ses clés publiques, adresse de transport, etc...), et les jeux de baux donnent au routeurs les informations
nécessaires pour joindre une destination particulière. Un jeu de baux contient un certain nombre de "baux".
Chacun de ces baux indique une passerelle de tunnel qui permet d'atteindre une destination particulière.
Détail complet des informations contenues dans un bail:
<ul>
<li>Passerelle entrante pour un tunnel permettant d'atteindre une certaine destination.</li>
<li>Moment d'expiration du tunnel.</li>
<li>Paire de clés publiques pour pouvoir crypter les messages (à envoyer à travers le tunnel
et atteindre la destination).</li>
</ul>
Les routers envoient eux-mêmes directement leur "routerInfo" à la base de données,
alors que les jeux de baux sont envoyés par des tunnels sortants (ils doivent rester anonymes, pour
empêcher toute tentative de corrélation entre un routeur et ses jeux de baux).
</p>
<p>On peut combiner les trois concepts exposés ci-dessus pour établir des connexions effectives dans le réseau.
</p>
<p>
Pour créer ses propres tunnels entrants et sortants, Alice fait une recherche dans la "netDb" pour obtenir
des "routerInfo".
De cette façon, elle constitue des listes de pairs qu'elle peut utiliser en tant que sauts dans ses tunnels.
Ensuite elle peut envoyer au premier saut un message élaboré, demandant la création d'un tunnel, et de faire passer
cette demande plus loin, jusqu'à ce que le tunnel soit entièrement créé.
</p>
<center>
<div class="box">
<img src="_static/images/netdb_get_routerinfo_1_fr.png" alt="Demande d'informations sur d'autres routeurs"
title="Demande d'informations sur d'autres routeurs" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src="_static/images/netdb_get_routerinfo_2_fr.png"
alt="Construction d'un tunnel grâce aux informations sur les routeurs"
title="Construction d'un tunnel grâce aux informations sur les routeurs" />
<br /><br />
Figure 2: Les informations sur les routeurs servent à construire les tunnels.
</div>
</center><br/>
<p>
Quand Alice désire envoyer un message à Bob, elle recherche tout d'abord dans la netDb
un jeu de baux de Bob, ce qui lui donne ses passerelles entrantes de tunnels.
Elle choisit ensuite un de ses tunnels sortants et y envoie le message avec les
instructions pour le point terminal afin qu'il fasse suivre le message à l'une des
passerelles de tunnels entrants de Bob. Quand le point terminal reçois ces instructions,
il transfère le message comme demandé, et quand la passerelle de tunnel entrant de Bob le reçoit,
elle le transfère dans le tunnel vers le routeur de Bob. Si Alice veut que Bob puisse répondre,
elle doit lui indiquer explicitement sa propre destination en tant qu'élément du message lui-même.
On y parvient en introduisant une couche de haut niveau, ce qui est fait par la bibliothèque de flux
<a href="#app.streaming">flux</a> (streaming).
Alice peut aussi raccourcir le temps de réponse en fournissant dans le message son jeu de baux le plus récent,
en sorte que Bob soit dispensé d'une requête à netDb quand il voudra répondre. Mais ceci est optionnel.
</p>
<center>
<div class="box">
<img src="_static/images/netdb_get_leaseset_fr.png" alt="Connexion de tunnels grâce au jeux de baux"
title="Connexion de tunnels grâce au jeux de baux" />
<br /><br />
Figure 3: Les jeux de baux sont utilisés pour connecter les tunnels sortants et entrants.
</div>
</center><br/>
<p>
De même que les tunnels ont eux-mêmes un cryptage étagé pour empêcher un dévoilement non autorisé
par les pairs au sein du réseau (comme la couche transport le fait elle-même pour protéger des pairs
les contenus en dehors du réseau), il est nécessaire d'ajouter une couche additionnelle
de cryptage de bout en bout pour cacher le message au point terminal sortant et à la passerelle entrante.
Ce cryptage "<a href="#op.garlic">en tête d'ail</a>" (garlic)
fait que le routeur d'Alice va "emballer" de multiples messages dans un seul message
(la tête d'ail="garlic message"), crypté pour une certaine clé publique en sorte que les pairs intermédiaires
ne puissent déterminer ni combien il y a de messages (des gousses ou caïeux si on veut pousser plus loin
l'analogie botanique) dans le bulbe, ni si ces messages sont amers ou sucrés (ce qu'ils disent), ni si ces gousses
vont servir à frotter un plat à cassoulet, finir fondus dans un gigot
ou hachés/grillés sur une dorade (à qui elles sont destinées). Pour une communication typique
de point à point entre Alice et Bob, la tête d'ail va être cryptée avec la clé publique annoncée
dans le jeu de baux de Bob, ce qui permet le cryptage sans donner la clé publique du routeur de Bob.
</p>
<p>
Une autre donnée importante qu'il faut garder à l'esprit, est qu'I2P est entièrement basé sur l'échange
de messages et que quelques messages pourraient se perdre en chemin. Les applications utilisant I2P peuvent
utiliser les interfaces "orientées messages" et s'occuper de leur propre contrôle de congestion et besoins de
fiabilité, mais elles seront mieux servies en utilisant la bibliothèque de <a href="#app.streaming">streaming</a>
fournie en vue de voir I2P comme un réseau "orienté flux".
</p>
<h2 id="op.tunnels">Les tunnels</h2>
<p>
Les tunnels entrants et sortants partagent les mêmes principes de fonctionnement.
La passerelle de tunnel accumule un certain nombre de messages, en les pré-traitant éventuellement
en vue d'une distribution dans le tunnel. Ensuite, elle crypte ces données préparées
et les transfère vers le premier saut. Ce pair et les participants suivants du tunnel
y ajoutent une couche de cryptage après avoir vérifié qu'il ne s'agit pas d'un doublon et avant
de le transférer au pair suivant. Le message arrive éventuellement au point terminal
où les messages sont de nouveau séparés et transférés comme demandé. La différence réside
dans l'action du créateur du tunnel: pour les tunnels entrants, le créateur est le point terminal,
et il déchiffre simplement toutes les couches ajoutées, alors que pour les tunnels sortants,
le créateur est la passerelle, et il pré-déchiffre toutes les couches pour qu'une fois toutes
les couches de crytpage par saut ajoutées, le message arrive en clair au point terminal.
</p>
<p>
Le choix de pairs spécifiques pour passer les messages, ainsi que la définition de leur séquence,
est important pour une bonne compréhention de l'anatomie et des performances d'I2P.
Alors que la base de données dispose de ses propres critères de sélection lors du choix
des pairs à interroger et pour mémoriser les entrées correspondantes, les creators de tunnels utilisent
n'importe quels pairs du réseau et dans n'importe quel ordre (et même un nombre de fois indéfini) dans le
même tunnel. Si des données précises de latence et de capacité étaient globalement connues, la sélection et
le tri seraient pilotés par les besoins particuliers du client en relation avec leur modèle de sécurité.
Malheureusement, la latence et les capacités ne sont pas simples à collecter anonymement, et avoir besoin
besoin de pairs sans confiance établie pour fournir ces informations pose de sérieux problèmes d'anonymat.
</p>
<p>
Du point de vue de l'anonymat, la technique la plus simple serait de sélectionner des pairs au hasard
dans la totalité du réseau, de les trier aléatoirement, et de les utiliser dans cet ordre ad vitam æternam.
Mais pour les performances, la plus simple façon serait de ne retenir que les plus rapides disposant de la
réserve de capacité suffisante, de répartir la charge sur différents pairs pour gérer les défaillances
de façon transparente, et de recréer le tunnel chaque fois que l'information de capacité est modifiée.
alors que la première façon est à la fois fragile et inefficace, la seconde demande des informations
indisponibles et n'offre qu'un anonymat insuffisant.
I2P fonctionne plutôt en utilisant une gamme de stratégies de sélection des pairs,
couplée à du code d'évaluation du niveau d'anonymat pour organiser ces pairs selon leur profil.
</p>
<p>
À la base, I2P classe en permanance les pairs avec lesquels il interagit en mesurant indirectement
leur comportement: par exemple, quand un pair répond à une requête netDb en 1,3s,
cette latence d'aller-retour est enregistrée dans les profils pour tous les routeurs impliqués
dans les deux tunnels (entrant et sortant) au travers desquels la requête et la réponse sont passées,
ainsi que le profil du pair. Les mesures directes, telles que la latence de la couche transport ou la congestion,
ne sont pas utilisées en tant que données de profil car elles peuvent être manipulées au routeur mesurant,
l'exposant ainsi à des attaques basiques. En rassemblant ces profils, une série de calculs est lancée
sur chacun pour synthétiser ses performances: sa latence, sa capacité à gérer beaucoup d'activités, s'il est
actuellement surchargé, et à quel point il semble bien intégré au réseau.
Les résultats de ces calculs sont alors comparés pour les pairs actifs afin de
répartir les routeurs en quatre groupes: les rapides à hautes capacités, ceux de hautes capacités, les non
défaillants, et les défaillants. Les seuils de ces groupes sont déterminés dynamiquement, et comme ils n'utilisent
actuellement que des algorithmes assez simples, il y a d'autres possibilités.
</p>
<p> Pour utiliser ces données de profils, la stratégie de sélection la plus simple consiste à
les prendre aléatoirement dans le premier groupe (celui des plus rapides à fortes capacités),
et c'est ce qui est actuellement employé pour les tunnels clients.
Les tunnels exploratoires (utilisés pour les communications avec la base de données et la gestion des tunnels)
prennent les pairs aléatoirement dans le troisième groupe des non défaillants (qui inclut ceux du premier),
ce qui permet une base de sélection plus étoffée avec pour effet l'optimisation de la sélection
via une progression aléatoire. Ces stratégies laissent cependant fuir des informations concernant les pairs
du premier groupe utilisables par des attaques du type collecte de base de données et du type prédecessur.
En retour, il y a plusieurs alternatives qui bien que n'équilibrant pas la charge aussi uniformément,
bloquent les attaques lancées par certains types d'ennemis.
</p>
<p>
En sélectionnant une clé aléatoire et en triant les pairs selon leur distance "eXORisée" à cette clé,
la fuite d'information est réduite pour les attaques prédécesseur et collecte, suivant le taux de défaillance
des pairs et le renouvellement des seuils des groupes. Une autre stratégie simple pour parer aux
attaques par collecte de la netDb consiste simplement à obliger la passerelle entrante à figer
aléatoirement la position des pairs situés plus loin dans le tunnnel. Pour gérer les attaques de prédécesseur
par des adversaires que le client contacte, le point terminal de tunnel devrait aussi rester statique.
La sélection du pair à figer au point le plus vulnérable doit bien sûr être limitée en durée,
car tous les pairs sont suceptibles de défaillance, et donc elle doit soit être ajustée en réaction, ou
préventivement empêchée pour simuler le MTBF (temps moyen entre défaillances) mesuré d'autres routeurs.
Ces deux stratégies peuvent ensuite être combinées, en utilisant un pair vulnérable figé et un tri sur XOR
dans les tunnels eux-mêmes. Une stratégie plus stricte consisterait à définir les pairs précis et leur ordre
dans un tunnel potentiel, en utilisant uniquement de pairs qui accepteraient tous de participer de la même
façon à chaque fois. Ceci diffère du tri basé sur le résultat de l'XOR en ce que le prédécesseur
et le successeur de chaque pair serait toujours les mêmes, alors que le tri sur l'XOR ne permet que de s'assurer
que leur ordre ne change pas.
</p>
<p>
Comme déjà mentionné, I2P, actuellement en version 0.8 inclut la stratégie basée sur les groupes,
avec le tri basé sur le XOR. Une discussion plus poussée des mécanismes impliqués dans les opérations de tunnel
la gestion et la sélection des pairs est disponible sur la page
<a href="tunnel-alt.html">spécification des tunnels</a>.
</p>
<h2 id="op.netdb">Base de données</h2>
<p>
Comme indiqué précédemment, la base de données d'I2P sert à partager les métadonnées du réseau.
Ceci est détaillé sur la page <a href="how_networkdatabase.html">La base de données du réseau</a>,
mais en voici une explication simplifiée:
</p>
<p>
Un certain pourcentage des utilisateurs d'I2P sont crédités du statut de 'floodfill peers', pairs remplisseurs par
diffusion, diffuseurs dans la suite.
Actuellement, les installations d'2P qui on une bonne bande passante et qui sont assez rapides se
déclarent elles-mêmes en tant que diffuseur dès que le nombre de routeurs diffuseurs tombe à un niveau trop faible.
</p>
<p>
Les autres routeurs I2P vont y enregistrer leurs données et recherches en envoyant de simples requêtes
'store' et 'lookup' aux diffuseurs.
Quand un diffuseur reçoit un requête 'store', il la diffuse aux autres diffuseurs en utilisant
l'<a href="http://fr.wikipedia.org/wiki/Kademlia">algorithme Kademlia</a>.
Les requêtes 'lookup' fonctionnent actuellement de façon différente, pour éviter
<a href="how_networkdatabase.html#lookup">un problème de sécurité important</a>.
Lorsqu'une recherche est lancée, le diffuseur ne la diffuse pas, mais y répond lui-même s'il dispose
des données demandées.
</p>
<p>
Deux types d'informations sont stockées dans la netDb.
<ul>
<li><b>routerInfo</b>, un routeur I2P spécifique et la façon de le joindre.</li>
<li><b>leaseSet</b>, une destination spécifique (p.e. un site web I2P, un serveur de messagerie, etc...)</li>
</ul>
Toutes ces infos sont signées par leur propriétaire, et vérifiées par tout routeur I2P qui les utilise
ou les stocke.
De plus, les données contiennent des informations de temps, pour éviter le stockage de vielles entrées
et empêcher d'éventuelles attaques. C'est aussi pourquoi I2P fournit le code nécessaire pour conserver
une heure correcte, en interrogeant de temps en temps des serveurs SNTP (dans le
tourniquet du réservoir <a href="http://www.pool.ntp.org/fr/">pool.ntp.org</a> par défaut)
et en détectant les dérives entre routeurs au niveau de la couche transport.
</p>
<p>
Autres remarques importantes.
<ul>
<li>
<b>Jeux de baux non publiés et cryptés:</b>
<p>
On pourrait souhaiter que seulement une personne particulière puisse joindre une certaine destination.
Ceci est possible par la non publication de la destination dans la base de données.
Il faudra alors transmettre la destination par quelqu'autre moyen. Ou alors en utilisant des jeux de baux
cryptés, uniquement décryptables par les gens pour lesquels ils ont été cryptés.
</p>
</li>
<li>
<b>Amorçage:</b>
<p>
L'amorçage de la base de données est assez simple. Une fois qu'un routeur réussit à recevoir la routerInfo
d'un seul autre pair joignable, il peut interroger ce routeur pour obtenir les informations d'autres routeurs
du réseau. Actuellement, bon nombre d'utilisateurs publient leur routerInfo files sur un site web
pour rendre cette information disponible. I2P se connecte automatiquement à l'un de ces sites pour
collecter des fichiers routerInfo files et d'amorcer.
</p>
</li>
<li>
<b>Adaptativité des recherches:</b>
<p>
Les recherches dans le réseau I2P ne sont pas transmises à d'autres routeurs de la base de données.
Actuellement, ce n'est pas un problème majeur, dans la mesure où le réseau n'est pas très grand.
Cependant, au fur et à mesure de sa croissance, chaque routeur n'aura pas toutes les routerInfo et tous
les jeux de baux de tout le réseau. Ceci provoquera une dégradation du pourcentage de requêtes réussies.
Pour ceci, des améliorations de la base de données sont au programme des prochaines versions.
</p>
</li>
</ul>
</p>
<h2 id="op.transport">Protocoles de transport</h2>
<p> Les communications entre routeurs doivent apporter confidentialité et intégrité
contre des menaces externes tout en certifiant que le routeur contacté est bien celui
qui doit recevoir un message donné. Les particularités sur la façon dont les routeurs communiquent
les uns avec les autres ne sont pas critiques: trois protocoles distincts ont été retenus
pour répondre à ces exigences. </p>
<p> I2P commença avec un protocole basé sur TCP qui depuis a été désactivé.
Puis, pour résoudre le problème du besoin élevé en terme de nombre de communications
(vu qu'un grand nombre de routeurs peuvent cesser de parler avec plusieurs autres), I2P a migré
de TCP vers un protocole <a href="udp.html">basé sur UDP</a> - "Secure
Semireliable UDP", UDP Sécurisé Semi-fiable, ou "SSU". </p>
<p> Comme expliqué dans la <a href="udp.html">spécification de SSU</a>:</p>
<blockquote> Le but de ce protocole est de fournir une livraison sécurisée, authentifiée,
semi-fiable, et non ordonnée, dévoilant uniquement une quantité minimale de données facilement
discernables par les tierses parties. Il doit tolérer un fort taux de communications
tout comme le contrôle de congestion TCP, et inclure la découverte MTU
<a href="http://fr.wikipedia.org/wiki/Path_MTU_discovery">PMTU</a>.
Il doit pouvoir transférer efficacement des données en vrac à un débit suffisant pour l'utilisation résidentielle.
De plus, il doit être compatible avec les techniques de contournement d'obstacles du le réseau
tels que les translateurs d'adresses (NAT) ou les pare-feux. </blockquote>
<p> Suite à l'introduction de SSU, après l'apparition de problèmes de congestion, un nouveau
transport TCP basé sur les <a href="http://en.wikipedia.org/wiki/New_I/O">NIO Java</a> appelé
<a href="ntcp.html">NTCP</a> fut implémenté.
Il est activé pour les connexions sortantes uniquement. Ceux qui configurent leur pare-feu/NAT
pour autoriser les connexions entrantes et précisent l'hôte et le port (même en style DynDNS, etc...)
dans la configuration peuvent recevoir des connexions entrantes.
Comme NTCP est bati avec les NIO il n'est pas astreint au problème de "une connexion=une tâche" dont souffrait
l'ancien transport TCP. </p>
<p> I2P permet de multiples transports simultanément. Un transport particulier pour une connexion sortante
est sélectionné par des enchères. Chaque transport fait une offre pour obtenir la connexion, et la valeur relative
de l'offre décide de la priorité. Les transports peuvent répondre avec des offres différentes,
suivant s'il y a déjà une connexion établie avec le pair. </p>
<p> L'implémentation actuelle attribuent la plus haute priorité de transport à NTCP pour les connexions sortantes
dans la plupart des cas. SSU est activé à la fois pour les connexions sortantes et entrantes. Votre pare-feu/NAT
et votre routeur I2P doivent être configurés pour autoriser les connexions entrantes NTCP.
Voir les détails <a href="ntcp.html">ici</a> sur la page NTCP. </p>
<h2 id="op.crypto">Cryptographie</h2>
<p> Un petit minimum d'algorithmes cryptographiques de base sont combinés pour fournir
à I2P les protections étagées contre diverses menaces. Au niveau le plus bas, la communication inter routeurs
est protégée par la sécurité de la couche transport: SSU crypte chaque paquet avec
l'<a href="http://fr.wikipedia.org/wiki/Advanced_Encryption_Standard">AES</a>256/
<a href="http://fr.wikipedia.org/wiki/Mode_d%27op%C3%A9ration_%28cryptographie%29#
Encha.C3.AEnement_des_blocs_:_.C2.AB_Cipher_Block_Chaining_.C2.BB_.28CBC.29">CBC</a>
conjugué à un vecteur d'initialisation explicite et un code d'authentification de message
(<a href="http://fr.wikipedia.org/wiki/Keyed-Hash_Message_Authentication_Code">HMAC</a>-MD5-128) après
négociation préalable d'une clé de session via un échange
<a href="http://fr.wikipedia.org/wiki/Diffie-Hellman">Diffie-Hellman</a> à 2048 bits et
une authentification mutuelle avec la clé <a href="http://fr.wikipedia.org/wiki/Digital_Signature_Algorithm">DSA</a>
de l'autre routeur,
plus une vérification locale d'intégrité avec le propre hachage du message.
Les messages de <a href="#op.tunnels">tunnel</a> passés par les transports
disposent de leur propre cryptage étagé en AES256/CBC à VI explicite et sont vérifiés
au point terminal du tunnel à l'aide d'un hachage <a href="http://fr.wikipedia.org/wiki/SHA-256">SHA256</a>
supppémentaire. Divers autres messages sont passés regroupés dans des "garlic messages",
qui sont cryptés en
<a href="http://fr.wikipedia.org/wiki/Cryptosyst%C3%A8me_de_ElGamal">ElGamal</a>/AES+SessionTags
(expliqués ci-dessous).</p>
<h3 id="op.garlic">Messages "Garlic" : en têtes d'ail</h3>
<p> Ces messages sont une extension du cryptage "onion" en couches, permettant aux contenus d'un seul message
de contenir plusieurs "gousses", des messages complets juxtaposés à leurs propres instructions de livraison.
Les messages sont empaquetés chaque fois qu'il seraient sinon passés en clair au travers d'un pair qui n'aurait pas
accès aux informations de routage: par exemple, quand un routeur veut demander à un autre de participer à un
tunnel, ils ajoutent la requête dans un garlic qu'il cryptent à l'intention du routeur destinataire avec sa
clé publique ElGamal 2048 bits publiée dans son jeu de baux, et le font suivre dans un tunnel. Dans un autre
exemple, un client veut envoyer un message à une destination: le routeur du client va joindre ce message de
données (à côté de quelques autres messages) dans un garlic qu'il crypte en ElGamal 2048 à l'intension de la
destination avec sa clé publiée dans son jeu de baux, et l'envoie aux tunnels appropriés.</p>
<p> Les "instructions" attachées à chaque gousse dans la couche de cryptage incluent la passibilité
de demander que cette gousse soit transmise localement, à un routeur distant, ou à un tunnel distant sur un routeur
distant. Il y a des champs dans ces instructions permettant à un pair de demander que la livraison soit retardée
un certain temps ou jusqu'à ce qu'une condition soit remplie, bien qu'ils ne seront pris en compte
que lorsque les <a href="#future.variablelatency">retards nontriviaux</a> soient déployés. Il est possible
de router explicitement les messages en tête d'ail sur n'importe quel nombre de sauts sans construire de tunnels,
ou même de rerouter les messages de tunnels en les joingnant à un garlic et en le faisant suivre à un certain
nombre de saut avant de le passer au saut suivant du tunnel, mais ces techniques ne sont pas actuellement utilisées
dans l'implémentation en cours. </p>
<h3 id="op.sessiontags">Balises de session</h3>
<p> En tant que système orienté messages non fiable et non ordonné, I2P utilses une simple combinaison
d'algorithmes de cryptage symétriques et assymétriques pour apporter la confidentialité et l'intégrité
des données aux messages garlics. Considérée comme un tout, la combinaison est appelée ElGamal/AES+SessionTags,
mais c'est un poil trop verbeux pour décrire une simple utilisation d'ElGamal 2048 bits, d'AES256, d'SHA256,
et de vecteurs d'initialisation de 32 octets. </p>
<p> La première fois qu'un routeur veut crypter un message garlic à l'usage d'un autre routeur,
il crypte les données de clés d'une session AES256 avec ElGamal et joint la charge utile cryptée en AES256/CBC
après le block crypté avec ElGamal. En plus de la charge utile cryptée, la section encryptée en AES contient
la longueur de la charge utile, le hachage de la charge non cryptée, ainsi qu'un certain nombre de balises de
session de 32 octets aléatoires. La fois suivante, plutôt que de crypter une nouvelle clé de session en ElGamal,
il va simplement prendre une des balises précédement envoyées et crypter la charge en AES comme avant en utilisant
la clé de session associée à la balise, et préfixer la charge cryptée avec la balise. Quand un routeur reçoit
un message garlic, il cherche si les 32 premiers octets correspondent à une balise déjà disponible, auquel cas il
décryptent l'AES. En l'absence de correspondance, il décryptent le premier block en ElGamal.</p>
<p> Chaque balise de session est à usage unique, tant pour empêcher une attaque interne de mettre en corrélation
différents messages, que venant d'un point situé entre les mêmes routeurs. L'émetteur d'un message crypté
ElGamal/AES+SessionTag choisit quand et combien de balises il faut envoyer pour en fournir suffisament au
destinataire afin de couvrir les besoins nécessaires au tranfert d'un bouquet de messages.
Les messages garlics peuvent détecter la livraison correcte de balises en joignant un petit message supplémentaire
en tant que gousse (un accusé de réception): quand la tête d'ail arrive au destinataire prévu et est décryptée
avec succès, ce petit message de réussite pré fourni est un de ceux dévoilés dans la gousse, et il contient
les instructions pour le destinataire pour la renvoyer à l'émetteur (via un tunnel entrant, évidement).
Quand celui-ci reçoit ce message d'état de livraison, il sait que les balises de session ont bien été reçues.</p>
<p>Les balises ont une très courte durée de vie, passée laquelle elles sont invalidées faute d'avoir été utilisées.
De plus, leur nombre pour chaque clé est limité, tout comme le nombre de clés lui-même:
s'il en arrive trop, des messages récents ou plus anciens pourraient être perdus. L'émetteur fait un suivi
des messages qui utilisent les balises pour s'assurer qu'ils passent, et dans le cas contraire il se replie sur
l'algorithme ElGamal plus coûteux.</p>
<p> Une alternative consiste à ne transmettre qu'une seule balise de session, et de là,
initialiser un
<a href="http://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_de_nombres_pseudo-al%C3%A9atoires">
générateur de nombres pseudo-aléatoires</a> (PRNG) déterministe pour déduire quelles balises utiliser ou attendre.
En tenant ce générateur sommairement synchronisé entre l'émetteur et le destinataire (qui calcule par anticipation
par exemple une cinquantaine de balises), la surcharge induite par la fourniture périodique d'un grand nombre de
balises est supprimée, permettant ainsi plus d'options d'arbitrage dans l'espace et le temps, et éventuellement
la réduction du nombre d'encryptages ElGamal nécessaires. Cependant, il dépend de la robustesse du générateur de
fournir la protection contre les menaces internes, bien qu'on puisse minimiser toute faiblesse en limitant le
nombre d'utilisations de chaque générateur. Pour l'instant, il n'a pas de plans immédiats de migration vers ce
système de PRNGs synchronisés. </p>
<h1 id="future">L'avenir</h1>
<p> Bien qu'I2P soit actuellement opérationnel et suffisant dans de nombreux scenarii, il reste plusieurs zones qui
demandent de profondes améliorations pour atteindre les besoins de ceux devant faire face à des adversaires
puissants comme pour l'amélioration de l'utilisation quotidienne par les utilisateurs.
</p>
<h2 id="future.restricted">Les routes réservées</h2>
<p> I2P est une "sur-couche" réseau conçue pour fonctionner sur un réseau commuté par paquets,
exploitant la notion de "point à point" pour offrir l'anonymat et la sécurité.
Alors qu'Internet ne respecte plus le principe du bout en bout (à cause de l'utilisation du NAT),
I2P requiert qu'une portion substancielle du réseau soit joignable: il pourrait y avoir un bon nombre
de pairs utilisant des routes privées, mais I2P n'inclut pas d'algorithme de routage approprié à un scenario
de dégradation dans lequel la plus grande partie des pairs seraient injoignables. Il pourrait cependant fonctionner
sur un réseau utilisant un tel algorithme. </p>
<p> L'utilisation de routes réservées, où il y a des limites aux pairs joignables directement,
induit plusieurs conséquences sur le fonctionnement et l'anonymat, suivant la façon selon laquelle ces routes
sont gérées. Au niveau le plus basique, des routes réservées sont présentes quand un pair se trouve derrière
un pare-feu ou un NAT qui ne permet pas les connexions entrantes. Ceci a été grandement pris en compte depuis la
0.6.0.6 en intégrant le percement de trous distribué dans la couche transport, permettant ainsi aux gens situés
derrière la plupart de pare-feux ou NATs de recevoir des connexions non solicitées sans aucune configuration.
Cependant, ceci ne réduit pas l'exposition de l'adresse IP du pair aux routeurs du réseau,
car ils peuvent être présentés au pair au travers de l'intermédiaire publié.</p>
<p> Au-delà de la gestion fonctionnelle des routes privées, il y a deux niveaux d'opérations privées qui peuvent être
mis en œuvre pour limiter l'exposition des adresses IP: l'utilisation de tunnels dédiés à la communication et de
'routeurs clients'. Pour le premier, les routeurs peuvent soit construire un nouveau groupe de tunnnels ou
réutiliser leur groupe exploratoire, en publiant les passerelles entrantes vers quelques-uns d'entre eux en tant
que partie de leur routerInfo au lieu de leur adresse de transport. Quand un pair veut les contacter, il voit
ces passerelles de tunnel dans la base de données et leur envoient simplement le message concerné via un des tunnels
publiés. Si le pair situé derrière une route privée veut répondre, il peut le faire soit directement (s'il acceptent
de dévoiler leur adresse IP au pair) ou indirectement via leurs tunnels sortants. Quand les routeurs
auxquels le pair a une connexion directe veulent le joindre (p.e. pour faire suivre des messages de tunnels), ils
doivent simplement prioriser leur connexion directe par rapport à la passerelle de tunnels publiée.
Le concept de 'routeur client' étends simplement la route réservée en ne publiant aucune adresse de routeur.
Un tel routeur n'aurait même plus besoin de publier leur routerInfo dans la netDb, mais plutôt de fournir leur
leur routerInfo auto-signée aux pairs qu'il contacterait (nécessaire au transfert de ses clés publiques).
Ces deux niveaux d'opération sur routes privées sont prévus pour la version 2.0 d'I2P. </p>
<p> Il y a des choix à établir pour ceux situés sur des routes privées, vu qu'ils participeraient moins souvent aux
tunnels des autres utilisateurs, et que les routeurs auxquels ils sont connectés pourraient déduire des motifs
de trafic qui ne sont normalement pas exposés. D'un autre côté, si le coût de cette exposition est inférieur à
celui de rendre l'adresse IP disponible, cela peut être intéressant. Ceci, bien sûr, suppose que les pairs contactés
par celui qui est derrière une route réservée ne soient pas hostiles, ou que le réseau soit assez grand pour que la
probabilité de tomber sur un pairs hostile pour se connecter soit suffisament faible. On pourrait aussi préférer
utiliser des pairs de confiance (et peut-être temporaires).</p>
<h2 id="future.variablelatency">Latence variable</h2>
<p> Même si le gros des efforts initiaux d'I2P ont porté sur une communication à faible latence,
il fut dès le départ conçu en gardant à l'esprit des services à latence variable.
Au niveau le plus bas, les applications s'exécutant sur I2P peuvent offrir l'anonymat du médium des communications
à haute latence tout en mélant leurs motifs de trafic à du trafic à faible latence. En interne cependant,
I2P peut offrir son propre medium et une haute latence de communication via le cryptage garlic en tête d'ail:
en spécifiant que le message doit être envoyé après un certain délai, à un certain moment, après le passage d'un
certain nombre de messages, ou une autre stratégie combinant ces éléments. Avec le cryptage en couches,
seul le routeur pour lequel la gousse a dévoilé la requête de retard saura que le message demande une haute
latence, au trafic carrespondant d'être mélangé ultérieurement à du trafic à faible latence. Une fois la condition
de transmission atteinte, le routeur retenant la gousse (qui peut aussi bien être un message garlic) le fait
simplement suivre comme demandé: à un routeur, à un tunnel, ou plus probablement à une destination cliente.</p>
<p> Il y a un nombre conséquent de manières d'exploiter cette possibilité pour les communications à haute latence
dans I2P, mais pour l'instant, son utilisation est planifiée pour la version 3.0. En attendant, ceux qui ont besoin
de l'anonymat offert par les communications à latence élevée peuvent se tourner vers la couche applicative pour
l'obtenir.</p>
<h2 id="future.open">Questions ouvertes</h2>
<pre>
Comment se débarasser de la contrainte de temps?
Y a-t-il un moyen plus effcace de gérer les balises de session?
Quelles stratégies de regroupement/mélange devraient-elles être disponibles dans les tunnels?
Quelles autre stratégies de sélection/tri des pairs de tunnels devrait-elles être disponibles?
</pre>
<h1 id="similar">Systèmes similaires</h1>
<p> L'architecture d'I2P repose sur les concepts de logiciel intermédiaire orienté messages, de topologie de table
de hachage décentralisée, de l'anonymat et de la cryptographie des réseaux croisés à routes libres et de
l'adaptabilité des réseaux à paquets commutés. L'apport ne vient cependant pas de nouveaux concepts d'algorithmes,
mais de l'analyse attentive des résultats de recherches et documentations des systèmes existants.
Bien qu'il y ait peu d'efforts similaires qui vaillent d'être analysés en détail, tant au niveau technique que
fonctionnel, il en est néanmoins deux qui sortent du lot: Tor et Freenet.</p>
<p> Voir aussi la page de <a href="how_networkcomparisons.html">comparaisons des réseaux</a>.
</p>
<h2 id="similar.tor">Tor</h2>
<p><i><a href="http://www.torproject.org/">website</a></i></p>
<p>Au premier coup d'œil, Tor et I2P ont plusieurs ressemblances fonctionnelles et d'anonymat.
Bien que le développement d'I2P ait commencé avant que nous ne fussions au courant des premières étapes du travail
sur Tor, plusieurs des leçons du travail d'origine du routage en oignon et de ZKS furent intégrées
dans sa conception. Plutôt que de construire un système centralisé de confiance, avec des serveurs d'annuaires, I2P
dispose d'une base de donnée réseau auto-organisée dans laquelle chaque pair assume la responsabilité du profilage
des autres routeurs pour déterminer la meilleure façon d'exploiter les ressources disponibles. Une autre différence
majeure réside dans le fait que bien qu'utilisant tous les deux des chemins étagés et ordonnés, I2P est
fondamentalement un réseau à commutation de paquets alors que Tor est un réseau à commutation de circuits, ce qui
permet à I2P de contourner de façon transparente les congestions et autres défaillances du réseau, de gérer des
chemins redondants, et de faire de l'équilibrage de charge sur les ressources disponibles.
Si Tor offre nativement la fonctionnalité très utile de découverte et de sélection de mandataire de sortie
(outproxy), I2P délègue cette décision de couche applicative... aux applications: en réalité, I2P a même
externalisé vers la couche applicative la bibliothèque de flux (streaming) "style TCP" permettant ansi aux
développeurs d'expérimenter diverses stratégies afin d'obtenir les meilleures performances.</p>
<p> Du point de vue de l'anonymat, la comparaison du cœur des réseaux présente beaucoup de similarités.
Il y a malgré tout quelques différences fondamentales. Pour la prise en compte des menaces internes et de la
plupart des menaces externes, les tunnels simplex d'I2P n'exposent au plus que la moitié des données de trafic
que ne le font les circuits duplex de Tor, rien qu'au niveau de l'observation des flux: une requête HTTP et sa
réponse suivent le même chemin dans Tor, alors que dans I2P, les paquets constituant la requête passent par un ou
plusieur tunnels sortants, et ceux de la réponse empruntent un ou plusieur tunnels entrants.
Les stratégies de sélection et de tri des pairs dans I2P entrave suffisamment les attaques par prédécesseur,
mais il peut aussi mimer les tunnels duplex de Tor en créant les tunnels entrants et sortants en suivant les
mêmes routeurs.</p>
<p> Une autre faille d'anonymat dans Tor vient de la création télescopique de tunnels: le comptage des paquets
et les mesures de timing dans un circuit passent à travers un nœud ennemi permettent l'extraction de données
statistiques suivant la position de l'adversaire dans le circuit. Dans I2P, la création de tunnels unidirectionels
en un seul message masque cette information. La confidentialité de la position occupée dans un tunnel est
importante car un attaquant pourrait profiter de cette donnée pour lancer une série d'attaques de prédécesseur,
d'intersection, et de confirmation de trafic.
</p>
<p> Le deuxième niveau de mandataires "oignons" de Tor apporte un bon anonymat à faible coût d'entrée, alors q'I2P
ne permettra pas cette topologie avant la version <a href="#future.restricted">2.0</a>. </p>
<p> Globalement, Tor et I2P se complètent mutuellement: Tor se focalise sur la mise à disposition de mandataires
sortants rapides et anonymes, et I2P s'oriente vers un réseau robuste et décentralisé. En théorie, chacune de ces
deux approches sont destinées à des fins différentes, mais étant donné les faibles ressources en développement,
elles ont chacunes leurs propres forces et faiblesses. Les développeurs d'I2P ont étudié les étapes nécessaires
à la modification de Tor pour qu'il puisse bénéficier de la conception d'I2P, red
the steps necessary to modify Tor to take advantage of I2P's design, mais les inquiétudes quand à la viabilité
de Tor en régime de ressources raréfiées suggèrent que l'architecture à commutation de paquets choisie par I2P
est à même d'exploiter plus efficacement des ressources rares. </p>
<h2 id="similar.freenet">Freenet</h2>
<p><i><a href="http://www.freenetproject.org/">Le site</a></i></p>
<p> Freenet a largement contribué aux premières étapes de conception d'I2P, en donnant la preuve de viabilité
d'une communauté enthousiaste entièrement contenue dans un réseau et en démontrant que les dangers inhérents aux
mandataires sortants pouvaient être évités. The first seed of I2P began as a replacement communication
layer for Freenet, attempting to factor out the complexities of a scalable,
anonymous and secure point to point communication from the complexities of
a censorship resistant distributed data store. Over time however, some of
the anonymity and scalability issues inherent in Freenet's algorithms made
it clear that I2P's focus should stay strictly on providing a generic anonymous
communication layer, rather than as a component of Freenet. Over the years,
the Freenet developers have come to see the weaknesses in the older design,
prompting them to suggest that they will require a "premix" layer to offer
substantial anonymity. In other words, Freenet needs to run on top of a mixnet
such as I2P or Tor, with "client nodes" requesting and publishing data through
the mixnet to the "server nodes" which then fetch and store the data according
to Freenet's heuristic distributed data storage algorithms. </p>
<p> Freenet's functionality is very complementary to I2P's, as Freenet natively
provides many of the tools for operating medium and high latency systems,
while I2P natively provides the low latency mix network suitable for offering
adequate anonymity. The logic of separating the mixnet from the censorship
resistant distributed data store still seems self evident from an engineering,
anonymity, security, and resource allocation perspective, so hopefully the
Freenet team will pursue efforts in that direction, if not simply reusing
(or helping to improve, as necessary) existing mixnets like I2P or Tor. </p>
<p> It is worth mentioning that there has recently been discussion and work
by the Freenet developers on a "globally scalable darknet" using restricted
routes between peers of various trust. While insufficient information has
been made publicly available regarding how such a system would operate for
a full review, from what has been said the anonymity and scalability claims
seem highly dubious. In particular, the appropriateness for use in hostile
regimes against state level adversaries has been tremendously overstated,
and any analysis on the implications of resource scarcity upon the scalability
of the network has seemingly been avoided. Further questions regarding susceptibility
to traffic analysis, trust, and other topics do exist, but a more in-depth
review of this "globally scalable darknet" will have to wait until the Freenet
team makes more information available. </p>
<h1 id="app">Appendix A: Application layer</h1>
<p>
I2P itself doesn't really do much - it simply sends messages to remote destinations
and receives messages targeting local destinations - most of the interesting
work goes on at the layers above it. By itself, I2P could be seen as an anonymous
and secure IP layer, and the bundled <a href="#app.streaming">streaming library</a>
as an implementation of an anonymous and secure TCP layer on top of it. Beyond
that, <a href="#app.i2ptunnel">I2PTunnel</a> exposes a generic TCP proxying
system for either getting into or out of the I2P network, plus a variety of
network applications provide further functionality for end users.
</p>
<h2 id="app.streaming">Streaming library</h2>
<p>
The I2P streaming library can be viewed as a generic streaming interface (mirroring TCP sockets),
and the implementation supports a
<a href="http://en.wikipedia.org/wiki/Sliding_Window_Protocol">sliding window protocol</a>
with several optimizations, to take into account the high delay over I2P.
Individual streams may adjust the maximum packet size and
other options, though the default of 4KB compressed seems a reasonable tradeoff
between the bandwidth costs of retransmitting lost messages and the latency
of multiple messages.
</p>
<p>
In addition, in consideration of the relatively high cost of subsequent
messages, the streaming library's protocol for scheduling and delivering messages
has been optimized to allow individual messages passed to contain as much
information as is available. For instance, a small HTTP transaction proxied
through the streaming library can be completed in a single round trip - the
first message bundles a SYN, FIN, and the small payload (an HTTP request typically
fits) and the reply bundles the SYN, FIN, ACK, and the small payload (many
HTTP responses fit). While an additional ACK must be transmitted to tell the
HTTP server that the SYN/FIN/ACK has been received, the local HTTP proxy can
deliver the full response to the browser immediately.
</p>
<p>
On the whole, however, the streaming library bears much resemblance to an
abstraction of TCP, with its sliding windows, congestion control algorithms
(both slow start and congestion avoidance), and general packet behavior (ACK,
SYN, FIN, RST, etc).
</p>
<h2 id="app.naming">Naming library and addressbook</h2>
<p><i> For more information see the <a href="naming.html">Naming and Addressbook</a>
page.</i></p>
<p><i>Developed by: mihi, Ragnarok</i></p>
<p> Naming within I2P has been an oft-debated topic since the very beginning
with advocates across the spectrum of possibilities. However, given I2P's
inherent demand for secure communication and decentralized operation, the
traditional DNS-style naming system is clearly out, as are "majority rules"
voting systems. Instead, I2P ships with a generic naming library and a base
implementation designed to work off a local name to destination mapping, as
well as an optional add-on application called the "addressbook". The addressbook
is a web-of-trust driven secure, distributed, and human readable naming system,
sacrificing only the call for all human readable names to be globally unique
by mandating only local uniqueness. While all messages in I2P are cryptographically
addressed by their destination, different people can have local addressbook
entries for "Alice" which refer to different destinations. People can still
discover new names by importing published addressbooks of peers specified
in their web of trust, by adding in the entries provided through a third party,
or (if some people organize a series of published addressbooks using a first
come first serve registration system) people can choose to treat these addressbooks
as name servers, emulating traditional DNS. </p>
<p> I2P does not promote the use of DNS-like services though, as the damage
done by hijacking a site can be tremendous - and insecure destinations have
no value. DNSsec itself still falls back on registrars and certificate authorities,
while with I2P, requests sent to a destination cannot be intercepted or the
reply spoofed, as they are encrypted to the destination's public keys, and
a destination itself is just a pair of public keys and a certificate. DNS-style
systems on the other hand allow any of the name servers on the lookup path
to mount simple denial of service and spoofing attacks. Adding on a certificate
authenticating the responses as signed by some centralized certificate authority
would address many of the hostile nameserver issues but would leave open replay
attacks as well as hostile certificate authority attacks. </p>
<p> Voting style naming is dangerous as well, especially given the effectiveness
of Sybil attacks in anonymous systems - the attacker can simply create an
arbitrarily high number of peers and "vote" with each to take over a given
name. Proof-of-work methods can be used to make identity non-free, but as
the network grows the load required to contact everyone to conduct online
voting is implausible, or if the full network is not queried, different sets
of answers may be reachable. </p>
<p> As with the Internet however, I2P is keeping the design and operation of
a naming system out of the (IP-like) communication layer. The bundled naming
library includes a simple service provider interface which alternate naming
systems can plug into, allowing end users to drive what sort of naming tradeoffs
they prefer. </p>
<h2 id="app.syndie">Syndie</h2>
<p><i> The old Syndie bundled with I2P has been replaced by the new Syndie which
is distributed separately. For more information see the <a href="http://syndie.i2p2.de/">Syndie</a>
pages.</i></p>
<p> Syndie is a safe, anonymous blogging / content publication / content aggregation
system. It lets you create information, share it with others, and read posts
from those you're interested in, all while taking into consideration your
needs for security and anonymity. Rather than building its own content distribution
network, Syndie is designed to run on top of existing networks, syndicating
content through eepsites, Tor hidden services, Freenet freesites, normal websites,
usenet newsgroups, email lists, RSS feeds, etc. Data published with Syndie
is done so as to offer pseudonymous authentication to anyone reading or archiving
it. </p>
<h2 id="app.i2ptunnel">I2PTunnel</h2>
<p><i>Developed by: mihi</i></p>
<p> I2PTunnel is probably I2P's most popular and versatile client application,
allowing generic proxying both into and out of the I2P network. I2PTunnel
can be viewed as four separate proxying applications - a "client" which receives
inbound TCP connections and forwards them to a given I2P destination, an "httpclient"
(aka "eepproxy") which acts like an HTTP proxy and forwards the requests to
the appropriate I2P destination (after querying the naming service if necessary),
a "server" which receives inbound I2P streaming connections on a destination
and forwards them to a given TCP host+port, and an "httpserver" which extends
the "server" by parsing the HTTP request and responses to allow safer operation.
There is an additional "socksclient" application, but its use is not encouraged
for reasons previously mentioned. </p>
<p> I2P itself is not an outproxy network - the anonymity and security concerns
inherent in a mix net which forwards data into and out of the mix have kept
I2P's design focused on providing an anonymous network which capable of meeting
the user's needs without requiring external resources. However, the I2PTunnel
"httpclient" application offers a hook for outproxying - if the hostname requested
doesn't end in ".i2p", it picks a random destination from a user-provided
set of outproxies and forwards the request to them. These destinations are
simply I2PTunnel "server" instances run by volunteers who have explicitly
chosen to run outproxies - no one is an outproxy by default, and running an
outproxy doesn't automatically tell other people to proxy through you. While
outproxies do have inherent weaknesses, they offer a simple proof of concept
for using I2P and provide some functionality under a threat model which may
be sufficient for some users. </p>
<p> I2PTunnel enables most of the applications in use. An "httpserver" pointing
at a webserver lets anyone run their own anonymous website (or "eepsite")
- a webserver is bundled with I2P for this purpose, but any webserver can
be used. Anyone may run a "client" pointing at one of the anonymously hosted
IRC servers, each of which are running a "server" pointing at their local
IRCd and communicating between IRCds over their own "client" tunnels. End
users also have "client" tunnels pointing at <a href="#app.i2pmail">I2Pmail's</a>
POP3 and SMTP destinations (which in turn are simply "server" instances pointing
at POP3 and SMTP servers), as well as "client" tunnels pointing at I2P's CVS
server, allowing anonymous development. At times people have even run "client"
proxies to access the "server" instances pointing at an NNTP server. </p>
<h2 id="app.i2pbt">i2p-bt</h2>
<p><i>Developed by: duck, et al</i></p>
<p> i2p-bt is a port of the mainline python BitTorrent client to run both the
tracker and peer communication over I2P. Tracker requests are forwarded through
the eepproxy to eepsites specified in the torrent file while tracker responses
refer to peers by their destination explicitly, allowing i2p-bt to open up
a <a href="#app.streaming">streaming lib</a> connection to query them for
blocks. </p>
<p> In addition to i2p-bt, a port of bytemonsoon has been made to I2P, making
a few modifications as necessary to strip any anonymity-compromising information
from the application and to take into consideration the fact that IPs cannot
be used for identifying peers. </p>
<h2 id="app.i2psnark">I2PSnark</h2>
<p><i>I2PSnark developed: jrandom, et al, ported from <a
href="http://www.klomp.org/mark/">mjw</a>'s <a
href="http://www.klomp.org/snark/">Snark</a> client</i></p>
<p> Bundled with the I2P install, I2PSnark offers a simple anonymous BitTorrent
client with multitorrent capabilities, exposing all of the functionality through
a plain HTML web interface. </p>
<h2 id="app.robert">Robert</h2>
<p><i>Developed by: sponge</i></p>
<p>Robert is a Bittorrent client written in Python.
It is hosted on <a href="http://bob.i2p/Robert.html">http://bob.i2p/Robert.html</a></p> <!-- TODO: expand -->
<h2 id="app.pybit">PyBit</h2>
<p><i>Developed by: Blub</i></p>
<p>PyBit is a Bittorrent client written in Python.
It is hosted on <a href="http://pebcache.i2p/">http://pebcache.i2p/</a></p> <!-- TODO: expand -->
<h2 id="app.i2phex">I2Phex</h2>
<p><i>Developed by: sirup</i></p>
<p> I2Phex is a fairly direct port of the Phex Gnutella filesharing client to
run entirely on top of I2P. While it has disabled some of Phex's functionality,
such as integration with Gnutella webcaches, the basic file sharing and chatting
system is fully functional. </p>
<h2 id="app.i2pmail">I2Pmail/susimail</h2>
<p><i>Developed by: postman, susi23, mastiejaner</i></p>
<p> I2Pmail is more a service than an application - postman offers both internal
and external email with POP3 and SMTP service through I2PTunnel instances
accessing a series of components developed with mastiejaner, allowing people
to use their preferred mail clients to send and receive mail pseudonymously.
However, as most mail clients expose substantial identifying information,
I2P bundles susi23's web based susimail client which has been built specifically
with I2P's anonymity needs in mind. The I2Pmail/mail.i2p service offers transparent
virus filtering as well as denial of service prevention with hashcash augmented
quotas. In addition, each user has control of their batching strategy prior
to delivery through the mail.i2p outproxies, which are separate from the mail.i2p
SMTP and POP3 servers - both the outproxies and inproxies communicate with
the mail.i2p SMTP and POP3 servers through I2P itself, so compromising those
non-anonymous locations does not give access to the mail accounts or activity
patterns of the user. At the moment the developers work on a decentralized
mailsystem, called "v2mail". More information can be found on the eepsite
<a href="http://hq.postman.i2p/">hq.postman.i2p</a>.</p>
<h2 id="app.i2pbote">I2P-Bote</h2>
<p><i>Developed by: HungryHobo</i></p>
<p>
I2P-Bote is a distributed e-mail application. It does not use the traditional
e-mail concept of sending an e-mail to a server and retrieving it from a server.
Instead, it uses a Kademlia Distributed Hash Table to store mails.
One user can push a mail into the DHT, while another can request the e-mail from the DHT.
</p>
<h2 id="app.i2pmessenger">I2P-messenger</h2>
<p>
I2P-messenger is an end-to-end encrypted serverless communication application.
For communication between two users, they need to give each other their destination, to allow the other to connect.
</p>
{% endblock %}