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

Acknowledgement

O tom, že při nejrůznějších přenosech dat může docházet k chybám, jsme si v tomto slovníkovém seriálu povídali již několikrát - stejně jako o tom, jak vlastně výskyt chyby rozpoznat, a zda vůbec má smysl usilovat o nápravu (viz minulé vydání, na téma „Spolehlivý a nespolehlivý přenos"). Předpokládejme nyní, že nám jde o nápravu vzniklých chyb (neboli o zajištění spolehlivého přenosu), a zamysleme se nad tím, jak to konkrétně udělat.

Začněme tím, jaké možnosti vůbec připadají v úvahu. Jsou v zásadě dvě: je možné použít tzv. samoopravné kódy, nebo je možné vyvolat opakování přenosu již jednou vyslaných dat, a doufat že při opakování již k chybě nedojde.

Takzvané samoopravné kódy (též: korekční kódy) jsou založeny na jednoduché myšlence: k odesílaným datům se připojí takové informace, které při výskytu chyby dovolí příjemci zprávně zrekonstruovat původní obsah (původní data) - bez toho, že by bylo nutné cokoli vysílat znovu. Má to ale jeden háček: každý samoopravný kód se dokáže „vyrovnat" jen s chybami určitého typu (či spíše rozsahu), zatímco s jinými chybami (s chybami většího rozsahu) se vyrovnat nedokáže. Navíc zde platí vcelku zřejmá závislost: čím větší chyby dokáže samoopravný kód „vyrovnat", tím větší je objem dat, které je nutné „přibalit" k původním datům pro potřeby jejich případné rekonstrukce. Objem těchto „přibalených" dat ale v praxi vychází neúnosně velký, a proto se samoopravné kódy jako takové používají jen velmi vzácně (hlavně tam, kde neexistuje možnost zpětné vazby mezi příjemcem a odesilatelem).

Obvyklý způsob nápravy chyb je tedy založen spíše na existenci zpětné vazby a na tom, že příjemce si vynutí opakované vyslání těch dat, které se při dřívějším přenosu poškodily. Postup je obvykle takový, že odesilatel vysílá data po blocích určité velikosti, a příjemce vrací odesilateli informaci o tom, zda konkrétní blok došel v pořádku či nikoli. Obecně se tomu říká potvrzování (anglicky acknowledgement), protože činnost příjemce skutečně má charakter určitého „potvrzování".

Konkrétní techniky potvrzování se ale mohou v mnoha aspektech významně lišit. Má například příjemce potvrzovat každý jednotlivý blok přenesených dat? Má odesilateli explicitně signalizovat, že přijal nepoškozený blok - tedy odesílat tzv. kladná potvrzení (positive acknowledgement)? Nebo má odesilatele explicitně upozornit pouze v případě, kdy přijal nějaká poškozená data - tedy posílat tzv. záporná potvrzení (negative acknowledgement)? Nebo má příjemce explicitně signalizovat obě skutečnosti, a tedy vysílat kladná i záporná potvrzení? A jak se má chovat odesilatel? Má vždy čekat na potvrzení naposledy odeslaného bloku, ať již kladné či záporné, a teprve pak pokračovat dalším vysíláním? Nebo může vysílat nějaké bloky dat „do foroty"? Odpověď není jednoduchá, a musí vzít do úvahy i skutečnost, že poškodit (či úplně ztratit) se samozřejmě může i samotné potvrzení.

Z důvodů efektivnosti se nejčastěji používá kladné i záporné potvrzování současně - kdyby se totiž používalo buď jen jedno, nebo pouze druhé, musel by odesilatel čekat, zda do předem stanoveného limitu dostane očekávané potvrzení či nikoli (a pokud ne, měl by teprve po vypršení tohoto limitu právo předpokládat, že došlo k opačné situaci než jakou by signalizovalo přijetí explicitního potvrzení).

V praxi používané metody a techniky potvrzování se většinou liší spíše v tom, zda se odesilatel chová „hodně ustrašeně", nebo naopak „velkoryse". První varianta předpokládá, že odesilatel si po odeslání každého bloku dat nejprve počká na jeho explicitní potvrzení (nebo na vypršení časového limitu, do kterého by měl potvrzení dostat), a teprve pak podnikne další akci - podle přijatého potvrzení buď odešle další blok, nebo opakuje přenos již jednou odeslaného bloku. Ne nadarmo se této variantě říká jednotlivé potvrzování (v angličtině ještě výstižněji: stop-and-wait acknowledgement). Je ovšem vhodná jen pro takové sítě, ve kterých je doba přenosu zanedbatelná - tedy například pro lokální sítě.

V rozlehlých sítích, kde doby přenosu jednotlivých datových bloků i doby přenosů explicitních potvrzení rozhodně nejsou zanedbatelné, by technika jednotlivého potvrzování zbytečně zpomalovala celkový přenos dat. Zde je naopak výhodnější, když se odesilatel chová poněkud důvěřivěji, a je ochoten odeslat i více bloků dat „do foroty", bez toho že by měl explicitně potvrzené jejich úspěšné přijetí. Zde odesilatel počítá naopak s tím, že zatímco on bude průběžně vysílat jednotlivé bloky dat, bude mu druhá strana (příjemce) průběžně posílat svá potvrzení. Proto se také tomuto způsobu potvrzování říká spojité potvrzování (též: průběžné či kontinuální potvrzování, angl.: continuous acknowledgement). O případném výskytu chyby a nutnosti opakovat vyslání některého bloku se při spojitém potvrzování odesilatel sice dozví až s určitým časovým odstupem (a mezitím mohl již odvysílat několik dalších bloků), ale i tato situace je docela dobře řešitelná. Ale o tom zase až někdy příště.