Vous êtes sur la page 1sur 7

Chapitre 4

Détection et Correction d’erreurs

4.1 La couche liaison de données


La couche 3 (couche réseau) a pour mission, entre autres, de trouver le meilleur chemin pour
acheminer le message. Cette tâche est complexe et met en jeu plusieurs protocoles ; mais en dernier
lieu, la couche 3 d’un noeud du réseau, disons A (ordinateur ou routeur) envoie le message à la
couche 3 d’un autre noeud, B (ordinateur ou routeur) qui lui est physiquement connecté. Pour
cela, elle doit passer le message à la couche physique dont le rôle est d’acheminer les bits.

A B
Physique Physique
· · · 01001100101101 · · ·

Le problème, c’est que le support matériel utilisé par la couche physique (câble coaxial, paire de
cuivre torsadée, fibre optique, ondes radio...) n’est pas fiable à 100%. Certains bits reçus peuvent
être erronés (un 0 à la place d’un 1 ou inversement).
Le service rendu par la couche liaison de données est précisément de faire croire à la couche
réseau qu’elle utilise une couche physique parfaite.

A B
Réseau Réseau
Liaison de données Liaison de données
Physique Physique

Pour cela, la couche liaison de A ajoute au SDU2 transmis par la couche réseau un en-tête
(header ) et un en-queue (trailer ). Ceux-ci sont interprétés par la couche liaison de B ; une fois
que celle-ci est certaine qu’il n’y a pas d’erreurs, elle les supprime et passe les données à la couche
réseau de B. Celle-ci, à son tour, cherche le meilleur chemin pour atteindre le destinataire final,
et comprend qu’elle doit faire passer le message à un autre noeud (C) ; elle fait passer les données
à sa couche 2, etc.
La couche liaison utilise principalement deux méthodes :
— la détection/correction d’erreurs, qui fait l’objet de ce chapitre ;
— un “dialogue” entre émetteur et récepteur, visant à s’assurer que la transmission se passe
correctement : envoi d’accusé de réception, retransmission éventuelle de messages, etc.

24
4.2 Généralités sur les codes détecteurs/correcteurs d’erreurs
Un code détecteur/correcteur d’erreurs est un groupe de bits que l’émetteur ajoute au message
à transmettre. Ce groupe de bits, appelé FCS (Frame Check Sequence), dépend du message et
introduit de la redondance.

Définition 12 (Rendement d’un code) Si le message comporte m bits et le FCS a une lon-
gueur de k bits, alors on dit que le rendement du code est m+k
m
.

Le FCS doit permettre de détecter des erreurs parmi les bits reçus, et éventuellement les
localiser et les corriger. Mais s’il y a trop d’erreurs, la détection et la correction peuvent être
impossibles.

4.2.1 Un code simple : la répétition


Un approche naïve consiste à dupliquer (c’est-à-dire répéter) le message à transmettre.
Supposons que le message effectivement transmis soit le double du message réel. Par exemple,
pour envoyer 11100010, on transmet 1110001011100010. La détection et la localisation des erreurs
sont alors simples : on cherche les différences entre la première et la seconde moitiés du message.
Par contre, il est impossible de corriger une erreur détectée : le bit erroné est différent dans les
deux copies, et rien ne permet de dire lequel est le bon. Le rendement de ce code est 0.5.
Pour remédier à ce problème, on peut envoyer les message en 3 exemplaires au lieu de 2. Dans
ce cas, un bit a soit la même valeur dans toutes les copies, ou la même valeur dans deux d’entre
elles et l’autre valeur dans la troisième copie. Le bit correct est probablement celui qui apparaît
en deux exemplaires : on peut cette fois corriger l’erreur. Le rendement de ce code est 0.33.

4.2.2 Inconvénients et problèmes rencontrés


Le code de répétition est simple, mais présente de nombreux inconvénients, illustrant ceux que
l’on peut rencontrer avec les autres codes :
— le rendement est faible (respectivement 0.5 et 0.33) ;
— certaines erreurs peuvent ne pas être détectées ;
— certaines erreurs détectées ne peuvent pas être corrigées, voire être mal corrigées ;
— la correction nécessite plus de redondance que la détection d’erreurs.

4.3 Codes à contrôle de parité


Les codes à contrôle de parité sont de parité soit pair, soit impair. Dans le premier cas, on va
protéger une séquence de bits en ajoutant un nouveau bit, appelé bit de parité, de telle sorte que
le nombre de bits ayant la valeur 1 dans la séquence protégée plus le bit introduit soit pair. Dans
le second cas, ce nombre doit être impair.

