Vyšlo v týdeníku Computerworld č. 41/91 v roce 1991
Vytištěno z adresy: http://www.earchiv.cz/a91/a141c110.php3

Zabezpečení dat při přenosech

Při přenosech dat může docházet k chybám, a v jejich důsledku může příjemce přijmout jiné znaky, než jaké mu odesilatel původně vyslal. Jedním možným prostředkem pro následnou detekci vzniklých chyb je přidání paritního bitu ke každému přenášenému znaku (jak jsme si naznačili minulý týden) - to je však jen nejjednodušší (a také nejméně účinný) případ použití tzv. bezpečnostních kódů.

Základní myšlenka použití bezpečnostních kódů je velmi jednoduchá - původní znaky se podle přesně definovaných pravidel transformují na znaky jiného typu (např. osmibitové znaky se přidáním jednoho paritního bitu převedou na devítibitové). Teprve ty se pak skutečně přenesou a příjemce si je převede zpět do jejich původního tvaru. Některé znaky onoho "jiného typu" však nemohou z původních znaků řádným způsobem nikdy vzniknout (např. při používání liché parity bychom neměli nikdy získat znak se sudou paritou). Pokud pak příjemce přijme takový znak, který při daných pravidlech transformace nemá žádný "vzor", může jej oprávněně považovat za chybně přenesený znak.

Bezpečnostní kódy jsou v zásadě dvojího typu, a to:

  • detekční kódy - error-detection codes, které umožňují pouze rozpoznat (detekovat), že přijatý znak je chybný, a
  • samoopravné kódy - self-correcting codes, které kromě detekce chyby umožňují i opravu chybně přeneseného znaku, takže jej není nutné přenášet znovu (což u detekčního kódu obecně nutné je).

Použití bezpečnostních kódů vždy znamená, že se v rámci každého znaku ve skutečnosti přenáší více bitů, než kolik by bylo k vyjádření vlastního znaku nezbytně nutné. Zabezpečení proti chybám není navíc nikdy stoprocentní, jeho účinnost však roste s počtem bitů "navíc". Nejjednodušší detekční kód (zabezpečení sudou nebo lichou paritou) přidává k datovým bitům jeden další bit a dokáže detekovat chybu v jednom bitu. Samoopravný kód, který umožňuje následnou opravu chyby v jediném bitu (tzv. rozšířený Hammingův kód), přidává ke každému 8-bitovému bytu navíc pět bitů (resp. 6 bitů ke každému 16-bitovému slovu).

V praxi je výhodnější nezabezpečovat proti chybám jednotlivé znaky, ale celé posloupnosti znaků resp. celé přenášené bloky dat. Dodatečné bity, používané k detekci chyb, se pak nepřidávají znovu ke každému znaku, ale jen jednou k celému bloku dat (a přenesou se spolu s ním). Je-li pak chyba detekována, nelze ji v rámci bloku lokalizovat až na jednotlivé znaky. Místo toho musí být celý blok prohlášen za chybný a přenesen znovu. To ovšem nemusí být vůbec na závadu - stačí si uvědomit, že přenosy dat téměř vždy probíhají po celých blocích, a nejmenší jednotkou dat, jejíž opakované vyslání si může příjemce vyžádat, je právě celý blok a nikoli jednotlivé znaky.

Podélná parita - longitudinal parity

Obrázek 3.1.
Obr. 3.1.: Zabezpečení paritou
je jedním možným způsobem zabezpečení celého bloku dat, chápaného jako posloupnost jednotlivých znaků. Zde se nekontroluje sudý resp. lichý počet jedničkových bitů v jednotlivých znacích, ale sudý resp. lichý počet jedničkových bitů ve stejnolehlých bitových pozicích všech znaků v bloku (viz obr. 3.1). Je-li tedy blok dat tvořen např. osmibitovými znaky, přidá se k celému bloku osm paritních bitů (tedy vlastně jeden znak navíc), a každý z nich se nastaví tak, aby byla dodržena sudá resp. lichá parita.

Použití podélné parity se někdy kombinuje i se zabezpečením jednotlivých znaků pomocí sudé resp. liché parity, která se pak pro odlišení od podélné parity označuje jako příčná či znaková parita (transversal, lateral parity). Obě varianty ilustruje obrázek 3.1.

Kontrolní součet - checksum

Další možností zabezpečení celého bloku dat je součet jednotlivých znaků v bloku, které jsou pro tento účel chápány jako celá dvojková čísla bez znaménka. Kontrolní součet se typicky provádí jako součet modulo 28 nebo 216, tj. výsledkem je kontrolní součet o délce jednoho nebo dvou bytů.

Kontrolní součet i podélnou paritu lze vyhodnocovat průběžně při přijímání jednotlivých znaků bloku. V případě kontrolního součtu se každý nově přijatý znak přičítá ke stávajícímu mezisoučtu, zatímco v případě podélné parity se provádí operace EX-OR (tj. nonekvivalence) jednotlivých bitů nového znaku se stávajícím mezivýsledkem.

Nejúčinnější formu zabezpečení bloku dat však představuje použití tzv. cyklických kódů - CRC (Cyclic Redundancy Check). Také zde se podobně jako u výpočtu podélné parity či kontrolního součtu průběžně na základě jednotlivých znaků bloku (přesněji jednotlivých bitů těchto znalů) průběžně vypočítává zabezpečovací údaj. Ten se na konci celého bloku porovná se zabezpečovacím údajem, který podle stejných pravidel vypočítal odesilatel a připojil k odesílanému bloku dat. Pokud se oba údaje shodují, lze přenesený blok s vysokou pravděpodobností považovat za správný - zabezpečení pomocí šestnáctibitového cyklického kódu totiž dokáže spolehlivě odhalit všechny chyby až v šestnácti po sobě jdoucích bitech, a chyby ve větším počtu bitů s přesností 99,9984 %.

Formální důkaz vynikající účinnosti zabezpečení pomocí cyklického kódu sice vyžaduje dosti pokročilý matematický aparát, vlastní způsob výpočtu zabezpečovacího údaje je však až neuvěřitelně jednoduchý (bohužel však zde již nemáme potřebný prostor k tomu, abychom tuto jednoduchost mohli patřičně "vychutnat"). Stačí k němu jednoduchý posuvný registr, umožňující provést operaci EX-OR (tj. nonekvivalenci jednotlivých bitů) s pevně danou maskou. Hodnota této masky je jednoznačně určena tzv. generujícím polynomem (generating polynomial), na kterém musí být příjemce i odesilatel předem dohodnuti. Použitelných tvarů těchto polynomů je více; v oblasti komunikací se nejčastěji používá polynom x16 + x12 + x5 + 1, doporučený organizací CCITT.