Hoe wordt de checksum berekend?

Pagina: 1
Acties:
  • 505 views sinds 30-01-2008
  • Reageer

  • Boudi
  • Registratie: Oktober 2000
  • Laatst online: 09-08 02:32

Boudi

Always Coca Cola

Topicstarter
Hi all,

ff vraagje: een tcp/udp-pakketje heeft in zn header een checksum om te checken of er geen biterrors optreden tijdens het verzenden. Maar wat is nou dé manier om zo'n checksum te berekenen? Het leek me zelf wel handig om de data in stukken te hakken, deze stukken bij elkaar op te tellen en dat moet dan de checksum zijn... maar hoe groot is zo'n deel? Of is er een bepaalde manier die het beste werkt??

Met of zonder mayonaise?


  • B3U5
  • Registratie: December 2001
  • Laatst online: 09-08 19:30
een manier ie om van een aantal bits zeg 7 het aantal eenen te tellen en de 8e bit maakt vervolgens dat aantal even.

dat kun je ook met woorden doen (8bits)
11110000
11110000
11000011
--------
11000011

maar dan met wat meer regels enzo.

kan vast ook nog wel anders...

  • mvdejong
  • Registratie: Juni 2000
  • Laatst online: 29-11-2024

mvdejong

When does the hurting stop ?

Er is niet een enkele manier.
De methode van Beus is een pariteits-bit. Daarmee kun je uit 8 bits detecteren of er 1 (of 3, 5 of 7) "omgevallen" zijn, terwijl 2, 4 of 6 missers niet worden gezien.
Bij geheugen zie je al ECC-geheugen, dan worden 3 bits gebruikt, dan is te detecteren of er 1 of 2 bits zijn omgevallen, en in het geval van 1 is het zelfs bekend welke, en dan te herstellen.

Een checksum over langere stukken (zoals een netwerk-pakketje) wordt gedaan door met bepaalde formules de opeenvolgende bytes in een checksum te verwerken, met optellingen, vermenigvuldigen en machtsverheffen. Meestal gebeurt dit met een CRC-formule (cyclic redundancy check), maar er zijn vele soorten algoritmen voor. Het voordeel hiervan is ook dat het eindresultaat bijv. ook maar op niet meer dan 1,2 of 4 bytes uitkomt (dat houdt dat natuurlijk wel weer verlies van informatie in).

De simpele optelling zoals jij voorstelt is mogelijk, en wordt ook wel gebruikt, maar komt er zelfs niet achter als twee opeenvolgende bytes worden verwisseld. Ook is het nadeel dat het resultaat bij langere berichten nogal groot wordt (daar zou je dan een modulo-operatie op kunnen loslaten).

The number of things that Arthur couldn't believe he was seeing was fairly large


  • Predator
  • Registratie: Januari 2001
  • Laatst online: 16:57

Predator

Suffers from split brain

Op dinsdag 26 maart 2002 14:42 schreef mvdejong het volgende:
Er is niet een enkele manier.
De methode van Beus is een pariteits-bit. Daarmee kun je uit 8 bits detecteren of er 1 (of 3, 5 of 7) "omgevallen" zijn, terwijl 2, 4 of 6 missers niet worden gezien.
Bij geheugen zie je al ECC-geheugen, dan worden 3 bits gebruikt, dan is te detecteren of er 1 of 2 bits zijn omgevallen, en in het geval van 1 is het zelfs bekend welke, en dan te herstellen.

Een checksum over langere stukken (zoals een netwerk-pakketje) wordt gedaan door met bepaalde formules de opeenvolgende bytes in een checksum te verwerken, met optellingen, vermenigvuldigen en machtsverheffen. Meestal gebeurt dit met een CRC-formule (cyclic redundancy check), maar er zijn vele soorten algoritmen voor. Het voordeel hiervan is ook dat het eindresultaat bijv. ook maar op niet meer dan 1,2 of 4 bytes uitkomt (dat houdt dat natuurlijk wel weer verlies van informatie in).

De simpele optelling zoals jij voorstelt is mogelijk, en wordt ook wel gebruikt, maar komt er zelfs niet achter als twee opeenvolgende bytes worden verwisseld. Ook is het nadeel dat het resultaat bij langere berichten nogal groot wordt (daar zou je dan een modulo-operatie op kunnen loslaten).
Ik ga hier gewoon nog even aan toevoegen dat de manier om een CRC-16 of CRC-32 checksum te bereken gewoon gedaan wordt met schuifregisters en XOR units of door deze bewerkingen in software die dan de overkomste hardware van de CPU daarvoor inschakelen.
Vermenigvuldingen en delingen (behalve door 2) worden niet gebruikt omdat die trager zijn.
*2 en /2 gaat enorm snel omdat dat gewoon een shift operatie is.

Er is naast gewone pariteit ook nog hamming code (wat ook een soort pariteitcheck is) maar die meer bitcorrectie biedt.
Maar zoals gezegd door mvdejong checksums van grote hoeveelheden data meestal CRC-32 of bv MD5.

Everybody lies | BFD rocks ! | PC-specs


Verwijderd

Wordt hiervoor ook de Hammingcode niet gehanteerd? Dacht dat dat bij ECC het geval was maar ben't niet zeker...
Op dinsdag 26 maart 2002 13:22 schreef Beus het volgende:
een manier ie om van een aantal bits zeg 7 het aantal eenen te tellen en de 8e bit maakt vervolgens dat aantal even.

dat kun je ook met woorden doen (8bits)
11110000
11110000
11000011
--------
11000011

maar dan met wat meer regels enzo.

kan vast ook nog wel anders...
Op deze manier kan je enkel weten dat er een fout is in de eerste kolom, maar je weet niet welke regel, door hetzelfde ook verticaal toe te passen kan je de fout opsporen + corrigeren... Het zou me wel verwonderen als men dit zou gebruiken voor tcp/udp pakketten aangezien deze methode niet echt spaarzaam is op de bits (dit in tegenstelling tot Hamming)