4.3.1 VRC (Vertical Redundancy Check)


C’est la technique la plus simple. Un code ASCII étant défini sur 7 bits, on utilise le 8ème bit
de l’octet pour introduire le code vérificateur.

Exemple : Pour transmettre la chaîne de caractères IUT, on code chaque lettre en ASCII, puis
on ajoute le code de parité.
Lettre ASCII VRC pair VRC impair
I 1001001 11001001 01001001
U 1010101 01010101 11010101
T 1010100 11010100 01010100

Réseaux — Partie 1 25 IUT R&T Villetaneuse


Pour envoyer le message avec un code de parité pair, on transmet (avec l’ordre d’envoi des bits de
gauche à droite) :
11001001
| {z } 01010101
| {z } 11010100
| {z }
I U T

Ce code permet de détecter les erreurs en nombre impair sans pouvoir corriger. Il est peu
efficace.

4.3.2 LRC (Longitudinal Redundancy Check)


Le principe est similaire à celui du VRC, mais au lieu de protéger les caractères un par un,
on protège l’ensemble des bits de même rang de tous les caractères. On obtient alors un code de
protection sur 7 bits.

Exemple : Pour protéger IUT, on calcule le code :


I 1001001
U 1010101
T 1010100
LRC pair 1001000
LRC impair 0110111
Pour envoyer le message avec un code de parité pair, on transmet :

1001001
| {z } 1010101
| {z } 1010100
| {z } 1001000
| {z }
I U T LRC

L’efficacité du code LRC dépend fortement de la longueur du message transmis.

4.3.3 LRC et VRC


On peut également combiner les deux techniques précédentes. On protège alors chaque caractère
par un code VRC et l’ensemble des bits par un code LRC. On obtient donc un LRC sur 8 bits. La
parité des LRC et VRC utilisés est la même (tous les deux pairs ou tous les deux impairs).

Exemple : Pour transmettre la chaîne de caractères IUT, on code chaque lettre en VRC puis en
LRC :
VRC pair VRC impair
I 1001001 11001001 01001001
U 1010101 01010101 11010101
T 1010100 11010100 01010100
LRC 01001000 00110111
Pour envoyer le message avec un code de parité pair, on transmet :

11001001
| {z } 01010101
| {z } 11010100
| {z } 01001000
| {z }
I U T LRC

Réseaux — Partie 1 26 IUT R&T Villetaneuse


4.4 Codes en blocs
4.4.1 Le code de Hamming
Quand on utilise un code en blocs, la suite de bits à émettre est divisée en messages (blocs) de
m bits ; k bits de contrôles sont ajoutés à chaque message de m bit pour former un mot du code
de m + k bits. Chaque bit de contrôle est un bit de parité calculé sur plusieurs bits du message
(mais pas tous les bits).
Prenons l’exemple d’un code découpant les bits à envoyer en blocs (ou messages) de 4 bits. Les
messages possibles sont :
0000 - 0001 - 0010 - 0011 - 0100 - 0101 - 0110 - 0111 - 1000 - 1001 - 1010 - 1011 - 1100 - 1101 -
1110 - 1111.
Pour chacun d’entre eux, l’émetteur calcule des bits de contrôle, formant ainsi un mot du code.
Considérons le code dont les mots sont donnés ci-dessous :
message bits de contrôle mot du code
0000 000 0000 000
0001 101 0001 101
0010 111 0010 111
0011 010 0011 010
0100 011 0100 011
0101 110 0101 110
0110 100 0110 100
0111 001 0111 001
1000 110 1000 110
1001 011 1001 110
1010 001 1010 001
1011 100 1011 100
1100 101 1100 101
1101 000 1101 000
1110 010 1110 010
1111 111 1111 111

Ce code génère un mot de 7 bits pour un message de 4 bit, il est donc appelé code de Ham-
ming(7,4). Le récepteur, à chaque fois qu’il reçoit un mot de 7 bits, vérifie que ce mot fait bien
partie du code, c’est à dire de la troisième colonne du tableau ci-dessus. Si ce n’est pas le cas,
il en déduit qu’un bit (au moins) est erroné. L’erreur est ainsi détectée. . . comment procède le
récepteur pour corriger l’erreur ?
Le code de Hamming, pour corriger les erreurs, se base sur une mesure de dissimilarité entre
deux séquences de bits de même longueur, appelée distance de Hamming.

Définition 13 (distance de Hamming) La distance de Hamming entre deux séquences binaires


