Reti di Calcolatori a.a. 2005/06 Lezione 7 Reti di Calcolatori Andrea Frosini 1 Nel modello di riferimento: Application Transport Network Data Link Fisico Reti di Calcolatori Andrea Frosini 2 Rilevare errori - schema Host1: messaggio M + bit di controllo R = parola di codice C Host2: riceve parola C’ SI Host2: trasmette OK C’ è una parola del codice NO Errore rilevato! ma … C == C’ SI Nessun errore! Reti di Calcolatori NO Errore non rilevato! Andrea Frosini 3 Codici per la correzione di errori Per correggere un singolo errore su m bit si devono impiegare almeno r bit di check, con 2r m + r + 1 ossia sono necessari circa log2 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). Reti di Calcolatori Andrea Frosini 4 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 Calcolatori Andrea Frosini 5 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: 1 2 3 … a m a r e n a a m a X e n a p e p t i d e p e p X i d e r i n a l d i r f r o s i n i f r X s l e t 1 2 t e r a 3 i n X l d i i n i l e X t e r a … XXXXX Reti di Calcolatori Andrea Frosini 6 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 Calcolatori Andrea Frosini 7 Bit di parità 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% 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 Calcolatori Andrea Frosini 8 Codice polinomiale 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 Reti di Calcolatori Andrea Frosini 9 Rappresentazione di polinomi con sequenze di bit 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: 10001001001 corrisponde al polinomio x10 +x6 +x3 +1 Reti di Calcolatori Andrea Frosini 10 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 l’ultimo 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 Calcolatori Andrea Frosini 11 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 xr M(x)) 3. Dividere la stringa corrispondente a xr M(x) per la stringa corrispondente a G(x) 4. Sottrarre il resto (che ha sempre al più r bit) dalla stringa corrispondente a xr 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 Calcolatori Andrea Frosini 12 Calcolo del CRC - Esempio Fissiamo il polinomio generatore: G(x) = x4 +x+1 (corrispondente a 10011) Sia il messaggio = 101101 (corrispondente a M(x) = x5 +x3 +x2 +1) Passo 1: aggiungiamo r = 4 bit “0” al messaggio: 1011010000 Passo 2: dividiamo x4 M(x) per G(x): scartiamo il risultato e teniamo il resto (la divisione sarà 1011010000 : 10011 = 101010 con resto 1110 ) Passo 3: calcoliamo 1011010000 – 1110 = 101101 1110 Passo 4: trasmettiamo la sequenza ottenuta 1011011110 Reti di Calcolatori Andrea Frosini 13 Errori catturati dal CRC I 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) Reti di Calcolatori Andrea Frosini 14 Errori catturati dal CRC II Se G(x) ha due o più termini, il codice polinomiale rileva tutti gli errori singoli (E(x) = xi 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 xk+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) = xi+xj) (?perché?) Ad es. x15+x14+1 non divide xk+1 per ogni k < 32.768 Se G(x) ha come fattore x + 1, il codice polinomiale rileva tutti gli errori consistenti di un numero dispari di bit (?perchè?) Reti di Calcolatori Andrea Frosini 15 Errori catturati dal CRC III 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) = xi (xk-1 +. . .+1) Dato che G(x) contiene il termine x0, G(x) non può avere xi come fattore; se k - 1 < r, l’altro 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/2r-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/2r (assumendo che all’interno del burst gli errori si distribuiscano in modo casuale) Reti di Calcolatori Andrea Frosini 16 CRC standard I Alcuni polinomi generatori sono diventati standard internazionali: • CRC-8: x8 +x2 +x+1 (usato in reti ATM) • CRC-10: x10 +x9 +x5 +x4 +x+1 (usato in reti ATM) • CRC-12: x12+x11+x3+x2+x+1 (usato per caratteri codificati con 6 bit) • CRC-16: x16 +x15 +x2 +1 (usato per caratteri ad 8 bit) • CRC-CCITT: x16 +x12 +x5 +1 (usato da HDLC) • CRC-32: x32 +x26 +x23 +x22 +x16 +x12 +x11 +x10 +x8 +x7 +x5 + x4 +x2 +x +1 (usato in IEEE 802 e in reti ATM) Reti di Calcolatori Andrea Frosini 17 CRC standard II 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 99.9999999% 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 all’interno del burst in modo veramente casuale Reti di Calcolatori Andrea Frosini 18