Reti di CalcolatoriAndrea Frosini1 Reti di Calcolatori a.a. 2005/06 Lezione 7
Reti di CalcolatoriAndrea Frosini2 Nel modello di riferimento: Application Transport Network Data Link Fisico
Reti di CalcolatoriAndrea Frosini3 Rilevare errori - schema Host1: messaggio M + bit di controllo R = parola di codice C Host2: riceve parola C C è una parola del codice NO Errore rilevato! SI Host2: trasmette OK ma … C == C SINO Errore non rilevato! Nessun errore!
Reti di CalcolatoriAndrea Frosini4 Per correggere un singolo errore su m bit si devono impiegare almeno r bit di check, con 2 r m + r + 1 ossia sono necessari circa log 2 m bit Esiste un codice (codice di Hamming) che raggiunge tale limite teorico Esiste una semplice tecnica che consente di impiegare il codice di Hamming per correggere burst di errori (cioè gruppi contigui di errori, come usualmente accade nelle trasmissioni reali). Codici per la correzione di errori
Reti di CalcolatoriAndrea Frosini5 Codice di Hamming per burst di errori Il codice di Hamming corregge un singolo errore su stringhe di m bit Supponiamo di voler invece correggere un burst di al più k errori (ma non tutti i k bit sono necessariamente sbagliati!) 1. codificare k messaggi consecutivi di lunghezza m, ottenendo k parole di codice di lunghezza n 2. organizzare le k parole di codice in una matrice 3. inviare i k bit della prima colonna, poi i k bit della seconda colonna,..., infine i k bit della n-esima colonna Se il burst di errori è lungo al più k, ciascuna riga della matrice può avere al più 1 bit errato, quindi il codice è in grado di correggerlo
Reti di CalcolatoriAndrea Frosini6 23 Codice di Hamming per burst di errori - idea Supponiamo di voler trasmettere parole di 7 lettere ( m = 7 ) su una linea con burst di errori di al più 5 lettere ( k = 5 ). La situazione è la seguente: a marean p eptied inalid f r o si ettear r in l 123 … 1 a maXean p epXied inXlid f r X si eXtear r in l … XXXXX
Reti di CalcolatoriAndrea Frosini7 Codici per il rilevamento di errori I codici per il rilevamento di errori sono in pratica più diffusi dei codici per la correzione di errori: i codici per il rilevamento sono molto più efficienti dei codici per la correzione (meno ridondanza nei bit trasmessi) se un codice per la correzione di 1 errore indica che un bit è errato, vi è una probabilità non trascurabile che si sia verificato un intero burst di errori (gli errori tendono ad addensarsi) Il più semplice codice per il rilevamento di errori è il bit di parità Tale codice ha distanza di Hamming pari a 2, quindi garantisce solo il rilevamento del singolo errore
Reti di CalcolatoriAndrea Frosini8 Un solo bit di controllo è sufficiente per blocchi di qualunque dimensione I burst di errori vengono rilevati solo quando il numero effettivo di bit sbagliati è dispari, ossia con probabilità 50% Bit di parità Un metodo per rilevare burst di al più k errori basato sul bit di parità è il seguente: 1. distribuire i bit da trasmettere in una matrice con righe di k bit 2. per ciascuna colonna, calcolare il relativo bit di parità 3. inviare la prima riga, poi la seconda riga, eccetera 4. inviare come ultima riga i bit di controllo
Reti di CalcolatoriAndrea Frosini9 Il codice polinomiale, detto anche cyclic redundancy code (CRC), è il codice per il rilevamento di errori più diffuso In apparenza è complesso, ma esistono circuiti hardware abbastanza semplici che lo calcolano efficientemente E basato sulla teoria dei campi algebrici: le addizioni e sottrazioni sono sempre effettuate modulo 2 (XOR), quindi non esiste riporto o prestito la divisione è effettuata come in binario, ma con sottrazioni modulo 2; inoltre un divisore sta nel dividendo se il dividendo ha tanti bit significativi quanti il divisore, ossia se il resto ha strettamente meno bit significativi del divisore Codice polinomiale
Reti di CalcolatoriAndrea Frosini10 Il codice polinomiale è basato sulla rappresentazione di polinomi algebrici a coefficienti in {0, 1} con sequenze di bit Una sequenza di m bit rappresenta un polinomio di grado (al più) m – 1; ciascun bit è il valore di un coefficiente. Ad esempio: corrisponde al polinomio x 10 +x 6 +x 3 +1 Rappresentazione di polinomi con sequenze di bit
Reti di CalcolatoriAndrea Frosini11 Polinomio generatore Il polinomio generatore G(x) è un polinomio algebrico prefissato di grado r (la stringa ha r + 1 bit). E conosciuto sia dal trasmittente che dal ricevente. Il primo e lultimo bit devono essere 1. Il messaggio da trasmettere è rappresentato da un altro polinomio M(x) di grado al più n - 1 (n > r) Idea chiave: appendere al messaggio una stringa di bit di controllo in modo tale che il polinomio corrispondente alla parola di codice sia divisibile per G(x) Se uno o più errori di trasmissione modificano la parola di codice, il polinomio corrispondente non sarà divisibile, con alta probabilità, per G(x).
Reti di CalcolatoriAndrea Frosini12 Algoritmo di calcolo del CRC 1. Mittente e destinatario si mettono d'accordo su un polinomio generatore G(x), con bit più significativo e meno significativo uguali ad 1 2. Il mittente aggiunge al frame un checksum di r bit 0 in coda agli m bit del messaggio (la nuova stringa rappresenta il polinomio x r M(x)) 3. Dividere la stringa corrispondente a x r M(x) per la stringa corrispondente a G(x) 4. Sottrarre il resto (che ha sempre al più r bit) dalla stringa corrispondente a x r M(x) 5. Il risultato è il polinomio T(x) da trasmettere: è divisibile per G(x) ed i primi m bit sono uguali a quelli di M(x) Il polinomio T (x) ricevuto viene diviso per G(x): il messaggio viene accettato se e solo se il resto della divisione è zero
Reti di CalcolatoriAndrea Frosini13 Fissiamo il polinomio generatore: G(x) = x 4 +x+1 (corrispondente a 10011) Sia il messaggio = (corrispondente a M(x) = x 5 +x 3 +x 2 +1) Passo 1: aggiungiamo r = 4 bit 0 al messaggio: Passo 2: dividiamo x 4 M(x) per G(x): scartiamo il risultato e teniamo il resto (la divisione sarà : = con resto 1110 ) Passo 3: calcoliamo – 1110 = Passo 4: trasmettiamo la sequenza ottenuta Calcolo del CRC - Esempio
Reti di CalcolatoriAndrea Frosini14 Sia T(x) il polinomio trasmesso, e sia T(x)+E(x) il polinomio ricevuto Ogni bit 1 in E(x) corrisponde ad un bit invertito per errore T(x)+E(x) diviso G(x) ha resto zero se e solo se E(x) è nullo (trasmissione senza errori), oppure E(x) è un multiplo di G(x) Errori catturati dal CRC I
Reti di CalcolatoriAndrea Frosini15 Se G(x) ha due o più termini, il codice polinomiale rileva tutti gli errori singoli (E(x) = x i non può essere multiplo di G(x), perché G(x) contiene sempre almeno due termini) Se G(x) non è divisibile per x e non divide alcun x k +1, con k = 1,..., n, il codice polinomiale rileva tutti gli errori in parole di codice da n bit consistenti in due bit invertiti (cioè tali che E(x) = x i +x j ) (?perché?) Ad es. x 15 +x non divide x k +1 per ogni k < Se G(x) ha come fattore x + 1, il codice polinomiale rileva tutti gli errori consistenti di un numero dispari di bit (?perchè?) Errori catturati dal CRC II
Reti di CalcolatoriAndrea Frosini16 Se G(x) ha grado r (r bit di controllo), il codice polinomiale rileva tutti i burst di al più r errori Infatti, un burst di k errori è rappresentato da E(x) = x i (x k ) Dato che G(x) contiene il termine x 0, G(x) non può avere x i come fattore; se k - 1 < r, laltro fattore di E(x) non può essere multiplo di G(x) (aggiungo qualcosa che è più piccolo di G(x)). Perciò il resto di E(x)/G(x) non può essere nullo Dato un burst di r + 1 errori, la probabilità che esso non sia rilevato è 1/2 r-1 (solo quando gli r+1 bits sono uguali a G(x)); la probabilità di non rilevare un burst di più di r + 1 errori è 1/2 r (assumendo che allinterno del burst gli errori si distribuiscano in modo casuale) Errori catturati dal CRC III
Reti di CalcolatoriAndrea Frosini17 CRC standard I Alcuni polinomi generatori sono diventati standard internazionali: CRC-8: x 8 +x 2 +x+1 (usato in reti ATM) CRC-10: x 10 +x 9 +x 5 +x 4 +x+1 (usato in reti ATM) CRC-12: x 12 +x 11 +x 3 +x 2 +x+1 (usato per caratteri codificati con 6 bit) CRC-16: x 16 +x 15 +x 2 +1 (usato per caratteri ad 8 bit) CRC-CCITT: x 16 +x 12 +x 5 +1 (usato da HDLC) CRC-32: x 32 +x 26 +x 23 +x 22 +x 16 +x 12 +x 11 +x 10 +x 8 +x 7 +x 5 + x 4 +x 2 +x +1 (usato in IEEE 802 e in reti ATM)
Reti di CalcolatoriAndrea Frosini18 Il codice a 32 bit CRC-32 rileva: tutti gli errori singoli e doppi tutti gli errori con numero dispari di bit tutti i burst di errori di lunghezza al più 32 teoricamente, il % di tutti i burst di errori lunghi più di 32 bit In realtà la stima teorica per i burst lunghi 33 o più bit è troppo ottimistica, in quanto i bit erronei non sono distribuiti allinterno del burst in modo veramente casuale CRC standard II