Rilevazione degli errori: parità, checksum e CRC
Come il livello Data Link aggiunge bit ridondanti nel trailer per accorgersi di una corruzione e perché parità, checksum e CRC hanno poteri di rilevazione così diversi.
1. Perché i bit si corrompono durante la trasmissione
Ogni mezzo trasmissivo introduce disturbi: il rumore elettromagnetico, le attenuazioni, le interferenze tra cavi vicini (crosstalk) o le variazioni di tensione possono alterare il valore di uno o più bit durante il loro percorso dal trasmettitore al ricevitore. Un bit 1 diventa 0, un 0 diventa 1 — e il ricevitore non ha modo di saperlo, a meno che non utilizzi una tecnica di rilevazione degli errori.
La soluzione adottata a livello Data Link è aggiungere al trailer del frame dei bit ridondanti — bit calcolati in funzione dei dati trasmessi. Il ricevitore ripete il calcolo sui dati ricevuti e confronta il risultato con i bit ridondanti nel trailer: se non coincidono, si è verificato un errore.
Ridondanza = bit extra che non aggiungono informazione utile ma permettono di verificare l'integrità. Tutto il gioco è: quanta ridondanza aggiungere per ottenere quale probabilità di rilevazione.
Esistono tre grandi famiglie di tecniche, ordinate per potenza crescente:
Bit di parità
1 bit ridondante. Rileva solo errori singoli (numero dispari di errori).
Checksum
8 o 16 bit ridondanti. Rileva molti errori comuni ma non tutti i pattern.
CRC
16 o 32 bit ridondanti. Potere di rilevazione elevatissimo — standard nei protocolli di rete.
2. Bit di parità
Il bit di parità è la tecnica più semplice. Si aggiunge un solo bit ridondante al termine di una sequenza di bit di dati. Il valore di questo bit è scelto in modo che il numero totale di bit a 1 nell'intera sequenza (dati + bit di parità) sia pari o dispari, a seconda della convenzione scelta.
Parità pari
Il bit di parità è scelto in modo che il numero totale di 1 (dati + parità) sia pari. Se i dati hanno un numero dispari di 1, il bit vale 1; altrimenti 0.
Parità dispari
Il bit di parità è scelto in modo che il numero totale di 1 sia dispari. Funziona in modo speculare rispetto alla parità pari.
Esempio con parità pari (EVEN)
Il bit di parità rileva solo gli errori su un numero dispari di bit (1,3,5…). Se si alterano 2,4,6… bit, la parità rimane invariata e l'errore passa inosservato. È ancora usata in hardware ad alta velocità (bus SCSI, PCI, cache CPU) dove la semplicità conta più della perfezione.
In verifica chiedi sempre: "Quanti 1 ha il dato? La parità è pari o dispari? Quindi il bit di parità vale...?" Fai due contaggi separati: prima dei dati, poi del totale. Se capita la domanda trabocchetto su 2 errori, rispondi: parità non lo vede.
3. Checksum
Il checksum migliora il bit di parità usando più bit ridondanti — tipicamente 8 o 16. L'algoritmo somma tutti i byte (o parole a 16 bit) del frame e invia il complemento in uno della somma come campo di controllo nel trailer.
Somma modulo
Somma tutti i byte header+payload modulo 256 (8 bit) o 65536 (16 bit).
End-around carry
Se c'è riporto oltre il limite, lo sommi al bit meno significativo.
Complemento NOT
Inverti tutti i bit. Il risultato è il checksum da inserire nel trailer.
Immagina un frame con byte: 0x44 0x61 0x74 0x69. Sommiamo in binario. Otteniamo somma parziale. Se superiamo 0xFF (per checksum 8 bit) riportiamo l'overflow. Alla fine calcoliamo NOT(somma) → questo è il checksum. Il ricevitore somma dati+checksum: deve ottenere 0xFF (o 0xFFFF).
Verifica lato ricevitore
Il ricevitore somma tutti i byte ricevuti (dati + checksum). Se non ci sono errori, la somma dovrebbe dare tutti 1 (0xFF per 8 bit, 0xFFFF per 16 bit) — oppure fare 0 se si considera anche il complemento. Qualsiasi deviazione segnala errore.
Checksum a 16 bit in header IP, TCP, UDP. Non è usato come meccanismo primario a livello Data Link: lì il CRC offre protezione superiore e costo accettabile in hardware dedicato.
4. CRC — Cyclic Redundancy Check
Il CRC è la tecnica più robusta tra le tre ed è quella adottata in quasi tutti i protocolli di rete moderni: Ethernet usa CRC-32 (4 byte nel campo FCS), Wi-Fi usa CRC-32, HDLC e PPP usano CRC-16. La sua forza deriva dall'uso dell'aritmetica modulare e dalla teoria dei polinomi.
Il polinomio generatore
Ogni implementazione di CRC è definita da un polinomio generatore scelto in modo da massimizzare il rilevamento. Grado r → CRC di r bit. Esempio CRC-16-CCITT:
Algoritmo CRC — passo per passo lato mittente
Polinomio → bit
Converti il generatore in sequenza binaria (1 dove coefficiente ≠0).
Aggiungi r zeri
Aggiungi in coda al messaggio originale r zeri (r = grado polinomio).
Divisione modulo 2
Esegui divisione XOR del messaggio esteso per la sequenza generatore.
Accoda CRC
Il resto è il CRC. Accodalo al messaggio originale (senza zeri) e trasmetti.
Esempio numerico completo
Verifica lato ricevitore
Divide l'intero frame ricevuto (dati+CRC) per il polinomio generatore. Se resto è 0 → frame corretto, altrimenti errore.
Estrae CRC, ricalcola CRC sui soli dati e confronta: se CRC ricalcolato coincide con quello ricevuto → frame integro.
CRC-32 (Ethernet) rileva: tutti gli errori a singolo bit, tutti i doppi, tutti i dispari, tutti i burst ≤32 bit e la maggioranza dei burst più lunghi. Probabilità errore non rilevato ≈ 2⁻³² ≈ 1 su 4 miliardi.
5. Confronto tra le tre tecniche
| Tecnica | Overhead | Potere di rilevazione | Utilizzo tipico |
|---|---|---|---|
| Parità | 1 bit | Solo errori su numero dispari di bit | Bus SCSI/PCI, cache CPU |
| Checksum | 8 o 16 bit | Buono ma non garantito su tutti i pattern | Header IP, TCP, UDP |
| CRC | 16 o 32 bit | Elevatissimo — standard industriale | Ethernet, Wi-Fi, HDLC, PPP |
Dire che checksum e CRC sono identici. Il checksum fa somma + complemento, il CRC fa divisione XOR con polinomio. Overhead diverso, robustezza diversa, uso diverso. Ricorda: Data Link = CRC, Trasporto/Rete = checksum.
6. Verifica / Esercizio guidato
🔬 Attività in classe
Applica le tre tecniche e verifica cosa succede con errori singoli e doppi.
- Dato 1011001, calcola bit parità EVEN e ODD. Simula 1 errore e 2 errori: cosa rilevi?
- Frame 2 byte: 0x41 0x42. Calcola checksum 8 bit (somma mod256 + NOT). Verifica ricevitore.
- Con m=10011010 e g=1011 calcola il CRC (resto 3 bit) usando divisione XOR. Costruisci frame finale e verifica che diviso per g dia resto 0.
- Su https://crccalc.com verifica un CRC-16-CCITT di "Hello" e confronta con calcolo manuale troncato.
1011001 ha tre 1 → dispari. EVEN: serve aggiungere 1 per rendere pari → trasmesso 10110011 (tot 4 pari). Con 1 errore il conteggio diventa dispari → errore rilevato. Con 2 errori il conteggio torna pari → non rilevato, limite intrinseco.
7. Riepilogo e concetti chiave
📚 Prossimo passo — Correzione degli errori: VRC, LRC e Hamming
Ora che sai rilevare, imparerai a correggere: come due parità incrociate (VRC+LRC) localizzano l'errore e come Hamming aggiunge bit di controllo in posizioni potenza di 2 per correggere un bit singolo.