s1 et s2 de même taille est le nombre de bits de même rang par lesquels ces deux séquences diffèrent.
Elle est notée d(s1 , s2 ).
Par exemple : d(1100110, 1010110) = 2.

Le récepteur donc analyse le nombre de bits différents entre le code erroné reçu et chaque mot
du code, et choisit un mot valide ayant distance de Hamming minimale.
Imaginons par exemple que le mot envoyé soit 1110010. Le dernier bit est mal transmis et le
récepteur reçoit 1110011. Il s’aperçoit que ce mot ne fait pas partie du code, puis il parcourt le
tableau en calculant à chaque fois la distance entre le mot reçu et le mot du code. Il aboutit aux
résultats suivants :

Réseaux — Partie 1 27 IUT R&T Villetaneuse


mot du code distance avec 1110011
0000 000 5
0001 101 6
0010 111 3
0011 010 2
0100 011 2
0101 110 5
0110 100 4
0111 001 3
1000 110 4
1001 110 3
1010 001 2
1011 100 5
1100 101 3
1101 000 3
1110 010 1
1111 111 2

Le récepteur en déduit que le message envoyé était 1110010, car la distance de Hamming est 1,
et donc corrige l’erreur.
Que se serait-il passé si deux mots du code s’étaient trouvés à une distance de 1 du code
1110011 ? Comment corriger l’erreur dans ce cas ? Avec le code ci-dessus, cette situation ne se
produit jamais, car chaque mot est séparé des autres par une distance de 3 au moins. On dit que
la distance du code est de 3.

Définition 14 (distance d’un code) Soit un code C comportant n séquences valides. La dis-
tance de Hamming du code C est la distance minimale séparant deux mots valides du code. Elle
est notée d(C).

Notons enfin qu’il n’est pas toujours possible de corriger la ou les erreurs Par exemple, si le
message envoyé est 1111111, mais deux erreurs le transforment en 1110011, le récepteur pensera
à nouveau que le message était 1110010. Dans ce cas, la correction sera mauvaise. Le code de
Hamming(7,4) est capable de corriger une erreur, mais pas deux. Plus en générale :

Propriété 1 Un code de distance d(C) détecte d(C) 1 erreurs et corrige k = b d(C)


2
1
c erreurs.

Exemple : Supposons que l’on souhaite transmettre des messages pouvant se coder comme l’une
des séquences du code :
C = {000000, 001110, 011011, 100011, 101101}.
d(C) = min(c1 ,c2 )2C 2 d(c1 , c2 ) = 3.
Avec ce code, on peut détecter au maximum d(C) 1 = 2 erreurs et en corriger k = d(C)
2
1
= 1.

4.4.2 Codes polynomiaux


Les codes polynômiaux sont des cas particuliers de codes en blocs. Dans le code de Ham-
ming(7,4), le calcul des bits de contrôle pourrait être fait de façon logicielle avec une structure
conditionnelle du type switch ... case et le programme de codage en langage C serait très
simple. Par contre si les blocs ne sont pas des groupes de 4 bits, mais de plusieurs centaines, voire
plusieurs milliers de bits, le passage en revue des différents cas prend beaucoup plus de temps !
Les codes polynomiaux permettent de régler ce problème en utilisant un algorithme de calcul
des bits de contrôle différent, et beaucoup plus rapide. Les codes polynomiaux possèdent un autre
avantage : ils peuvent opérer sur des blocs de taille variable. C’est un cas qui se présente souvent

Réseaux — Partie 1 28 IUT R&T Villetaneuse


en transmission, puisque la taille des données peut varier.

Un code polynômial est basé sur l’utilisation d’un polynôme générateur G(x). Les polynômes
manipulés sont binaires : tous les coefficients sont 0 ou 1. Par conséquent, un polynôme générateur
de degré k s’écrit sous la forme :

G(x) = a0 a1 .x a2 .x2 a3 .x3 ... ak .xk

où 8i 2 {0..k}, ai 2 {0, 1}

Le polynôme G(x) est associé à une valeur binaire.

Exemple : La valeur binaire associée au polynôme G(x) = x3 x 1 est 1011.

Soit M le message (séquence de bits) à protéger. Un polynôme M (x) lui est associé :

M = mn . . . m2 m1 m0 ) M (x) = mn .xn ··· m2 .x2 m1 .x m0

Exemple : Au message M = 1101 est associé le polynôme M (x) = x3 x2 1.

