SIM-03 CRC: Cyclic Redundancy Check
Simula il calcolo CRC più usato nelle reti Ethernet, USB e ZIP: divisione modulo-2 (XOR), polinomio generatore, resto e messaggio trasmesso.
- Capire cos'è il CRC e perché è più robusto di parità e checksum.
- Applicare la divisione polinomiale modulo-2 (sottrazione = XOR).
- Calcolare il resto = CRC dati polinomio generatore G(x).
- Costruire il frame trasmesso: dati originali + CRC.
- Riconoscere quali errori il CRC rileva e quando fallisce.
1. Che cos'è il CRC – Cyclic Redundancy Check
Il CRC è l'algoritmo di rilevazione errori standard nelle telecomunicazioni. Non corregge, ma rileva con probabilità altissima burst error, errori singoli, doppi e dispari.
CRC = resto della divisione modulo-2 del messaggio M(x)·xⁿ per il polinomio generatore G(x). Grado di G = n → CRC di n bit. Trasmissione = M(x)·xⁿ + CRC(x) divisibile per G(x).
A differenza della parità (1 bit) e del checksum (somma), il CRC tratta il flusso di bit come un polinomio binario su campo GF(2).
2. Come funziona – Divisione polinomiale XOR
- Scegli
G(x)di grador→ CRC sarà dirbit. G deve iniziare e finire con 1. - Aggiungi
rzeri al messaggio:M·2ʳ. - Dividi con XOR: scorri bit, se bit corrente =1 fai XOR con G allineato.
- Il resto di
rbit è il CRC. - Messaggio finale =
M + CRCesattamente divisibile per G.
Padding
M = 110100111, G=1101 (r=3) → dividendo 110100111000
XOR iterativo
Per ogni 1 più a sinistra, XOR con G. No prestiti, solo XOR.
Resto
Ultimi r bit non divisibili → CRC. Se 000 = nessuna modifica.
| Caratteristica | Parità | Checksum | CRC |
|---|---|---|---|
| Overhead | 1 bit | 8 bit | r bit (tipico 8/16/32) |
| Singolo bit errato | ✅ | ✅ | ✅ |
| Doppio bit errato | ❌ | ⚠️ forse | ✅ con G adeguato |
| Burst error < r | ❌ | ❌ | ✅ 100% |
| Standard | UART | TCP header | Ethernet, ZIP, PNG, USB |
I CRC più usati: CRC-8 (ATM), CRC-16-CCITT (Bluetooth), CRC-32 (Ethernet/ZIP/PNG). Il polinomio non si sceglie a caso: 100000100110000010001110110110111 è CRC-32 IEEE.
3. Simulatore interattivo CRC
Modifica messaggio e polinomio. Il simulatore mostra divisione passo-passo, resto, frame trasmesso e verifica immediata.
4. Esempio pratico passo-passo
Input: M=110100111, G=1101 (x³+x²+1), r=3
Padding: 110100111000
1101 → XOR → 0001 00111000
Scorri fino a 1 → XOR iterativo
Iterando → resto
001Trasmette:
110100111 + 001 = 110100111001Verifica ricevitore: 110100111001 ÷ 1101 → resto 000 → OK
Se il resto fosse diverso da zero → frame scartato, richiesta ritrasmissione.
5. Errori rilevabili, errori comuni e limiti
Burst < r
Tutti gli errori a raffica più corti del grado di G rilevati al 100%.
Errori dispari
Se G ha numero pari di 1, tutti gli errori dispari vengono rilevati.
Burst ≥ r
Rileva con probabilità 1-2⁻ʳ. Con CRC-32: 99.99999998%.
- Polinomio non validato: G deve iniziare con 1.
- Confondere somma con XOR: in GF(2) non esiste riporto, 1+1=0.
- Dimenticare padding: devi aggiungere r zeri prima di dividere.
- CRC calcolato solo su payload: va calcolato su header + payload.
- Pensare che corregga: CRC solo rileva.
Simula un errore: trasmetti 110100111001, poi flippa un bit a caso (es: 110100101001) e rilancia Verifica ricezione. Il resto ≠ 0 → errore rilevato. Prova con 2 bit → spesso rilevato, con polinomio debole a volte no.
6. Verifica comprensione + Riepilogo
1. Con G=1011 (r=3), M=1100 → qual è il dividendo padded?
Risposta: 1100 + 000 = 1100000
2. Se G=1101, burst error di 2 bit è sempre rilevato?
Sì, qualsiasi burst <3 è garantito.
3. Perché Ethernet usa CRC-32 e non parità?
Burst error sui cavi lunghi; CRC-32 ha probabilità mancato rilevamento = 2⁻³².
✅ Riepilogo SIM-03
CRC = resto divisione modulo-2 per G(x). Formula: T(x)=M(x)·xʳ + CRC(x) divisibile per G(x). Più costoso di parità/checksum, ma rileva praticamente tutti gli errori reali. Usato ovunque nell'informatica moderna.