• Aucun résultat trouvé

V ← V ∪ {nœud} ;

faireSuivre(e, nœud) ;

7.2.3.1 Routage indéterministe : combinaison marquage et routage

La méthode basée sur le routage indéterministe permet de combiner, dans le même temps, le routage des sous-clés et le marquage des nœuds (cf. l’algorithme 9) ; les trajets empruntés par les paquets ne sont pas prédéfinis mais sont déterminés dynamiquement pendant le tranfert des paquets. L’algorithme consiste en effet à sectionner une clé principale en plusieurs sous-clés puis de les envoyer successivement tout en plaçant chaque nœud utilisé (pas seulement visité) dans un chemin

74

7.2. RECHERCHE DES K−CHEMINS S-T DISJOINTS

dans la liste V. Typiquement, une première sous-clé est envoyée et sur réception d’un message d’acquittement, la sous-clé suivante est expédiée, et ainsi de suite (ce processus est répété k fois). En faisant abstraction des acquittements, cet algorithme a une complexité de temps d’exécution τ1= O(k(|E| + |V | log |V |)), où E représente l’ensemble des arcs, V désigne l’ensemble de sommets et k définit le nombre de sous-clés. En outre, la complexité en termes d’espace vaut σ1= O(k|V |).

Comme il n’est pas possible de prédire le nombre des chemins disjoints dans le réseau, il pourrait exister une disproportion entre le nombre de sous-clés et le nombre effectif des chemins disjoints trouvés. Ceci est en effet dû au fait que la clé est fragmentée avant le démarrage du processus de recherche des chemins disjoints.

7.2.3.2 Routage déterministe : pre-routage puis routage

La méthode du routage déterministe consiste en deux étapes successives, comme le montre formellement l’algorithme 10. D’abord, le procédé permet de déterminer tous les k−chemins disjoints, entre les nœuds s et t, à travers le graphe G ; les nœuds parcourus sont ainsi placés à la fois dans la liste V et dans la liste définissant le chemin concerné. Ensuite, se servant des informations récoltées durant l’exploration d’un chemin, chaque membre du couple (s, t) fragmente sa clé en plusieurs composantes proportionnellement au nombre des chemins disjoints trouvés, dont chaque composante est subséquemment expédiée via un chemin séparé antérieurement déterminé. L’un des avantages de cette approche est d’avoir une parité entre le nombre de chemins disjoints et le nombre de sous-clés à générer. Le temps d’exécution de l’algorithme décrivant cette approche, dans le pire des cas, est : τ2= τ1+ O(k|V |) = O(k(|E| + |V |(1 + log |V |))). Alors que la complexité en termes d’espace, dans le pire des cas, vaut : σ2= σ1= O(k|V |).

En dépit des coûts relativement élevés dûs au temps d’exécution et à la complexité en termes d’espace, cette méthode présente un avantage notable : le nombre de sous-clés est toujours pro-portionnel au nombre des chemins disjoints déterminés, ce qui permet d’éviter, éventuellement, de réutiliser certains chemins en raison du nombre élevé de sous-clés. Néanmoins, comme la topologie pourrait changer au cours du temps, les chemins disjoints initialement déterminés pourraient n’être plus valides au moment où ils sont effectivement utilisés pour l’acheminement des sous-clés.

7.2.3.3 Prospection puis routage : routage à la source

L’approche consiste en la combinaison des concepts introduits par les deux algorithmes précé-dents. Concrêtement, il s’agit de déterminer un seul chemin s − t à la fois puis directement l’utiliser afin d’acheminer une sous-clé. Ce processus est exécuté k fois. Cet algorithme dispose de la même complexité que la methode auparavant définie (routage déterministe). Aussi, il reprend à son compte les inconvénients soulignés pour les deux premiers algorithmes et requiert, en outre, une certaine stabilité topologique du réseau.

7.2.3.4 Équivalence entre le flot maximal et le nombre des chemins disjoints

L’idée derrière cette approche est basée sur le théorème de Menger [75] (cf. la section 3.3 pour plus de détails sur ce théorème). Elle consiste en effet en une réduction du problème de recherche des chemins disjoints au problème de recherche du flot maximal entre les nœuds s et t. Ce procédé consiste à assigner la capacité unitaire à chaque arc et déterminer ensuite la valeur du flot maximal entre les deux nœuds considérés, en l’occurence s et t. Bien qu’elle semble théoriquement intéressante, l’approche requiert cependant une connaissance globale de la topologie ; cette contrainte ne répond pas aux exigences des réseaux de grande taille, comme le sont les systèmes P2P.

7.2.3.5 Remarques

1. Afin de minimiser les coûts relatifs à la recherche des chemins disjoints entre les nœuds s et t, une amélioration pourrait être apportée aux algorithmes décrits précédemment. Il s’agit

Algorithme 10 : Routage déterministe

Input : G = (V, E), (s, t), ComposantesClé

V ← ∅ ;

begin

k ← |ComposantesClé| ;

j ← k − 1 ;

V ← V ∪ {s, t} ;

while j ≥ 0 do

nœud ← s ;

while nœud 6= t do

d

min

← distance

H

(nœud, t) ;

foreach voisin ∈ listeVoisinsDe(nœud) do

d ← distance

H

(voisin, t) ;

if voisin /∈ V and d < d

min

then

d

min

← d ;

nœud ← voisin ;

V ← V ∪ {nœud} ;

P

j

← P

j

∪ {nœud} ;

j ← j − 1 ;

while k > 0 do

e ← ComposantesClé[k] ;

envoyerViaChemin(e, P

k

) ;

k ← k − 1 ;

76

7.2. RECHERCHE DES K−CHEMINS S-T DISJOINTS

de considérer le nœud destinataire t, dans la phase d’initiation d’échange de clés, comme une entité passive dans la recherche des chemins disjoints ; lequel nœud doit seulement se contenter de réutiliser les trajets empruntés par les paquets reçus du nœud source afin d’y envoyer ses sous-clés. Le nœud destinataire n’a pas, en effet, pour rôle de déterminer les chemins disjoints. Cependant, lorsqu’un changement de topologie se produit, entre la réception d’une sous-clé et avant l’entame d’une réponse de la part du nœud t, alors ce dernier sera contraint de lui-même trouver un chemin disjoint afin d’expédier une sous-clé. Ainsi, les rôles respectifs des nœuds s et t se permutent automatiquement.

2. L’échange des sous-clés peut se faire de façon parallèle et conjointe. Typiquement, chaque nœud détermine et utilise ses chemins disjoints indépendamment de son correspondant. Cette méthode exige néanmoins un coût lié à la recherche des chemins disjoints égale au double de celui relatif aux méthodes précédentes.

7.2.3.6 Comparaison technique des méthodes de routage multi-chemin

Le tableau 7.11 dresse une compraison d’ordres de grandeur de différents algorithmes étudiés ci-dessus. En raison de sa robustesse, de ses coûts de complexité relativement réduits et des propriétés inhérentes au procédé de subdivision de clé (que nous étudierons plus loin dans ce chapitre), la méthode du routage indéterministe constitue, pour nous, une solution de choix. Nous allons en effet l’adopter pour notre algorithme de routage, lequel algorithme est étudié dans les lignes suivantes.