-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDISco.html
213 lines (135 loc) · 24.1 KB
/
DISco.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<html>
<head>
<meta charset="utf-8">
<title>Réflexions sur DISco</title>
<style type="text/css">
body {
text-align: justify;
}
.not_verified {
color: grey;
}
</style>
</head>
<body>
<h1>Réflexions sur DISco</h1>
<h2>SkipTree</h2>
<p>Donner quelques explications sur SkipTree.</p>
<p>Les deux composantes principales s'articulent autour de la répartition des données et de l'échange des messages ...</p>
<h3>Partitionnement</h3>
<p>Des noeuds SkipNet sont positionnés sur base de leur <em>identifiant dénominatif</em>.</p>
<ul>
<li>Expliquer le postionnement des noeuds dans SkipNet.</li>
</ul>
<p class="not_verified">Est-il intéressant qu'un noeud communique à ses voisins la déconnexion d'un autre noeud ? Non. Seul le noeud se déconnectant prévient ses voisins avant sa déconnexion. Dans le cas d'un noeud planté, ses voisins détecteront sa déconnexion par l'abscence de Ping ou avec la rupture de connexion.</p>
<ul>
<li>Un noeud gère une portion d'espace déterminée et <b>unique</b> dans l'espace de partitionnement.</li>
<li>Il n'existe <b>jamais</b> d'espace non attribué dans l'espace de partitionnement.</li>
<li>Un noeud se trouvant dans un anneau de niveau supérieur se trouve forcément dans les anneaux de niveau inférieur.</li>
</ul>
<p>Une donnée insérée dans SkipTree est associée à une <em>clé multidimensionnelle</em>, un ensemble de paires clé-valeur. Ces paires clé-valeur doivent identifier la donnée à insérer en décrivant au mieux ses caractéristiques intrinsèques. Comme une donnée est constituée de valeurs, le choix des clés peut être immédiat. Par exemple : si la donnée est une photographie, sa clé multidimensionnelle pourrait être composée de chacun de ses champs EXIF.</p>
<br />
<p>L'overlay SkipTree suppose <em>qu'étant donné un point, un noeud est capable d'identifier si le noeud responsable de ce point se trouve à sa droite ou à sa gauche</em>. Ceci implique que la clé multidimensionnelle accompagnant une donnée soit définie pour chacune des paires clé-valeur (c'est-à-dire pour les k-dimensions d'une clé à k-dimensions) gérées par les noeuds rencontrés lors de l'acheminement de ce point. Si ce n'était le cas, les noeuds ne pourraient déterminer la direction vers laquelle acheminer certaines requêtes.</p>
<p>Le fait qu'une donnée puisse être associée à une clé multidimensionnelle partielle, c'est-à-dire une clé multidimensionnelle comprenant peu de dimensions peut poser problème. Dans ce cas, il arrivera que les hyperplans de partitionnement ne puissent être utilisées pour orienter efficacement la requête en la limitant à des régions déterminées de l'overlay. La requête devra alors être adressée à l'ensemble des noeuds se trouvant dans ce sous-arbre de partitionnement.</p>
<br />
<p>L'ensemble de l'espace multidimensionnel est réparti entre les noeuds présents dans l'overlay. Lorsqu'un nouveau noeud souhaite rejoindre l'overlay, il doit obtenir, depuis un des noeuds présents dans la structure, une partie de cet espace multidimensionnel. Le noeud contacté doit donc subdiviser l'espace multidimensionnel sous sa responsabilité. Lors de la subdivision de son espace multidimensionnel, un noeud peut chercher à rencontrer deux objectifs :</p>
<ul>
<li>Répartir équitablement les données sous sa responsabilité ;</li>
<li>Employer les dimensions selon une distribution uniforme.</li>
</ul>
<p>En cherchant à répartir équitablement les données entre un noeud et un nouveau noeud, la charge des noeuds sera équilibrée. Cette charge restera équilibrée aussi longtemps que les modifications (ajouts ou suppressions) dans ce sous-espace multidimensionelle seront limitées. Dans le cas où on cherche à distribuer uniformément les paritions entre les dimensions, il existe une indépendance entre les données et les partitionnements. Cependant, cette solution n'offre aucune garantie quant à la répartition des données entre les noeuds.</p>
<p>La méthode de partitionnement proposée par SkipTree propose de distribuer plus ou moins uniformément les dimensions. Elle privilégie, nénamoins, les <em>premières dimensions</em>. Ces dernières sont considérées comme étant plus discriminantes. Si la distribution des données prises en charge par l'overlay est à peu près connue, il est souhaitable d'associer les premières dimensions aux clés les plus populaires, celles le plus largement définies.</p>
<br />
<p>Les valeurs des domaines sur lesquels sont définies les clés multidimensionnelles doivent être comparables <code>lt</code>, <code>eq</code>, <code>eq</code>.</p>
<p>Lors d'un partitionnement, la valeur choisie pour l'équation appartient à un domaine. Cette valeur peut être générée ou choisie parmi des valeurs disponibles. La première solution impose l'usage d'un générateur de valeur pour le domaine. La seconde solution suppose que le noeud responsable du partitionnement ait déjà sous sa responsabilité des données parmi lesquelles il pourra choisir une valeur. Dès lors, tant qu'un noeud ne gère pas de données, il sera incapable d'acceuillir des nouveaux noeuds.</p>
<h3>Localité</h3>
<p>Une distinction est faite entre la <b>localité de routage</b> et la <b>localité de contenu</b>.</p>
<h4>Localité de routage</h4>
<p>Les noeuds d'un overlay SkipNet sont chacun caractérisés par un <em>identifiant numérique</em> et un <em>identifiant dénominatif</em>. L'<em>identifiant numérique</em> indique les <em>anneaux</em> du réseau SkipNet auxquels le noeud appartient tandis que l'<em>identifiant dénominatif</em> influence la disposition du noeud sur ces <em>anneaux</em>.</p>
<p>En choisissant pour les noeuds des <em>identifiants dénominatifs</em> appropriés (par exemple : en les préfixant d'un nom de domaine), il est possible d'influencer leur disposition sur les <em>anneaux</em> et donc leur voisinage. Ce faisant, SkipNet peut garantir une localité de routage.
<p>Une idée intuitive sur l'exactitude de la localité de routage : les noeuds de chaque <em>anneau</em> sont organisés selon leur <em>identifiant dénominatif</em>. La procédure de routage par <em>identifiant dénominatif</em> interdit qu'un message soit envoyé à un noeud situé après la destination recherchée. Dès lors, tous les noeuds rencontrés pendant la procédure de routage possèdent un <em>identifiant dénominatif</em> compris entre celui de la source et de la destination. Si la source et la destination appartiennent à un même domaine, alors les messages ne seront acheminés qu'à travers des noeuds de ce domaine.</p>
<p>Pour une localité de routage correcte, le choix des <em>identifiants dénominatifs</em> doit respecter des règles.</p>
<ul>
<li>Aucun <em>identifiant dénominatif</em> ne peut être généré de manière aléatoire.</li>
<li>Aucun <em>identifiant dénominatif</em> d'un domaine ne peut être être préfix d'un autre domaine.</li>
</ul>
<p>L'overlay SkipTree reprend une large partie du fonctionnement de SkipNet et le lien entre ces deux systèmes s'appuie sur l'<em>identifiant dénominatif</em>. SkipTree impose que cet identifiant soit <em>l'ordre dans lequel les noeuds apparaissent dans les feuilles de l'arbre de partitionnement depuis la gauche vers la droite</em>. L'emplacement dans l'arbre de partitionnement, l'<em>identifiant de partitionnement</em>, est calculé par le noeud contacté au moment du raccordement à l'overlay. </p>
<p>Si l'<em>identifiant dénominatif</em> pouvait servir à assurer la localité des noeuds dans SkipNet, la contrainte imposée par SkipTree sur cet identifiant ne le permet plus.</p>
<p>De manière plus précise. La contrainte portant sur les <em>identifiants dénominatifs</em> définie par les créateurs de SkipTree n'est qu'un moyen d'atteindre un objectif précis : les noeuds gérant des partitions successives de l'arbre de partitionnement doivent se succéder dans l'<em>anneau</em> de niveau 0. Cette règle est à la base du système de routage utilisé dans SkipNet et largement réutilisé dans SkipTree.</p>
<p>Pour maintenir une localité de routage au sein de SkipTree, il faudrait que le noeud contacté par le nouveau noeud lors du raccordement à l'overlay SkipTree soit <em>proche, local</em> de ce nouveau noeud.</p>
<ul>
<li>
<p>Une solution consiste à enrichir le <em>composant de bootstrap</em> de façon à ce qu'il connaisse la topologie complète du réseau ou soit capable de déterminer à priori la <em>localité</em> entre un nouveau noeud et les noeuds déjà <em>connectés</em>.</p>
<p>Cette première solution ne requiert pas de modification de l'overlay SkipTree. Par contre, elle complexifie singulièrement le <em>composant de boostrap</em>. Comment peut-il connaitre l'ensemble de la topologie ? Comment peut-il déterminer les localités entre noeuds ? Comment suit-il les connexions et déconnexions des noeuds ?</p>
</li>
<li>
<p>Une autre solution consiste à relacher la contrainte imposée par SkipTree sur l'<em>identifiant de partitionnement</em> et l'<em>identifiant dénominatif</em>. Le principe est de trouver le noeud local qu'un nouveau noeud doit contacter.
<p>Si les <em>identifiants dénominatifs</em> sont choisis pour satisfaire la localité de routage propre à SkipNet, le noeud le plus local d'un nouveau noeud (a) peut être contacté par un routage sur base de l'<em>identifiant dénominatif</em> du nouveau noeud ; (b) peut être un des deux voisins directs du nouveau noeud (noeud de gauche ou de droite dans l'<em>anneau</em> de niveau 0) si les liens SkipNet ont été construits. Pour rejoindre l'overlay SkipTree, le nouveau noeud contacte alors le noeud local qu'il a déterminé. </p>
<p>Cette seconde solution préserve la simplicité du <em>composant de boostrap</em>. Une liste de noeuds <em>connectés</em> remplira parfaitement ce rôle. Néanmoins, elle suppose une définition correcte et respectée des <em>identifiants dénominatifs</em>. Dans une implémentation de type (b), cette solution nécessite que le nouveau noeud renvoie son statut mis-à-jour à l'ensemble de ses liens SkipNet.</p>
</li>
</ul>
<h4>Localité de contenu</h4>
<p>La localité de contenu suppose que des données puissent être attribuées à un des noeuds locaux. Il doit donc être possible de placer arbitrairement des données sur des noeuds.</p>
<p>Dans SkipTree, une donnée caractérisée par des dimensions sera gérée par le noeud responsable de l'espace multidimensionel auquel appartient cette donnée. Dans la mesure où l'espace mutlidimensionnel sous la reponsabilité d'un noeud est appellé à évoluer au gré des arrivées de nouveaux noeuds, une localité de contenu <em>stricte</em> ne semble pas être transposable à l'overlay SkipTree.</p>
<h3>Routage</h3>
<p>Une "Range Query" efficace suppose l'existence de localité entre données : des données semblables se situent à des emplacements proches. Dès lors une "Range Query" portant sur des attributs non définis dégradent les performances de l'opération. Dans ce cas, les propriétés de localité entre données sont sans effets.</p>
<ul>
<li>Un noeud interrogé dans le cadre d'un "Range Query" <b>doit</b> répondre. En effet, l'auteur de la question doit pouvoir déterminer si tous les noeuds ont répondu.</li>
</ul>
<h3>Requêtes</h3>
<h4>Distinction des cas</h4>
<p>Les différents types de requêtes se définissent par les relations entre des ensembles de dimensions : les dimensions propres à une requête et les dimensions propres aux CPEs manipulant la requête.</p>
<ol>
<li>Ddim = Cdim</li>
<li>Ddim ⊋ Cdim (Ddim ⋂ Cdim = Cdim ∧ Ddim \ Cdim ≠ ∅)</li>
<li>Ddim ⊈ Cdim (Ddim ⋂ Cdim ⊈ Cdim ∧ Ddim ⋂ Cdim ≠ ∅)</li>
<li>Ddim ⋂ Cdim = ∅</li>
</ol>
<p>Le cas 1 correspond au comportement prévu par l'overlay SkipTree. Le cas 2, en respectant les conditions posées dans le cas 1 (à savoir que toutes les dimensions nécessaires au routage soient précisées dans la requête), est également gérée par SkipTree. Par contre, les cas 3 et 4 ne peuvent être directement gérés par SkipTree. Dans ces deux derniers cas, une ou plusieurs dimensions nécessaires au routage sont absentes. Dès lors, SkipTree sera incapable de déterminer le noeud auquel envoyer les requêtes.</p>
<p>Pour router correctement une <em>requête partiellement routable</em>, une solution simple est d'ajouter à cette requête les dimensions manquantes à l'opération de routage. Cet ajout ne devrait pas avoir d'influence sur les noeuds normalement intéressés par cette requête. La valeur à attribuer à chacune des dimensions ajoutées doit donc être choisie avec attention.</p>
<h4>Insertion</h4>
<p>Un point est sous la responsabilité d'un noeud s'il satisfait les équations qui caractérisent l'espace mutlidimensionnel géré par ce noeud. Or, l'ensemble de l'espace multidimensionnel est réparti entre tous les noeuds. Dès lors, un point qui ne satisfait pas les équations d'un noeud est nécessairement sous la responsabilité d'un autre noeud.</p>
<p>Un noeud ayant reçu une demande d'insertion consulte les équations qui caractérisent son espace multidimensionnel. Il parcourt ses <em>équations</em> et vérifie si le point satisfait celles-ci. Si un noeud est responsable de la donnée à insérer, il le mémorise sinon il transmet la demande d'insertion au voisin le plus approprié.</p>
<p>Si un noeud n'est pas responsable d'un point, il interroge ses voisins en commençant par les plus éloignés. Le noeud vérifie, pour chacun d'eux, si celui-ci gère le point et obtient la direction dans laquelle doit être orientée la requête (grâce à la distribution gauche/droite entre les hyperplans de partitionnement). Le noeud local adresse alors la requête au voisin le plus éloigné ne se trouvant pas après la destination.</p>
<br />
<p>Il peut exister des requêtes d'insertion où les dimensions propres à la donnée à insérer ne sont pas du tout ou pas toutes connues du noeud contacté (similarités aux cas 3 et 4 décrits précédemment). Dans ce cas, le noeud contacté est incapable d'orienter la requête.</p>
<p>Au sein d'un overlay SkipTree, tous les noeuds qui sont issus d'une même racine possède au moins une dimension commune. En effet, au sein de cet overlay, la distribution de l'espace multidimensionnel s'effectue de manière hiérarchique. Les noeuds issus d'une même racine se trouvent soit à gauche, soit à droite d'un hyperplan défini pour une dimension. Par ailleurs, tous les noeuds de SkipTree possèdent au moins une dimension commune puisqu'ils ont tous un ancètre commun.</p>
<p>Si un point n'est pas défini pour la dimension ayant servi pour la première découpe du SkipTree, alors il ne possède aucune position dans l'espace multidimensionnel partagé entre les noeuds de ce SkipTree. Ceci se déduit du fait que tous les noeuds sont définis pour la première dimension du SkipTree. Si le point n'est pas défini pour cette première dimension alors il est certain qu'aucun noeud ne gère explicitement ce point.</p>
<p>Un raisonnement identique peut être appliqué à un point défini pour les n premières dimensions de découpe du SkipTree mais pas pour la n+unième dimension. Un tel point se trouve en dehors de l'espace multidimensionnel géré par le sous-ensemble de noeuds SkipTree considéré. Il n'existe, de nouveau, pas de noeud gérant explicitement ce point.</p>
<p>À partir du moment où aucun des noeuds du SkipTree ne gère un point et que la position de ce point n'est pas déterminable, ce point peut être placé n'importe où parmi l'ensemble de noeuds considérés : dans le noeud le plus à gauche (à droite) de l'arbre de partitionnement, dans un noeud choisi au hasard, dans le noeud contacté lors de l'insertion, etc. Néanmoins, cette position devra s'apparier au mécanisme de recherche mis en place pour trouver un tel point.</p>
<p>Une solution simple pour régler un problème de positionnement d'un point dans l'espace multidimensionnel est d'attribuer une <em>valeur virtuelle</em> aux dimensions non définies de ce point. Ceci permettra aux noeuds de déterminer le sous-espace mutlidimensionnel gérant cette donnée.</p>
<p>Une <em>valeur virtuelle</em> doit respecter certaines règles (dont la validité doit pouvoir être vérifiée pour l'ensemble des domaines sur lesquels pourraient être définies les dimensions) : </p>
<ul>
<li>Une <em>valeur virtuelle</em> doit être ordonnable. Elle doit pouvoir être comparée avec les équations des CPEs.</li>
<li>Une <em>valeur virtuelle</em> doit être distinguable. Elle n'existe pas et ne doit pas être interprétée comme une caractéristique.</li>
</ul>
<p>Plus concrètement, la <em>valeur virtuelle</em> peut prendre une valeur particulière comme <code>None</code> mais celle-ci doit alors être rendue ordonnable. Autrement, il est également envisageable qu'une véritable valeur du domaine (propre à la dimension non définie) soit choisie comme <em>valeur virtuelle</em> et soit marquée comme <em>virtuelle</em>.</p>
<p>La solution de <em>choisir une véritable valeur du domaine</em> peut être facilement applicable en sélectionnant la valeur parmi les CPEs du noeud local. L'abscence d'une dimension dans un point sera découverte au moment où ce point est comparé avec un hyperplan de partitionnement recourant à cette dimension. Or, un hyperplan de partionnement partage l'espace multidimensionnel selon une valeur et une dimension précises. Une valeur du domaine peut donc toujours être trouvée à partir des CPEs du noeud local.</p>
<p>Par ailleurs, le fait de choisir une valeur du noeud local assure une certaine localité de contenu vis-à-vis du noeud contacté pour l'insertion : les données seront placées soit sur le noeud local (si la valeur est incluse), soit sur un de ses voisins directs (si la valeur est exclue).</p>
<br />
<p>Au <strong>moment de son insertion</strong>, une donnée insérée dans l'overlay SkipTree est définie pour toutes ses dimensions. En effet, lors de son insertion, une donnée est associée à des dimensions directement déduites de ses caractéristiques intrinsèques. Il en découle que les données insérées sont nécessairement définies pour toutes leurs dimensions. Aucune donnée insérée dans l'overlay ne contient de dimensions non définies.</p>
<h4>Recherche simple</h4>
<p>Le routage d'une <em>recherche simple</em> est identique à celui appliqué à une requête d'insertion. Le routage d'une <em>recherche simple</em> diffère toutefois dans la réaction à donner lorsqu'une des dimensions nécessaires au routage n'est pas définie. La solution proposée dans le point traitant de la disctinction des cas règle ce problème.</p>
<br />
<p>À priori, toutes les dimensions d'une requête simples sont définies. Effectivement, une requête spécifie les caractéristiques de l'élément recherché. Si des dimensions/caractéristiques peuvent prendre n'importe quelle valeur, il faut utiliser une <em>requête par intervalle</em> dans laquelle ces caractéristiques auront été définies par l'intervalle <code>]-∞, +∞[</code>.</p>
<p>Lors du routage, une requête dont toutes les dimensions sont correctement définies pourrait croiser des noeuds comprenants plus de dimensions qu'elle. Ceci pourrait représenter un problème si un noeud doit orienter la requête sur base d'une dimension employée dans ses hyperplans mais non présente dans la requête. Pour autoriser le routage d'une <em>requête partiellement routable</em>, la solution suggérée précédemment reste la plus simple à savoir ajouter à cette <em>requête partiellement routable</em> la dimension manquante.</p>
<p>La dimension à ajouter à une requête simple partiellement routable prend comme valeur l'intervalle <code>]-∞, +∞[</code>. En effet, lorsque la dimension manquante est découverte, l'espace multidimensionnel (réparti sur plusieurs noeuds dont le noeud local) responsable des données visées par cette requête a déjà été identifié. Puisque les données recherchées peuvent être présentes dans n'importe quel noeud de cet espace multidimensionnel, tous ces noeuds devront être touchés. Notez que cet ajout transformera la requête en une requête par intervalle.</p>
<br />
<p>Il peut encore arriver que des données présentes dans les noeuds d'un overlay SkipTree comprennent plus de dimensions/caractéristiques que les données ciblées par une requête. Les données comprenants les dimensions définies dans la requête pourraient : </p>
<ul>
<li>ne présenter aucune dimension/caractéristique supplémentaire ;</li>
<li>présenter des valeurs quelconques pour les dimensions/caractéritiques non précisées.</li>
</ul>
<p>Normalement, le comportement à adopter est déterminé par l'émetteur de la requête. Dans la situation présente, seul le second cas nous intéresse. Insitions bien sur le fait que le comportement de sélection est totalement indépendant de la manière dont la requête est routée.</p>
<h4>Recherche par intervalle</h4>
<p>Une <em>recherche par intervalle</em> peut viser les données appartenant à plusieurs noeuds. Le système de routage doit gérer l'envoi de messages à de multiple destinataires. Par ailleurs, les requêtes d'intervalle doivent être contenues entre des limites pour éviter que les noeuds ne se transmettent plusieurs fois (voire indéfiniment) les requêtes entre eux. Quoi qu'il arrive, ces limites accompagnent les requêtes par intervalles et doivent être réduites à chaque hop.</p>
<br />
<p>La propagation des requêtes par intervalle doit s'effectuer du noeud local vers l'extérieur, vers les noeuds les plus éloignés du noeud local. En effet, il pourrait exister, parmi les noeuds intéressés par la requête d'intervalle, des noeuds situés encore plus loin que le noeud le plus éloigné connu du noeud local. En propageant les requêtes vers l'extérieur, les noeuds même les plus lointains finiront par être joints.</p>
<br />
<p>Un noeud est concerné par un intervalle de recherche s'il est directement responsable d'une partie de cet intervalle et/ou si des noeuds responsables d'une partie de cet intervalle se trouvent entre lui et le noeud situé au niveau directement supérieur. Par exemple, si le niveau directement supérieur est à gauche d'un noeud alors ce noeud s'occupe des éléments sous sa responsabilité et tous les éléments situés entre lui et le noeud directement à sa gauche.</p>
<p>Pour sélectionner les noeuds auxquels adresser la requête par intervalle, un noeud local peut parcourir ses voisins en commençant par les plus éloignés (par les niveaux supérieurs). Durant ce parcours, il relève <strong>tous les voisins</strong> concernés par l'intervalle de recherche.</p>
<p>Imaginons une liste de noeuds dont la première position est occupée par le noeud le plus lointain et la dernière position par le noeud le plus proche. Pendant le parcours de cette liste seront sélectionnés les noeuds s'occupant de cet intervalle ainsi que les noeuds pour lesquels l'intervalle est située à gauche. Le parcours s'interrompt après l'ajout du noeud à la droite duquel il n'existe plus de noeuds concernés par l'intervalle. Ce dernier noeud doit être sélectionné qu'il soit ou non concerné par l'intervalle. En effet, il peut exister des noeuds intermédiaires entre lui et le noeud le précédant.</p>
<p>Lorsqu'une requête d'intervalle est transmise à un noeud, son champ d'action doit être limitée à une partie des noeuds du SkipTree. Conformément au sens de propagation discuté plus haut, l'intervalle d'activité doit limiter le champ d'action d'un noeud à lui-même et à tous les éléments situés entre lui (compris) et le noeud de niveau directement supérieur (non compris).</p>
<p>Rappellons que l'espace multidimensionnel est partagé entre tous les noeuds. Comme ce partage se fait de manière hiérarchique, un noeud est toujours à même de déterminer si <em>une partie de l'espace multidimensionnel</em> se situe à sa gauche ou à sa droite. Il n'existe donc pas de problème de direction dans le routage par intervalle.</p>
</body>
</html>