Nous avons vu précédemment comment différents services pouvaient être rendus au travers de protocoles indépendants les uns des autres. Nous allons voir lors de sur cette présentation un protocole complet les rendant tous, le protocole HDLC.
Le protocole HDLC pour « High-Level Data Link Control » est un protocole de niveau liaison de donnée développé dans les années 70. D’abord utilisé très largement dans les réseaux étendus tels que X25, il a inspiré par la suite de nombreux autres protocoles. Le protocole HDLC peut fonctionner dans plusieurs modes, celui qui nous intéresse aujourd’hui étant le mode appelé asynchrone équilibré. Ce mode permet la communication entre deux systèmes, deux équipements considérés comme égaux.
Le protocole HDLC fournit un certain nombre de services:
Pour cela HDLC utilise un format d’unité de donnée composée de plusieurs champs:
01111110
sont placés en début et en fin d’unité de donnée;Intéressons nous maintenant au champ de contrôle.
Le type de trame est codé au travers des deux premiers bits du champ de contrôle.
0*
indiquant une trame d’information notée I;10
une trame de supervision notée S;11
indiquant une trame non numérotée notée U.Comme nous l’avons dit précédemment les trames d’information permettent de transporter les informations reçues depuis la couche supérieure. Les trames non numérotées permettent principalement de gérer la communication entre les deux systèmes. Enfin les trames de supervision permettent de rendre les services de détection de perte, de reprise sur perte et de contrôle de flux.
Afin de mettre en œuvre les services dont nous venons de parler chaque type de trame possède un champ de contrôle avec un format propre.
Regardons maintenant les règles de fonctionnement du protocole. Dans HDLC les éléments les plus originaux sont liés à la détection et au traitement des pertes.
Les unités de données (PDU) contenant des informations utiles sont numérotées comme dans le cadre du protocole du bit alterné. Ce numéro associé au compteur NS
des trames I (trames d'information) est codé sur 3 bits. Afin de savoir quel est le prochain numéro à utiliser (pour la valeur de NS), l’émetteur maintient une variable appelée VS
qui est incrémentée à chaque nouvelle émission de trame I.
Lorsqu’une trame I est reçue correctement par le récepteur, il acquitte sa réception au travers d’une trame de supervision appelée RR
pour « Receive Ready ». Dans cette trame, le récepteur indique au travers du champ NR
, dans le champ de contrôle, le numéro de la prochaine trame attendue.
Afin de savoir quel est ce numéro le récepteur maintient une variable appelée VR
qui est incrémentée à chaque fois qu’une trame est reçue correctement.
On considère qu’une trame est reçue correctement lorsque son numéro correspond au prochain numéro de trame attendu, c'est-à-dire que l’on considère que les trames doivent être reçues dans l’ordre.
Comme dans le cadre du bit alterné, la perte de trame peut être détectée en associant un minuteur à l’émission de chaque trame. Lors de l’expiration du minuteur, la variable d’émission VS
reprend la valeur qu’elle avait avant l’émission de la trame perdue, et celle-ci est réémise.
Illustrons le fonctionnement du protocole par un exemple d'échange représenté par le diagramme temporel ci-dessous.
I 0,0
. C'est-à-dire une trame d’information dans laquelle la valeur du champ NS
représenté par le premier chiffre a pris la valeur de VS
: 0. Nous expliquerons plus tard le rôle du deuxième zéro présent ici.VS
.NS
est égale à VR
. Comme c’est le cas la trame est considérée comme reçue correctement et le récepteur incrémente son compteur VR
puis envoie un acquittement au travers de la trame de supervision RR 1
. Dans cette trame la valeur du champ NR
a pris la valeur de VR
. Enfin son contenu est délivré à la couche supérieure.I 1,0
et incrémente ensuite la variable VS à 2. Cette deuxième trame d’information se perd.VS
reprend alors la valeur avant l’émission de la trame associée au minuteur c'est-à-dire 1. Le minuteur est de nouveau enclenché puis la trame est réémise.VS
est incrémenté passant de 1 à 2. Cette fois la trame arrive à destination.VR
au champ NS
de la trame reçue, les valeurs étant les mêmes il incrémente VR
puis envoie un acquittement au travers de la trame de supervision RR 2
puis délivre le contenu de la trame à la couche supérieure.
Le compteur VR
présent chez le récepteur et dont nous avons déjà parlé permet de régler le problème des duplicatas. Ainsi si l’émetteur réémet une trame déjà reçue par le récepteur, le récepteur se rend compte en comparant le numéro de la trame NS
à son compteur VR
que ce n’est pas la trame qu’il attend. Dans cette situation, le récepteur envoie une trame d’indication d’erreur de type REJ
(REJECT) dans laquelle le champ NR
prend la valeur de VR
, c'est-à-dire indique le prochain numéro de trame attendue et ignore par la suite les trames d’information ne portant pas le numéro attendu.
Voyons au travers d’un exemple comment cela fonctionne. Comme dans notre exemple précédent, la trame initiale parvient au récepteur qui l’acquitte. Les variables sont incrémentées de part et d’autre.
RR 1
se perd.VS
à 0 réenclenche le minuteur et retransmet I 0,0
.VR
à NS
et se rend compte que les deux valeurs 0 et 1 sont différentes. Il laisse donc VR
inchangé ne délivre pas les données à la couche supérieure et renvoie un message de rejet REJ 1
.Une des améliorations apportées par HDLC est la mise en pipeline. Dans le protocole du bit alterné, une unité de donnée ne circule de l’émetteur vers le récepteur que lorsque la précédente a été acquittée. HDLC peut également fonctionner selon ce principe comme nous le voyons ici.
Cependant ceci limite le débit effectif entre l’émetteur et le récepteur puisque l’émetteur passe du temps à attendre les acquittements sans rien faire. Ainsi nous voyons ici que la transmission des trois trames d’information utilisant ce principe prend le temps t1.
Dans le cas d’une mise en pipeline, les trames d’information peuvent être émises sans attendre ce qui réduit le temps total de transmission à t2, (t2 plus court que t1).
t2 étant plus petit que t1 et la quantité d'information transmise étant la même, le débit effectif est plus important que dans l'échange précédent.
L’existence du mode pipeline dans HDLC implique la possibilité pour plusieurs minuteurs d’être enclenchés simultanément, chacun étant attaché à l’émission d’une trame d’information.
La possibilité d’envoyer plusieurs trames d’information au récepteur sans attendre leur acquittement pose cependant un problème. Que faire lorsqu’une trame d’information parmi l’ensemble des trames envoyées se perd ?
Dans la version du protocole HDLC que nous étudions, cela se traduit par l’arrivée d’une trame portant un numéro NS plus grand que le numéro attendu VR (2 par rapport à 1 dans le chronogramme d' exemple ci-dessus).
Le récepteur considère alors la trame comme non reçue correctement, ignore sont contenu et envoie comme nous l’avons vu précédemment un message de rejet REJ
associé au numéro de trame attendu. Lorsque ce message arrive à l’émetteur, il donne à la variable VS
la valeur contenue dans le champ NR
c'est-à-dire 1, désarme les minuteurs en cours et renvoie immédiatement les messages leur étant associés à partir de ceux numérotés VS
. Ce mode de reprise sur perte est appelé « go back n » puisque l’émetteur retourne dans l’état ou il était avant l’émission de la trame d’information numérotée NR
.
Ce mode de fonctionnement fait alors porter la détection de la perte chez le récepteur au travers de la découverte d’un « trou » entre deux numéros de
séquence de trames reçues consécutivement. L’émetteur est informé de cette découverte au travers de la trame REJ
. Ce fonctionnement permet généralement d’accélérer la reprise sur perte par rapport à l’utilisation du minuteur chez l’émetteur.
Nous avons supposé jusqu’à présent que l’information circulait uniquement dans le sens émetteur vers récepteur : client vers banque dans les exemples. Dans la pratique, la banque peut évidemment avoir également envie de transmettre de l’information au client.
HDLC offre cette possibilité. Afin de permettre la gestion de la communication
dans les deux sens, chaque entité maintient deux variables, VS
et VR
contrôlant respectivement les trames d’information transmises et reçues. Ces deux nouvelles variables sont représentées ci-dessous en rouge.
Dans cet exemple chaque trame d’information est acquittée au travers d’une trame de supervision RR.
La possibilité de transmettre des trames d’information dans les deux sens est utilisée par HDLC pour une autre amélioration appelée « piggy backing ». L’idée est d’utiliser les trames d’information afin de réaliser les acquittements sans utiliser des trames de contrôle.
Ce mécanisme est donc utilisé par le récepteur lorsque celui-ci doit envoyer un acquittement à l’émetteur et doit envoyer à peu près au même moment une trame d’information à celui-ci. A cet effet les trames d’information possèdent
dans le champ de contrôle un champ NR
dans lequel le récepteur indique le numéro de la prochaine trame d’information attendue, c'est-à-dire en y copiant la valeur de la variable VR
. La valeur de ce second champ est indiquée dans nos échanges par la deuxième valeur numérique précédant le I.
Lorsqu’il reçoit une trame d’information, l’émetteur considère que toutes les trames d’information d’un numéro inférieur à la valeur contenue dans NR
ont été reçues par le récepteur et désactive les minuteurs associés.
Un petit exercice pour conclure. En supposant que l’on ait l’échange suivant entre les deux entités Client et Banque
Quelles sont selon vous les valeurs de X et Y ?
La bonne réponse et 2 pour X et 1 pour Y en effet, la banque lorsqu’elle reçoit la trame I 1,1 incrémente VR (c'est-à-dire X) de 1 à 2, VS (c'est-à-dire Y) reste inchangé. Du coté du client VR (c'est-à-dire Y) est incrémenté de 0 à 1 après la réception de I 0,1, VS (c'est-à-dire X) reste inchangé. L’émission et la réception des trames de supervision RR n’a pas d’influence sur les variables.