Codage
Le calcul du CRC s’effectue dans le corps Z/2Z, c’est-à-dire que :
• 1 1=0
• x x=0
• x= x
Soient :
— G(x) un polynôme générateur de degré k ;
— M (x) le polynôme associé au message M à transmettre.
La procédure de codage consiste à :
— calculer P (x) = M (x).xk . Ceci correspond à un décalage de k bits (vers la gauche) du
message M . La longueur du CRC calculé sera aussi de k bits. Cette opération de décalage
revient à préparer la place nécessaire pour ces k bits de CRC.
— diviser le polynôme P (x) par G(x). Soient Q(x) et R(x) les polynômes quotient et reste
ainsi obtenus :
P (x) = Q(x).G(x) R(x)
— le CRC est le reste R(x) ainsi calculé. On remarque que le reste est forcément au maximum
de degré k 1.
— le message effectivement transmis est associé au polynôme M 0 (x) = P (x) R(x). Il est par
conséquent composé du message initial M suivi de la séquence de k bits correspondant à
R(x).

Exemple : Soient le polynôme générateur G(x) = x3 x 1 et le message à envoyer M = 1101.


Le polynôme correspondant au message est M (x) = x3 x2 1. Le degré de G(x) est 3. Donc,
P (x) = M (x).x3 = x6 x5 x3 . Effectuons la division de P (x) par G(x) :
x6 x5 x3 x3 x 1
x6 x 4
x3 x3 x2 x 1
x5 x4
x5 x3 x2
4
x x3 x2
x4 x2 x
x3 x
x3 x 1
1

Réseaux — Partie 1 29 IUT R&T Villetaneuse


Le quotient est donc Q(x) = x3 x2 x 1, et le reste R(x) = 1. Le message transmis a alors
pour polynôme M 0 (x) = x6 x5 x3 1, d’où M 0 = 1101001.

Sur Ethernet, la taille des données à coder peut varier de 60 à un peu plus de 1500 octets, et
le polynome générateur utilisé est de degré 32. C’est un polynome générateur un peu particulier,
dit cyclique, de sorte que le code correcteur d’erreur est appelé CRC (Cyclic Redundancy Code).
Le calcul est fait juste avant l’encodage physique des bits, par un circuit situé sur la carte réseau.

Décodage (ou détection)


Le récepteur pourrait exécuter un algorithme passant en revue tous les mots du code pour
vérifier si le mot reçu est erroné ou non. Mais là encore, cette solution serait trop lente pour des
blocs de taille importante. On préfère utiliser la propriété ci-dessous.

Propriété 2
1. Un message M 0 transmis correctement a un polynôme M 0 (x) divisible par le polynôme
générateur G(x).
2. Si G(x) comporte au moins 2 termes, les erreurs simples sont détectables.
3. Si G(x) a un facteur irréductible de 3 termes, les erreurs doubles sont détectables.
4. Si G(x) est un multiple de x 1, les erreurs en nombre impair sont détectables.

Lorsque l’on reçoit un message M 0 , deux cas peuvent se présenter :


— M 0 (x) est divisible par G(x) : le CRC ne permet pas de détecter une erreur. Il y a de fortes
chances que le message reçu soit correct. Le message initial M est obtenu en ignorant les k
derniers bits de M 0
— M 0 (x) n’est pas divisible par G(x) : une erreur est détectée.

4.5 Choix d’un code et d’une stratégie de correction


Plus la distance d’un code sera grande, plus le code pourra détecter et corriger d’erreurs, mais
plus son rendement sera faible. Le choix d’un code résulte donc d’un compromis entre ces deux
paramètres, capacité à détecter/corriger et rendement.

Certains protocoles font le choix d’utiliser un code de faible rendement, mais de grande dis-
tance, capable de détecter et corriger des erreurs. Cette stratégie est dite FEC (Forward Error
Correction). Elle est adoptée sur les supports de stockage type CD et DVD.

Une autre stratégie consiste à utiliser un code de bon rendement, mais de faible distance, par
exemple une distance de 2. Un tel code peut détecter une seule erreur et est incapable d’effectuer
des corrections. Si une erreur est détectée, le récepteur demande à l’émetteur de retransmettre le
message (remarquons que cette procédure de correction par demande de retransmission ne peut
pas se passer d’un code détecteur d’erreurs). Cette stratégie est dite ARQ (Automatic Repeat
Request) et constitue un bon choix si les erreurs sont peu fréquentes. La stratégie ARQ est utilisée
dans la plupart des réseaux informatiques (LAN et WAN).

Réseaux — Partie 1 30 IUT R&T Villetaneuse

Vous aimerez peut-être aussi