Vyšlo v týdeníku CHIPweek č. 23/95, 4. října 1995
Vytištěno z adresy: http://www.earchiv.cz/a95/a523k130.php3

Detekce chyb

Chyby se vyskytují všude - chybují nejen lidé, ale i nejrůznější přenosové mechanismy, prostředky i celé technologie. Někdy, za určité situace, nemusí při přenosu dat chyby vadit. Například když z nějakého důvodu je nejvyšší prioritou rychlost, a případné napravování chyb by pouze zdržovalo. Příkladem může být přenos živého obrazu, při kterém velmi záleží na rychlosti a pravidelnosti přísunu dat, zatímco drobné chyby v jednotlivých snímcích lidské oko nemusí ani zaregistrovat.

Při většině datových přenosů ovšem bývají případné chyby na závadu, a je třeba na ně nějak reagovat. Jak, to již závisí na konkrétní strategii a celkovém přístupu komunikujících stran (a tato problematika by si jistě zasloužila samostatný díl tohoto seriálu). Dnes se ale reakcemi na případné chyby nebudeme ještě zabývat - dnes nám půjde o něco základnějšího: jak vůbec poznat, že nějaká data došla poškozena?. Není jistě těžké nahlédnout, že má-li některá z komunikujících stran reagovat na chybu při přenosu, musí ji umět rozpoznat (tzv. detekovat). Dnes tedy půjde o metody detekce, konkrétně o tu z nich, která je dnes zdaleka nejpoužívanější: o použití tzv. cyklických kódů (Cyclic Redundacy Check), známějších spíše pod anglickou zkratkou CRC.

Princip, na kterém jsou založeny obecně všechny detekční kódy (tedy kódy, umožňující rozpoznat chybu), je velmi jednoduchý: k přenášeným datům se připojí určitá doplňující informace „zabezpečovacího" charakteru, a ta je přenesena k příjemci společně s"užitečnými" daty. Příjemce přitom musí být s odesilatelem domluven na použité technice zabezpečení, a musí tedy znát přesný význam onoho zabezpečovacího údaje, který přijme společně s vlastními daty. Příjemce pak aplikuje na vlastní data stejný algoritmus, podle kterého odesilatel stanovil doplňující zabezpečovací údaj, a svůj výsledek porovná s výsledkem druhé strany. Pokud se nerovnají, má příjemce téměř jistotu, že při přenosu došlo k chybě. Ovšem pokud se oba výsledky rovnají, nemá jistotu že k žádné chybě nedošlo - ví jen, že k chybě nedošlo s určitou pravděpodobností, jejíž hodnota je dána právě vlastnosti použitého způsobu zabezpečení.

Nejjednodušším příkladem zabezpečovacího mechanismu může být tzv. parita - například v takové variantě, při které je ke každému přenášenému bytu přidán ještě jeden paritní bit, doplňující původní počet jedniček v daném bytu na lichý počet (v případě tzv. liché parity, analogicky při tzv. sudé paritě). Lze ovšem snadno nahlédnout, že takovéto zabezpečení není příliš účinné - stačí jej obelstít například již chyba ve dvou bitech daného bytu, obecně v sudém počtu bitů najednou. Navíc přidání paritního bitu ke každému přenášenému bytu zvýší celkový objem přenášených dat o jednu osminu, což rozhodně není zanedbatelné.

Poněkud inteligentnější je použití kontrolních součtů. Jednotlivé byty přenášených dat se při této metodě chápou jako čísla (obvykle celá čísla bez znaménka), a jako takové se sečtou. Z výsledného součtu se pak vezme vhodně velká část (například nejnižších 16 bitů), a ta se připojí k vlastním datům a odešle příjemci. ten pak obdobně „posčítá" přijatá data, svůj výsledke porovná s přijatým kontrolním součtem. Režie na přenos je výrazně nižší, ale i zde se může snadno stát, že i při poškození přenášených dat bude jejich výsledný kontrolní součet stejný (a příjemce tudíž chybu při přenosu nerozpozná). Spolehlivost kontrolních součtů je sice vyšší než u parity, ale stále není dostatečná.

Dostatečnou spolehlivost nabízí až výše avizované použití tzv. cyklických kódů - použijeme-li zabezpečovací údaj v nejčastěji používaném rozsahu 16 bitů, dokáže příjemce s jeho pomocí rozpoznat všechny shluky chybných bitů se stoprocentní jistotou, shluky délky 17 bitů s pravděpodobností 99,9968%, a ostatní chyby s pravděpodobností 99,9984%. Nezní to jako fantazie, nebo dokonce jako nemožnost?

Pokud nechcete mému tvrzení věřit a chcete si sami dokázat jeho pravdivost, budete k tomu potřebovat velmi silný matematický aparát, konkrétně aparát algebry, zabývající se okruhy polynomů nad tělesem dimenze 2. Za fungováním cyklických kódů totiž stojí opravdu pokročilá matematika. Pokud ale nejsou tyto partie zrovna vaším koníčkem, vůbec to nevadí - k praktickému používání detekčních mechanismů na bázi cyklických kódů žádný matematický aparát nepotřebujete. Potřebujete pouze velmi konkrétní a ryze praktický návod na to, jak z přenášených dat vyrobit onen zabezpečovací údaj, který pak k datům připojíte a odešlete směrem k příjemci. Ten pak zase potřebuje vědět, co má s přijatými daty a zabezpečovacím údajem udělat, aby si mohl odvodit zda jsou poškozená, nebo s hodně velkou pravděpodobností nepoškozená. V obou případech přitom stačí „prohnat" přenášená data přímo triviálním logickým obvodem, který na straně odesilatale vyrobí zabezpečovací údaj, a na straně příjemce řekne ano či ne.

Pokud by vás ale přeci jen zajímalo, na jakém principu zabezpečení cyklickými kódy pracuje, pak se pokusím o maximální možné zjednodušení: odesilatel si data určená k odeslání na chvíli představí jako jedno velké číslo (což není tak těžké, vždyť jde ve své podstatě jen o posloupnost nul a jedniček). Toto číslo pak vydělí jiným číslem, na kterém je s příjemcem domluven. Podíl, který mu vyjde, okamžitě zapomene, ale využije zbytek po dělení - ten připojí k vlastním datům jako zabezpečující údaj, a vše pak odešle. Příjemce pak opakuje stejný postup a dívá se, zda dostal stejný zbytek. Podstatnou roli zde přitom hraje číslo (dělitel), kterým se přenášená data dělí, a na kterém musí být obě strany domluveny - toto číslo samozřejmě nemůže být ledajaké. Jeho konkrétní hodnotu lze nalézt jen s využitím onoho silného matematického aparátu. Z konkrétní hodnoty tohoto čísla (ve skutečnosti polynomu, resp. tzv. vytvářející mnohočlenu, ale při našem maximálním zjednodušení pouhého čísla) pak přímo vyplývá funkce i struktura jednoduchého (či spíše přímo triviálního obvudu), který obě strany používají pro praktické generování zabezpečovacích údajů a kontrolu správnosti přenesených dat.