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.
Esistono tre grandi famiglie di tecniche, ordinate per potenza crescente:
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.
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 di parità vale 1; altrimenti vale 0.
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 esattamente 2, 4, 6… bit, la parità rimane invariata e l’errore passa inosservato. Nonostante questo limite, la parità è ancora usata in hardware con alta velocità di operazione (bus SCSI, PCI, cache CPU) dove la semplicità vale più della perfezione.
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.
Algoritmo lato mittente
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 da questo valore atteso segnala un errore.
Il checksum è usato nei protocolli di livello superiore come IP (header checksum a 16 bit), TCP e UDP (checksum a 16 bit sull’intero segmento). Non viene usato come meccanismo primario a livello Data Link dove il CRC offre protezione superiore.
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 degli errori. Un polinomio di grado r produce un CRC di r bit. Ad esempio il CRC-16-CCITT è definito da:
Algoritmo del CRC — passo per passo
Esempio numerico completo
Verifica lato ricevitore
Il ricevitore ha due metodi equivalenti per verificare l’integrità:
Divide l’intero frame ricevuto (dati + CRC) per il polinomio generatore. Se il resto è 0, il frame è corretto. Se è diverso da 0, c’è un errore.
Estrae il CRC dal frame, ricalcola il CRC sui soli dati e confronta: se il CRC ricalcolato coincide con quello ricevuto, il frame è integro.
CRC-32 (usato in Ethernet) rileva: tutti gli errori a singolo bit, tutti gli errori a doppio bit, tutti gli errori su un numero dispari di bit, tutti i burst di errori di lunghezza ≤ 32 bit, e la grande maggioranza dei burst più lunghi. La probabilità di un errore non rilevato con CRC-32 è dell’ordine di 2⁻³² ≈ 1 su 4 miliardi.
Confronto tra le tre tecniche
- Le tecniche di rilevazione errori aggiungono bit ridondanti nel trailer calcolati in funzione dei dati. Il ricevitore ripete il calcolo e confronta: disaccordo → errore.
- Bit di parità (EVEN/ODD): 1 bit ridondante. Rileva solo errori su numero dispari di bit. Fallisce con errori su numero pari di bit. Usato in hardware per semplicità.
- Checksum: somma modulo 256/65536 + complemento bit a bit. Più robusto della parità. Usato in IP, TCP, UDP.
- CRC: divisione XOR del messaggio esteso (con r zeri aggiunti) per il polinomio generatore. Il resto è il CRC. Il ricevitore verifica che la divisione del frame ricevuto per il polinomio dia resto 0. Potere di rilevazione elevatissimo: standard in Ethernet (CRC-32), HDLC (CRC-16).
- Tutte e tre rilevano gli errori ma non li correggono — per la correzione servono tecniche diverse (VRC+LRC o Hamming, che vedremo nella lezione 4).