Sume de control (checksum)
Adesea, atunci când transmitem date peste un link, este necesar ca receptorul să determine dacă cadrul primit a fost corupt. Pentru a face acest lucru, transmițătorul va include un nou câmp (numit checksum) în protocol, care este rezultatul aplicării unei funcții pe conținutului cadrului. Receptorul poate recalcula această valoare cu datele din cadrul pe care acesta le-a primit și detecta cadrele corupte în cazul în care aceste două valori diferă.
Un exemplu simplu de funcție de checksum este suma tuturor octeților din cadru mod 256. Mai jos găsiți o astfel de implementare.
uint8_t compute_checksum(const char *buff, size_t count)
{
/* Ca input primim un buffer char *buff de dimensiune int count */
uint32_t sum = 0;
uint8_t checksum
/* Adăugăm în sum fiecare byte din buffer */
while (count > 0) {
sum += *((uint8_t *) buff)
buf += 1;
count -= 1;
}
checksum = sum % 256;
return checksum;
}
Ce facem dacă am detectat o eroare? De cele mai multe ori, la detecția unei erori se va face o retransmisie de către protocolul de nivel superior (e.g. TCP la nivel transport).
O problemă a algoritmilor de checksum este simplitatea acestora ce poate cauza coliziuni.
Cadru : 6 23 4
Cadru cu checksum : 6 23 4 33 (6 + 23 + 4 = 33 % mod 256 = 33)
Cadru la receptor : 8 20 5 33 (8 + 20 + 5 = 33 % mod 256 = 33)
În acest exemplu, chiar dacă conținutul mesajului s-a schimbat, checksum-ul calculat a fost același, existând o șansă de 1/256 (256 - de la operatorul de modulo) ca o eroare să nu fie detectată. Pentru a rezolva această problemă, s-a ales folosirea unor algoritmi precum Cyclic Redundancy Codes (CRC).
Note
Termenul de checksum a fost folosit inițial pentru a descrie algoritmi de tipul sume, dar în ziua de azi curpinde și algoritmi mai sofisticați precum CRC.