Chapitre 3 : Diffusion
Pierre Gançarski*
Octobre 2003
Département d'informatique
UFR de Mathématique et Informatique
Université Louis Pasteur – Strasbourg
2 - Protocole utilisant un serveur
3 - Protocole utilisant des
estampilles
4 - Protocole respectant l'ordre
causal
* Pierre.Gancarski@dpt-info.u-strasbg.fr
Problématique Étant
donnés N sites et un réseau de communication, comment assurer une diffusion stable où
-
tous les destinataires, non en panne,
reçoivent les mêmes messages ;
-
si l'émetteur d'un message tombe en panne
pendant une diffusion, alors aucun destinataire ne reçoit le message.
-
Il n'y a pas d'ordre supposé sur la réception
des messages par les destinataires
-
Il n'y a pas de relation entre l'ordre
d'émission et l'ordre de réception.
Définition : Si
l'ordre de réception est identique pour tous les récepteurs (propriété
d'uniformité) ET si l'ordre de réception est identique à
l'ordre global ou causal d'émission alors la diffusion est dite atomique.
Les émetteurs transmettent leurs messages au serveur qui les numérote et assure la diffusion. Ce protocole utilise très souvent des fenêtres d'anticipation.
Le serveur S dispose d'un tampon d'émission
qui lui permet de stocker T messages, d'une variable A qui donne
le numéro du dernier message reçu à diffuser et d'une variable d'acquittement V
qui correspond au dernier message acquitté par TOUS les destinataires. A chaque
case C du tampon est associé un tableau TT
de N entiers (ou bits).
Lorsque S reçoit un
message à diffuser.
-
soit le
tampon n'est pas plein A - V < T : il numérote le message par A + 1 et incrémente A. Puis, il l'envoie a
tous les destinataires.
-
soit le
tampon est plein : il
prévient l'émetteur et stocke le message "ailleurs". Puis il renvoie
chacun des messages du tampon aux destinataires qui ne l'ont pas acquitté.
Chaque destinataire dispose d'une variable R
qui donne le numéro du dernier message reçu et acquitté. Lorsqu'un destinataire reçoit un message numéroté d noté Md
-
si d > R + 1, alors le destinataire stocke ce message et demande
au serveur la ré-émission (vers lui) des messages MRk tel que d + 1 < Rk < R et MRk n'est pas stocké par le destinataire.
-
si d
= R + 1 alors le
destinataire émet l'acquittement du message Md vers le serveur, incrémente R
et "utilise" Mdi
-
si d < R + 1 alors le destinataire émet l'acquittement du
message Md vers le serveur
Si après une
incrémentation de R, le destinataire trouve MR+1 dans son stock, il émet l'acquittement du message MR+1
vers le serveur, incrémente R
et "utilise" MR+1.
Lorsque S reçoit un
acquittement du message M„ stocké dans la case c d'un destinataire Di , il met
à 1 le bit TT[i]. Si toutes les cases du tableau TT valent 1, il
considère le message M„ comme acquitté par tous les destinataires : dès que v = V + 1, il déstocke M„ et incrémente v.
Lorsqu'il reçoit un
message de demande de ré-émission d'un message M, il le ré-émet vers le
demandeur.
Cet algorithme qui assure l'ordre entre le serveur et les destinataires ainsi que l'uniformité, est utilisé par le réseau ethernet.
Protocole
ABCAST : Atomic Broadcast.
Un site Si émet un message Mk en
diffusion en le numérotant par son horloge locale Hi par k = Hi. Puis
il incrémente Hi.
Un site Sj qui reçoit un
message Mk, le met dans une file d'attente locale AMI
au site et le marque "en attente". Il renvoie à l'émetteur un
accusé de réception Rk estampillé par la date de réception (H„ j) du
message puis incrémente Hj.
L'émetteur Si maintient un tableau Ai(l..n)
lui permettant de mémoriser les acquittements reçus. Quand il reçoit un
accusé de réception Rk de Sj il incrémente Ai[j].
Quand l'émetteur a reçu tous les accusés de réception Rk (c'est
à-dire : b'j = l..n, Ai[j] > k ), il valide le message Mk en
envoyant aux destinataires un message Vk d'estampille Ek =
Em,,,x égale au maximum des estampilles reçues.
Lorsqu'un site Sv reçoit un message de
validation Vk d'estampille Ek correspondant
à un message Mk, il date le message Mk par
l'estampille Ek, effectue H,. = max(Ek, H,.) + 1, et met
Mk dans la liste des messages utilisables UMi
Voyons quand il peut les utiliser.
Prenons l'exemple suivant
: S2 envoie un message MI. Sl envoie deux messages
M2et Mien diffusion de suite. Tout ce que S2 sait, c'est qu'il n'a pas reçu de
message en diffusion avant d'émettre Ml. Voyons à quel moment, il pourra
décider de traiter ces trois messages, en fonction des dates d'arrivée de ces
messages sur les différents sites.
S2 peut traiter Ml lorsqu'il reçoit
tous les accusés de réception (donc lorsqu'il s'envoie Vi) car il
sait que toute nouvelle demande sera estampillée par lui-même, d'une date
supérieure à la date d(V1) = H2 de réception de Vl car H2
= max(estampille(Vi), d(V1)) + 1 .
Il ne peut pas traiter Ml car on peut
avoir la situation suivante
où Ml est acquitté en 3 par S3, alors que M2
est acquitté en 1 par SI, en 1 par S3 et en 2 par S2 donc
est daté par 2.
Il est donc obligé d'attendre.
Pour S2 il n'y a aucune différence entre ce
cas et le cas 2.
Il attend(alors que nous voyons bien qu'il
pourrait le traiter)
En conclusion, un site ne peut donc traiter un
message Mk
que si les diffusions commençant entre la date de
réception de Mk
et la date de réception de la validation de Mk sont
résolues.
Donc
Pour chaque message Mut utilisable,
il attend la date de validation pour tous les messages M,a qu'il
a acquitté avant réception de la validation de Mk. Puis il
traite dans l'ordre de leur date de validation, les
messages utilisables.
Remarque
On peut représenter en un seul état l'émission
en diffusion d'un message Mk par Si , sa réception, son acquittement
et la réception de cet acquittement par Si avec Hi = Hi+2, Ai(i) =
Ai(i)+1, Ami = AMi U{Mk}
Exemple d'application du protocole
Nous donne, avec Hi estampille
du site Si,
Mk message envoyé, Ai acquittements
reçus, AMi
message en attente de datage, UMi message
utilisables, Rk
envoi d'un acquittement de Mk , Vk envoi
d'une validation de Mk
)
Évén. |
E1 |
E2 |
E3 |
E4 |
E5 |
E6 |
E7 |
E8 |
E9 |
E10 |
E11 |
E12 |
E13 |
H1 |
2 |
|
|
3 |
|
3 |
|
|
|
4 |
|
|
|
A1 |
1,0,0 |
|
|
|
|
1,1,0 |
|
|
|
|
|
|
|
AMI |
M2 |
|
|
M2,M1 |
|
|
|
|
|
M2,M1,M3 |
|
|
|
UM1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Action |
M2=M(0,1) |
|
|
Rl(2,1) |
|
|
|
|
|
R3(3,1) |
|
|
|
H2 |
|
2 |
|
|
3 |
|
3 |
5 |
|
|
6 |
|
|
A2 |
|
0,1,0 |
|
|
|
|
0,1,1 |
0,2,1 |
|
|
1,2,1 |
|
1,2,2 |
AM2 |
|
M1 |
|
|
M1,M2 |
|
|
M1,M2,M3 |
|
|
M2,M3 |
|
|
UM2 |
|
|
|
|
|
|
|
|
|
|
M1(2,1) |
|
|
Action |
|
M1=M(0,2) |
|
|
R2(2,2) |
|
|
M3=M(3,2) |
|
|
Vl(2,1) |
|
|
H3 |
|
|
1 |
|
|
|
|
|
2 |
|
|
3 |
|
A3 |
|
|
|
|
|
|
|
|
|
|
|
M1,M3,M2 |
|
AM3 |
|
|
M1 |
|
|
|
|
|
Ml,M3 |
|
|
|
|
UM3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Action |
|
|
R1(0,3) |
|
|
|
|
|
R3(1,3) |
|
|
R2(2,3) |
|
Évén. |
E14 |
E15 |
E16 |
E17 |
H1 |
|
5 |
5 |
|
A1 |
|
|
1,1,1 |
|
AMI |
|
M2,M3 |
M3 |
|
UM1 |
|
M1(2,1) |
M1(2,1),M2(2,3) |
|
Action |
|
|
V2(2,3) |
|
H2 |
|
|
|
6 |
A2 |
|
|
|
2,2,2 |
AM2 |
|
|
|
M3 |
UM2 |
|
|
|
M1(2,1),M3(3,2) |
Action |
|
|
|
V3(3,2) |
H3 |
4 |
|
|
|
A3 |
|
|
|
|
AM3 |
M3,M2 |
|
|
|
UM3 |
M1(2,1) |
|
|
|
Action |
|
|
|
|
Évén. |
E18 |
E19 |
E20 |
E21 |
H1 |
|
|
|
|
A1 |
|
|
|
|
AMI |
|
|
|
|
UM1 |
|
M1(2,1), M2(2,3), M3(3,2) |
|
|
Action |
|
TRAITER
M1, M2, M3 |
|
|
H2 |
|
|
|
|
A2 |
|
|
|
|
AM2 |
|
|
|
|
UM2 |
|
|
M1(2,1), M3(3,2), M2(2,3) |
|
Action |
|
|
TRAITER
M1, M2, M3 |
|
H3 |
5 |
|
|
|
A3 |
|
|
|
|
AM3 |
M2 |
|
|
|
UM3 |
M1(2,1), M3(3,2) |
|
|
M1(2,1), M3(3,2), M2(2,3) |
Action |
|
|
|
TRAITER
M1, M2, M3 |
L'uniformité est assurée, pas l'atomicité : si
tous les sites reçoivent Mi+i avant
Mi, alors l'estampille de Vi+l
sera inférieure à l'estampille de Vi et donc Mi+i
sera "utilisé" avant Mi.
De plus, ce protocole nécessite 3 x
N messages.
Néanmoins, la reprise sur panne est simplifiée
: Un site Si peut reprendre le protocole en cas de panne en examinant sa liste
de messages en attente
Pour chaque message Mk
de cette liste Si
interroge tous les autres destinataires
-
Si un site Sj
possède le message Mk à
l'état "utilisable", il transmet à Si l'estampille Ek
associée à Mk.
Si transmet alors, le message de validation Vk
estampillé Ek à
tous les autres sites.
-
Sinon, S émet Mk
comme s'il n'avait jamais été émis.
Chaque site Si entretient
une horloge vectorielle Vi[N]. Chaque
événement d'envoi ou de réception de message sera daté par celle-ci : la
relation de précédence causale entre les événements pourra donc être retrouvée
(propriété des horloges vectorielles).
-
avant de diffuser un message M,
Si exécute Vi[i]
+ + et estampille M
par VM = Vi.
-
à la réception d'un message M
envoyé par Si et estampillé par VM,
Sj le met en attente jusqu'à ce que VM[i]
= Vj[i] + 1 et
"k
¹
i, VM[k] £
Vj[k] (horloge vectorielle)
-
après traitement de M,
Sj exécute : Vj[k]
= max(Vj[k], VM [k]) pour tout k = 1, ..., N
nous donne :
Evénement |
État et action initiaux |
État et actions correspondants |
V1=[0,0,0] |
V1=[1,0,0], émission M1([1,0,0],1) |
|
El |
V2=[0,0,0], réception de Ml par S2 |
S2 traite Ml, V2=[1,0,0] |
E2 |
V3=[0,0,0] |
V3=[0,0,1], émission M2([0,0,1],3) |
E3 |
V2=[1,0,0], réception de M2 par S2 |
S2 traite M2, V2=[1,0,1] |
E4 |
V3=[0,0,1], réception de Ml par S3 |
S3 traite Ml, V3=[1,0,1] |
E5 |
V3=[1,0,1] |
V3=[1,0,2], émission de M3 :([1,0,2],3) |
E6 |
V2=[1,0,1], réception de M3 par S2 |
S2 traite M3, V2=[1,0,2] |
E7 |
V2=[1,0,2] |
V2=[1,1,2], émission de M4 :([1,1,2],2) |
E8 |
V3=[1,0,2], réception de M4 par S3 |
S3 traite M4, V3=[1,1,2] |
E9 |
V1=[1,0,0], réception de M4 par S1 |
V1[3] < Vm[3], S1
stocke le message |
E10 |
V1=[1,0,0], réception de M2 par S1 |
S1 traite M2, V1=[1,0,1] |
E11 |
V1=[1,0,1], réception de M3 par S1 |
Si traite M3, V1=[1,0,2] à |
E11(suite) |
|
S1 peut alors traiter M4, et Vl=[1,1,2] |
A
noter que les trois horloges vectorielles V1, V2 et V3 ont la même valeur.