Vyšlo v týdeníku Computerworld č. 19/92 v roce 1992
Vytištěno z adresy: http://www.earchiv.cz/a92/a219c110.php3

Linková vrstva - II.

Správné rozpoznání začátku a konce každého rámce i jeho jednotlivých částí není zdaleka jediným úkolem, který řeší linková vrstva referenčního ISO/OSI modelu.

Služby, které linková vrstva poskytuje vrstvě síťové, mohou mít charakter spolehlivých i nespolehlivých služeb (viz 27. díl našeho seriálu). Pro realizaci spolehlivých služeb pak linková vrstva musí mít k dispozici mechanismy pro zajištění toho, že příjemce skutečně přijme všechny vyslané rámce, a to bez chyb (v případě spojované služby ještě ve správném pořadí).

Možné způsoby, jak tento požadavek zajistit, závisí na charakteru spojení mezi vysílajícím a příjemcem. Záleží na tom, zda toto spojení je svou povahou simplexní (simplex), tj. umožňující pouze jednosměrný přenos od vysílajícího k příjemci, nebo tzv. poloduplexní (half-duplex), umožňující sice obousměrný přenos, ale nikoli současně, nebo plně duplexní (full duplex), umožňující současný přenos oběma směry.

Simplexní spoje neumožňují vytvořit zpětnou vazbu mezi vysílajícím a příjemcem. Příjemce pak nemá možnost vyžádat si nové vyslání těch rámců, které přijal jako poškozené, a se všemi případnými chybami se musí vyrovnat sám. Vysílající mu v tom může pomoci tím, že použije vhodný samoopravný kód (viz 3. díl našeho seriálu), díky kterému pak příjemce dokáže některé chyby v přenesených datech opravit sám. Tyto kódy jsou však spojeny se značnou redundancí, kvůli které výrazně klesá efektivní přenosová rychlost "užitečných" dat. Stejná situace nastává také u takových spojů, které sice nejsou simplexní, ale pracují s tak dlouhými dobami přenosu, že se na úrovni linkové vrstvy nevyplatí čekat na zpětnou vazbu od příjemce dat (příkladem mohou být družicové spoje, viz 18. díl našeho seriálu).

V případě poloduplexních a plně duplexních spojů je možné vystačit již jen se zabezpečením přenášených dat pomocí detekčních kódů (viz 3. díl seriálu). Z nich jsou nejúčinnější tzv. cyklické kódy (viz opět 3. díl našeho seriálu), které lze použít k zabezpečení rámce jako celku. Při odesílání se k obsahu rámce přidá krátký zabezpečovací údaj (typicky v rozsahu 16 bitů), a příjemce je pak na základě tohoto zabezpečovacího údaje schopen se značnou pravděpodobností rozpoznat, zda přijal rámec bez chyby, či nikoli. V druhém případě pak může využít zpětné vazby, kterou mu nabízí poloduplexní a duplexní spojení s vysílajícím, a vyžádat si na něm nové vyslání celého chybně přijatého rámce.

Právě naznačený mechanismus je obvykle implementován v podobě tzv. potvrzování (acknowledgement), přesněji: potvrzovací zpětné vazby, která předpokládá, že příjemce zkontroluje bezchybovost každého přijatého rámce, a o výsledku informuje vysílajícího. V angličtině je pak tato technika označována také jako ARQ (Automatic Retransmission reQuest).

Obrázek 30.1.
Obr. 30.1.: Jednotlivé potvrzování
Možností realizace mechanismu potvrzování existuje celá řada. V prvním přiblížení je lze rozdělit na dvě velké skupiny, na tzv. jednotlivé potvrzování (idle RQ, stop&wait RQ), a kontinuální potvrzování (continuous RQ). V případě jednotlivého potvrzování vysílající odešle rámec, a pak čeká na reakci příjemce. Další rámec pak vyšle teprve poté, kdy mu příjemce signalizuje úspěšné přijetí původního rámce. V opačném případě (kdy je mu signalizováno neúspěšné přijetí, nebo nedostane-li do určitého časového limitu žádnou odpověď), vyšle původní rámec znovu. Konkrétní implementovaný mechanismus pak může vycházet z toho, že příjemce potvrzuje pouze bezchybně přijaté rámce (zatímco přijetí chybných rámců nesignalizuje vůbec a tyto rámce jednoduše ignoruje), nebo naopak z toho, že příjemce vysílá jen záporná potvrzení (negative acknowledgements), resp. odmítnutí (rejections), která signalizují přijetí rámce s chybami a explicitně žádají o jeho opětovné vyslání. Nejefektivnější je ovšem taková varianta, při které příjemce explicitně signalizuje obě možné situace - pomocí kladného i záporného potvrzení, viz obr. 30.1.

