upd todo_fr

This commit is contained in:
magma
2011-02-25 18:05:04 +00:00
parent a4ce61a790
commit 3e5d39211d

View File

@@ -2,7 +2,7 @@
{% block title %}À faire / Sur le feu{% endblock %}
{% block content %}
<h1>Cibles du project I2P</h1>
Traduction en cours (24 f&eacute;v 2011)
Traduction en cours (25 f&eacute;v 2011)
<p>Vous trouverez ci-dessous une exposition plus d&eacute;taill&eacute;e (bien que toujours incompl&egrave;te)
des principales zones du d&eacute;veloppement du c&oelig;ur du r&eacute;seau I2P, embrassant les
nouvelles versions &eacute;ventuellement planifi&eacute;es. Ceci n'inclu ni le transport st&eacute;ganographique,
@@ -17,113 +17,102 @@ Traduction en cours (24 f&eacute;v 2011)
<li><a href="#transport">Couche transport de haut-niveau par UDP, NBIO, ou NIO.</a></li>
<li><a href="#netdb">Base de donn&eacute;e r&eacute;seau, ajustement de profil et strat&eacute;gie d'&eacute;jection pour les grands r&eacute;seaux.</a></li>
</ul>
<h2>S&eacute;curit&eacute; / anonymat <font size="-1"><a href="#security">[link]</a></font></h2>
<h2>S&eacute;curit&eacute; / anonymat <font size="-1"><a href="#security">[zyva]</a></font></h2>
<ul class="targetlist">
<li><a href="#tunnelId">ID de tunnel "par saut" &amp; nouvelle encryption permut&eacute;e de la structure de v&eacute;rification des tunnels.</a></li>
<li><a href="#ordering">Tri strict des participants des tunnels.</a></li>
<li><a href="#tunnelLength">Longueur des tunnels al&eacute;atoirement permut&eacute;e.</a></li>
<li><a href="#fullRestrictedRoutes">Routes r&eacute;serv&eacute;es &agrave; n-sauts finalis&eacute;es avec liens de confiance optionnels.</a></li>
<li><a href="#hashcash">Hashcash for routerIdentity, destination, and tunnel request.</a></li>
<li><a href="#batching">Advanced tunnel operation (batching/mixing/throttling/padding)</a></li>
<li><a href="#stop">Stop &amp; go mix w/ garlics &amp; tunnels</a></li>
<li><a href="#hashcash">Hashcash pour routerIdentity, destination, et demande de tunnel.</a></li>
<li><a href="#batching">Fonctionnement &eacute;tendu des tunnels (batching/mixing/throttling/padding)</a></li>
<li><a href="#stop">M&eacute;lange de Stop &amp; go pour les <a href="http://www.i2p2.de/how_garlicrouting.html">"garlics"</a> et les tunnels</a></li>
</ul>
<h2>Performance <font size="-1"><a href="performance.html">[link]</a></font></h2>
<h2 id="core">Core functionality</h2>
<h2>Performances <font size="-1"><a href="performance.html">[doigt]</a></font></h2>
<h2 id="core">Fonctionalit&eacute;s centrales</h2>
<ul class="targetlist">
<li>
<h3 id="nat">NAT/Firewall bridging via 1-hop restricted routes</h3>
<h3 id="nat">Pontage du Pare-feu/NAT via une route r&eacute;serv&eacute;e &agrave; 1 saut.</h3>
</li>
<b><i>Implemented in I2P 0.6.0.6</i></b>
<p>The functionality of allowing routers to fully participate within the network
while behind firewalls and NATs that they do not control requires some basic
restricted route operation (since those peers will not be able to receive
inbound connections). To do this successfully, you consider peers one of
two ways:</p>
<b><i>Impl&eacute;ment&eacute; dans I2P 0.6.0.6</i></b>
<p>La fonctionalit&eacute; permettant aux routeurs de participer pleinement aux r&eacute;seau
m&ecirc;me lorsqu'ils se trouvent derri&egrave;re un pare-feu ou un traducteur d'adresses r&eacute;seau (NAT) hors de contr&ocirc;le n&eacute;cessite quelques
op&eacute;rations avec une route r&eacute;serv&eacute;e (car ces pairs ne peuvent pas recevoir
de connexions entrantes). Pour y parvenir, il y a deux fa&ccedil;ons de consid&eacute;rer les pairs:</p>
</ul>
<ul>
<li><b>Peers who have reachable interfaces</b> - these peers do not need to
do anything special</li>
<li><b>Peers who do not have reachable interfaces</b> - these peers must build
a tunnel pointing at them where the gateway is one of the peers they have
established a connection with who has both a publicly reachable interface
and who has agreed to serve as their 'introducer'.</li>
<li><b>Pairs disposant d'interfaces joignables</b> - ils n'ont rien de particulier &agrave; faire.</li>
<li><b>Pairs ne disposant pas d'interfaces joignables</b> - ces pairs doivent cr&eacute;er
un tunnel pointant sur eux dans lequel la passerelle est un des pairs avec lesquels ils ont &eacute;tabli une connexion
et qui, lui, dispose d'une interface publiquement joignable et a accept&eacute; de jouer le r&ocirc;le "d'entremetteur".</li>
</ul>
<ul class="targetlist">
<p>To do this, peers who have no IP address simply connect to a few peers,
build a tunnel through them, and publish a reference to those tunnels within
their RouterInfo structure in the network database.</p>
<p>When someone wants to contact any particular router, they first must get
its RouterInfo from the network database, which will tell them whether they
can connect directly (e.g. the peer has a publicly reachable interface)
or whether they need to contact them indirectly. Direct connections occur
as normal, while indirect connections are done through one of the the published
tunnels.</p>
<p>When a router just wants to get a message or two to a specific hidden peer,
they can just use the indirect tunnel for sending the payload. However,
if the router wants to talk to the hidden peer often (for instance, as part
of a tunnel), they will send a garlic routed message through the indirect
tunnel to that hidden peer which unwraps to contain a message which should
be sent to the originating router. That hidden peer then establishes an
outbound connection to the originating router and from then on, those two
routers can talk to each other directly over that newly established direct
connection.</p>
<p>Of course, that only works if the originating peer can receive connections
(they aren't also hidden). However, if the originating peer is hidden, they
can simply direct the garlic routed message to come back to the originating
peer's inbound tunnel.</p>
<p>This is not meant to provide a way for a peer's IP address to be concealed,
merely as a way to let people behind firewalls and NATs fully operate within
the network. Concealing the peer's IP address adds a little more work, as
described <a href="#fullRestrictedRoutes">below.</a></p>
<p>With this technique, any router can participate as any part of a tunnel.
For efficiency purposes, a hidden peer would be a bad choice for an inbound
gateway, and within any given tunnel, two neighboring peers wouldn't want
to be hidden. But that is not technically necessary.</p>
<p>Pour ce faire, les pairs priv&eacute;s se connectent simplement &agrave; quelques autres,
cr&eacute;ent un tunnel &agrave; travers chacun d'eux, et en publient une r&eacute;f&eacute;rence dans leur
structure RouterInfo de la base de donn&eacute;e du r&eacute;seau.</p>
<p>Lorsque quelqu'un souhaite joindre un routeur particulier, il doit d'abord obtenir
sa "RouterInfo" &agrave; partir de la base de donn&eacute;e, et il saura s'il peut se connecter
directement (cas du pair cible public) ou indirectement. Les connexions directes se passent
normalement, alors que les indirectes se font via les tunnels publi&eacute;s.</p>
<p>Quand un routeur veut seulement envoyer un ou deux messages &agrave; un pair cach&eacute;,
il peut simplement utiliser le tunnel indirect publi&eacute; pour envoyer les donn&eacute;es utiles. Cependant,
si le routeur doit converser souvent avec le pair priv&eacute; (par exemple en tant que participant
&agrave; un tunnel), il doit envoyer un message "rout&eacute;-&agrave;-la-garlic" &agrave; travers le tunnel
indirect au pair cach&eacute;, qui le d&eacute;balle pour y trouver... un message destin&eacute; au routeur originaire.
Le pair cach&eacute; &eacute;tablit alors une connexion sortante
au routeur originaire et &agrave; partir de l&agrave; ces deux
routeurs peuvent converser directement sur cette nouvelle connexion.</p>
<p>Ce sc&eacute;nario ne peut bien s&ucirc;r fonctionner que si le pair originaire peut recevoir des connexions
(c'est-&agrave;-dire qu'il ne soit pas lui-m&ecirc;me cach&eacute;). Cependant, s'il est cach&eacute; lui aussi, il peut indiquer dans
le message initial de revenir par son propre tunnel d'entr&eacute;e.</p>
<p>Ceci n'est pas destin&eacute; &agrave; fournir aux pairs un moyen de dissimuler leur adresse IP,
mais plut&ocirc;t pour permettre &agrave; ceux op&eacute;rant derri&egrave;re un pare-feu ou un NAT de participer normalement
au r&eacute;seau. La dissimulation d'adresse IP demande plus de travail, comme
d&eacute;crit <a href="#fullRestrictedRoutes">plus bas</a>.</p>
<p>Avec cette m&eacute;thode, n'importe quel routeur peut participer &agrave; tout r&ocirc;le dans un tunnel.
Dans un but d'efficacit&eacute;, op&eacute;rer en pair cach&eacute; est un mauvais choix pour officier en tant que passerelle d'entr&eacute;e,
et dans un tunnel donn&eacute;, deux pairs voisins ne devraient pas &ecirc;tre cach&eacute;s. Mais &ccedil;a n'est pas indispensable.</p>
</ul>
<ul class="targetlist">
<li>
<h3 id="transport">High degree transport layer with UDP, NBIO, or NIO</h3>
<b><i>Both UDP and NIO have been Implemented in I2P</i></b>
<p>Standard TCP communication in Java generally requires blocking socket
calls, and to keep a blocked socket from hanging the entire system, those
blocking calls are done on their own threads. Our current TCP transport
is implemented in a naive fashion - for each peer we are talking to, we
have one thread reading and one thread writing. The reader thread simply
loops a bunch of read() calls, building I2NP messages and adding them
to our internal inbound message queue, and the writer thread pulls messages
off a per-connection outbound message queue and shoves the data through
write() calls.</p>
<p>We do this fairly efficiently, from a CPU perspective - at any time,
almost all of these threads are sitting idle, blocked waiting for something
to do. However, each thread consumes real resources (on older Linux kernels,
for instance, each thread would often be implemented as a fork()'ed process).
As the network grows, the number of peers each router will want to talk
with will increase (remember, I2P is fully connected, meaning that any
given peer should know how to get a message to any other peer, and restricted
route support will probably not significantly reduce the number of connections
necessary). This means that with a 100,000 router network, each router
will have up to 199,998 threads just to deal with the TCP connections!</p>
<p>Obviously, that just won't work. We need to use a transport layer that
can scale. In Java, we have two main camps:</p>
<h3 id="transport">Couche transport de haut-niveau par UDP, NBIO, ou NIO.</h3>
<b><i>UDP et NIO sont impl&eacute;ment&eacute;s dans I2P</i></b>
<p>La communication TCP standard dans Java n&eacute;cessite habituellement des appels de socket
bloquants, et pour pour emp&ecirc;cher un socket de bloquer le bloquer tout le syst&egrave;me, ces
appels sont faits dans leur propres t&acirc;ches. Notre transport TCP actuel
est impl&eacute;ment&eacute; de fa&ccedil;on na&iuml;ve - pour chaque pair en relation, nous avons
une t&acirc;che de lecture et une t&acirc;che d'&eacute;criture. Celle de lecture boucle simplement sur
un paquet d'appels read(), construit les messages I2NP et les ajoute &agrave; notre file d'attente
interne entrante. Il y a une file d'attente de messages sortants par connexion. La t&acirc;che d'&eacute;criture en extrait les messages
et passe les donn&eacute;es &agrave; travers les appels write().</p>
<p>Nous effectuons ceci assez efficacement d'un point de vue charge UC - &agrave; tout moment,
presque toutes ces t&acirc;ches sont au repos, bloqu&eacute;es dans l'attente de grain &agrave; moudre.
Cependant, chacune d'entre elles consomme des ressources r&eacute;elles (par exemple sur de tr&egrave;s vieux
noyaux Linux, chacune sera souvent mise en &oelig;uvre en tant que processus fork()'ed).
&Agrave; mesure de la croissance du r&eacute;seau, le nombre de pairs auxquels chaque routeur voudra s'adresser
augmentera (souvenez-vous, I2P est enti&egrave;rement connect&eacute;, c'est-&agrave;-dire que chaque pair doit savoir
comment passer des messages &agrave; tous les autres. Le support des routes r&eacute;serv&eacute;es
ne r&eacute;duira probablement pas sensiblement le nombre de connexions
n&eacute;cessaires). Ce qui veut dire que dans un r&eacute;seau de 100000 routeurs, chaque routeur
aura jusqu'&agrave; 199998 t&acirc;ches rien que pour s'occuper des connexions TCP!</p>
<p>&Eacute;videment, &ccedil;a ne marchera pas. Nous avons besoin d'une couche transport adaptative.
Dans Java, nous disposons de deux approches principales:</p>
<h4>UDP</h4>
<b><i>Implemented in I2P 0.6 ("SSU") as documented <a href="udp.html">elsewhere</a></i></b>
<p>Sending and receiving UDP datagrams is a connectionless operation - if
we are communicating with 100,000 peers, we simply stick the UDP packets
in a queue and have a single thread pulling them off the queue and shoving
them out the pipe (and to receive, have a single thread pulling in any
UDP packets received and adding them to an inbound queue).</p>
<p>However, moving to UDP means losing the benefits of TCP's ordering, congestion
control, MTU discovery, etc. Implementing that code will take significant
work, however I2P doesn't need it to be as strong as TCP. Specifically,
a while ago I was taking some measurements in the simulator and on the
live net, and the vast majority of messages transferred would fit easily
within a single unfragmented UDP packet, and the largest of the messages
would fit within 20-30 packets. As mule pointed out, TCP adds a significant
overhead when dealing with so many small packets, as the ACKs are within
an order of magnitude in size. With UDP, we can optimize the transport
for both efficiency and resilience by taking into account I2P's particular
needs.</p>
<p>It will be a lot of work though.</p>
<b><i>Impl&eacute;ment&eacute; dans I2P 0.6 ("SSU") tel que document&eacute; <a href="udp.html">ailleurs</a>.</i></b>
<p>L'envoi et la r&eacute;ception de datagrammes UDP sont des op&eacute;rations sans connexion - si
on communique avec 100000 pairs, on colle simplement les paquets UDP dans une file
d'attente et on fait avec une seule t&acirc;che pour les extraire et les pousser dans le tuyau
(et pour recevoir, une seule t&acirc;che en tire les paquets UDP re&ccedil;us et les ajoute dans une file d'entr&eacute;e).</p>
<p>L'ennui, c'est que l'utilisation de UDP fait perdre les avantages de TCP (r&eacute;ordonnancement, gestion de la congestion,
d&eacute;couverte du MTU, etc). Mettre ce code en &oelig;uvre demandera un travail important,
mais I2P n'a pas besoin d'&ecirc;tre aussi solide que TCP. Pr&eacute;cis&eacute;ment,
lorsque j'ai fait des mesures au simulateur et en r&eacute;el sur Internet,
la plupart des messages transf&eacute;r&eacute;s tenaient facilement dans un seul paquet UDP
non fragment&eacute;, et les plus gros messages prenaient 20 &agrave; 30 paquets.
Comme <i>mule</i> le mit en &eacute;vidence, TCP ajoute une surcharge certaine quand il s'agit de g&eacute;rer
autant de petits paquets, vu que les ACKs sont du m&ecirc;me ordre de grandeur.
Avec UDP, nous pouvons optimiser le transport tant pour l'efficacit&eacute; que pour la souplesse
en prenant en compte les besoins sp&eacute;cifiques d'I2P.</p>
<p>&Ccedil;a ne va malgr&eacute; tout pas &ecirc;tre un &eacute;norme travail.</p>
<h4>NIO or NBIO</h4>
<b><i>NIO Implemented in I2P 0.6.1.22 ("NTCP")</i></b>
<p>In Java 1.4, a set of "New I/O" packages was introduced, allowing Java