Obrázek 30.2.
Obr. 30.2.: Kontinuální potvrzování se selektivním opakováním
Obecnou nevýhodou všech variant jednotlivého potvrzování je nutnost čekat před odesláním dalšího rámce na reakci protistrany. V případě delších dob přenosu tak mohou vznikat neúnosně velké časové ztráty, které minimalizuje až potvrzování kontinuální. To je založené na myšlence, že vysílající bude vysílat nové rámce bez toho, že by si byl jist úspěšným přijetím předchozích rámců. Po odeslání určitého rámce tudíž vysílající nečeká na zprávu o úspěšném či neúspěšném přijetí rámce, ale může ihned pokračovat vysláním dalšího rámce. Kladná resp. záporná potvrzení jednotlivých rámců pak dostává s určitým zpožděním, a reaguje na ně samozřejmě až v okamžiku, kdy je skutečně dostane. Zde je opět několik možných variant: vysílající může znovu vyslat jen ten rámec, o kterém se dozvěděl, že nebyl úspěšně přenesen (pak jde o tzv. selektivní opakování, selective repeat, viz obr. 30.2.), nebo znovu vyslat chybně přenesený rámec, a po něm znovu i všechny následující rámce, které již mezitím mohly být také odvysílány (pak jde o tzv. opakování s návratem, v angličtině o tzv. Go-back-N techniku, viz obr. 30.3.).

Obrázek 30.3.
Obr. 30.3. Kontinuální potvrzování s návratem
Opakování s návratem je obecně méně efektivní než selektivní opakování, neboť může způsobit opakované vyslání rámců, které již byly přijaty bezchybně. Selektivní opakování zase vyžaduje ke své implementaci poměrně velkou kapacitu vyrovnávacích pamětí, a to jak na straně příjemce, tak i na straně vysílajícího.

Při našich úvahách o mechanismech potvrzování je dobré se zamyslet také nad tím, jakou konkrétní podobu mají kladná i záporná potvrzení, která příjemce datových rámců vrací jejich odesilateli. Mohou to být samostatné rámce zvláštního typu, které nenesou žádná "užitečná" data, ale mají pouze řídící charakter. Pak jde o tzv. samostatné potvrzování, které ovšem svými řídícími rámci zatěžuje přenosové cesty na úkor datových rámců s "užitečnými" daty. Efektivnější alternativou, použitelnou však jen v případě obousměrného toku "užitečných" dat, je vkládat potvrzující informace přímo do datových rámců - této technice se v angličtině říká piggybacking.

Dalším, velmi významným úkolem linkové vrstvy ISO/OSI modelu je zajistit, aby vysílající svými daty nezahltil příjemce. Linková vrstva se tedy musí zabývat také tzv. řízením toku (flow control), které má zajistit, aby vysílající skutečně vysílal jen tehdy, kdy je přijímající vůbec schopen nějaká data přijímat - a ne např. tehdy, když příjemce nemá k dispozici dostatečně velký objem vyrovnávací paměti pro uložení přijímaných dat, nebo je zaneprázdněn jinou činností (obsluhou naléhavého přerušení, zpracováním dříve přijatých dat apod.).

Obrázek 30.4.
Obr. 30.4. Představa metody okénka (sliding window)
Určujícími jsou přitom možnosti příjemce - ten musí mít možnost dočasně pozastavit vysílaní dat, a později je zase obnovit. Na úrovni linkové vrstvy je nejjednodušší dočasně pozastavovat vysílání celých rámců. V případě jednotlivého potvrzování (viz výše) k tomu příjemci stačí nepotvrdit posledně přijatý rámec (nebo na něj reagovat záporným potvrzením). V případě kontinuálního potvrzování není situace o nic složitější - vysílající zde totiž vysílá "dopředu" (tj. bez potvrzení) vždy jen určitý maximální počet rámců. V souladu s obrázkem 30.4. tak vzniká "okénko" již vyslaných ale dosud nepotvrzených rámců, které prostřednictvím svých potvrzení posouvá právě příjemce rámců. Díky tomu má i tomto případě možnost podle svých potřeb dočasně pozastavit vysílání (tj. posun okénka) a později jej zase obnovit.

Kvůli charakteristické představě zmíněného "okénka" se metoda kontinuálního potvrzování často označuje také jako metoda okénka (sliding window method).