Vyšlo v týdeníku CHIPweek č. 18/97, 29. dubna 1997
Vytištěno z adresy: http://www.earchiv.cz/a97/a718k150.php3

Ethernet a kolize

V minulém dílu tohoto modulu jsme si začali popisovat přístupovou metody Ethernetu, která řídí přístup jednotlivých uzlů ke společně sdílenému přenosovému médiu. Dnes si tuto zajímavou problematiku dokončíme.

Přístupová metoda Ethernetu, kterou jsme si začali popisovat v minulém dílu, vychází z několika základních předpokladů: prvním z nich je existence takového přenosového média, které má sdílený charakter, a nemůže tudíž sloužit více uzlům současně - konkrétně v tom smyslu, aby po tomto médiu mohlo vysílat svoje data více uzlů najednou (zatímco vysílání jednoho uzlu, které má více příjemců současně, je možné a s oblibou využívané). Dalším předpokladem je skutečnost, že současné vysílání více uzlů je sice velmi nežádoucí, protože vede ke vzájemnému „znehodnocení" jednotlivých signálů a jimi reprezentovaných dat, ale na druhé straně nehrozí žádným mechanickým ani elektrickým poškozením přenosové cesty ani přijímacích a vysílacích obvodů. Přístupová metoda Ethernetu se proto nesnaží apriorně zcela vyloučit současné vysílání více uzlů, označované jako kolize. Samozřejmě se jim snaží předcházet, a to způsobem, který jsme si již popsali v předchozím dílu - tím, že každý uzel má povinnost nejprve poslouchat, zda právě nikdo nevysílá, a sám má právo začít vysílat pouze tehdy, pokud je „ticho". Dalším důležitým předpokladem přístupové metody Ethernetu je proto skutečnost, že jednotlivé uzly jsou vůbec schopny detekovat, zda právě někdo vysílá či nikoli.

Co si počít s kolizí?

Zdůrazněme si nyní znovu fakt, že přístupová metoda Ethernetu se sice snaží předcházet kolizím, ale na druhé straně se nesnaží zcela a úplně eliminovat možnost jejich vzniku. Bylo by to totiž relativně náročné a komplikované, zatímco Ethernet sází spíše na jednoduchost a na „statisticky dobré" chování při menších zátěžích. Proto v prevenci kolizí jde jen určitý kus cesty (a ne až „na doraz"), ale pak raději přeci jen připouští možnost vzniku kolizí a zaměřuje se na to, jak ex-post eliminovat jejich nepříznivé následky.

Kdy a za jaké situace tedy může ke kolizi dojít?

Nejčastějším případem zřejmě jsou situace, kdy v době právě probíhajícího vysílání několik uzlů pojme úmysl také něco odvysílat. Všechny tyto uzly však zjistí, že společně sdílené přenosové médium je právě obsazené, a tak čekají na jeho uvolnění. Jakmile se tak stane, zaregistrují to všichni víceméně ve stejný okamžik (plus-minus jejich reakční doba), a začnou vysílat všichni najednou, čímž způsobí kolizi.

Podívejme se nyní na celou situaci z pohledu jednoho zúčastněného uzlu (je jedno kterého): tento uzel rozpozná, že ke kolizi došlo, a z tohoto faktu si může odvodit, že vysílat začaly i některé další uzly. Důležité ovšem je, že daný uzel nepozná, kolik takovýchto uzlů bylo - zda jeden, dva, tři apod. Pozná pouze to, že vysílat začal alespoň jeden další uzel kromě něj. Kromě počtu ostatních uzlů v kolizi daný uzel samozřejmě nepozná ani to, které konkrétní uzly se spolu s ním do kolize dostaly.

Absence vzájemného povědomí o ostatních účastnících kolize brání deterministickému (řízenému) vyřešení této nepříjemné situace - jelikož jednotlivé uzly o sobě nevědí a vzhledem k povaze sdíleného přenosového média nemají možnost se vzájemně domluvit, nemůže být kolize řešena například vhodným „rozpočítáním", tak aby z ní vždy vzešel jeden konkrétní vítěz a ten měl právo pokračovat ve vysílání.

Obrázek 1.
Představa kolize dvou uzlů a její úspěšné vyřešení
Bez možnosti vzájemného dorozumění se jednotlivé uzly zúčastněné v kolizi musí spolehnout na náhodu - každý z nich si „hodí kostkou" a doufá že alespoň náhodný faktor dokáže vybrat z jejich středu jednoho vítěze, který bude moci uskutečnit svůj záměr vysílat (ve skutečnosti se každý uzel odmlčí na náhodně zvolenou dobu, a poté se snaží uplatnit svůj požadavek na vysílání znovu). Důležité ovšem je uvědomit si, že ani „hod kostkou" nemusí vést k zaručenému výsledku, protože více uzlům může „padnout" stejná hodnota - mohou se odmlčet na stejnou dobu, ev. se po svém „probuzení" znovu seřadit při čekání na konec právě probíhajícího vysílání a pak se znovu dostat do kolize.

Mechanismus, zvolený autory Ethernetu pro řešení již nastálých kolizí (tj. odmlčení se na náhodně zvolenou dobu) proto také nemusí vést ke kýženému výsledku, neboli neodkáže zcela eliminovat možnost následných (zavlečených) kolizí. Pouze snižuje jejich pravděpodobnost. K této snaze ostatně přispívá svým dílem i každý uzel, který se dostane do opakované kolize - aby snížil pravděpodobnost další kolize, zvětší si na dvojnásobek interval, ze kterého si náhodně volí dobu na kterou se odmlčí. Takto postupuje každý uzel celkem desetkrát, a po desátém neúspěšném pokusu to vzdá a ohlásí svým vyšším vrstvám neúspěch.

Omezená velikost kolizní domény

Mechanismus vzniku kolizí, který jsme si popsali v předchozím odstavci, je zřejmě v praxi nejčastější, ale není jediným možným způsobem resp. důvodem, kvůli kterému ke kolizím může docházet. Další možností, byť méně pravděpodobnou, je situace kdy dva uzly (ev. více uzlů) ve stejný okamžik pojmou úmysl začít vysílat, oba ve stejný okamžik otestují stav přenosového média, oba zjistí že je právě volné a oba začnou vysílat. V praxi přitom nemusí jít úplně o „jeden a tentýž okamžik", ale o malý časový interval, daný konečnou rychlostí šíření signálu po přenosovém médiu a reakční dobou jednotlivých uzlů.

S konečnou rychlostí šíření signálu a nenulovou reakční dobou konkrétních uzlů pak souvisí ještě některé další zajímavé technické aspekty kolem kolizí, které mají důležité praktické důsledky. Jde zejména o otázku správného rozpoznání kolize všemi zainteresovanými uzly, a o přesné chování každého jednotlivého uzlu v okamžiku, kdy zjistí že právě on se ocitnul ke kolizi.

V prvním přiblížení by se mohlo zdát nejrozumnější to, aby dotyčný uzel okamžitě přestal vysílat. Ve skutečnosti to ale udělat nesmí. Důvody souvisí právě s konečnou rychlostí šíření signálu o nenulovou reakční dobou - pokud by jeden z uzlů, zúčastněných v kolizi, přestal vysílat okamžitě poté, co on sám rozpoznal kolizi, mohlo by se stát, že ostatní uzly by tuto kolizi již nedokázaly korektně rozpoznat (lze si představit, že informace o výskytu kolize by se k nim nestačila včas dostat). Každý uzel, který zjistí že se dostal do kolize, se proto musí zachovat zcela opačně, než by mu radil zdravý rozum - musí ještě nějakou dobu vysílat, aby kolizi náležitě „utvrdil" (a umožnil tak ostatním korektně ji rozpoznat).

Doba, po kterou musí uzel kolizi „utvrzovat", je přitom pevně dána (ve standardech Ethernetu). Z její pevné velikosti, konečné rychlosti šíření signálu v přenosovém médiu a velikosti zpoždění na opakovačích pak vychází velmi důležité omezení na počet segmentů a mezi ně zapojených opakovačů, které je možné v Ethernetu použít. V příštích dílech se k této otázce vrátíme podrobněji, nyní si pouze zdůrazněme, že tato maximální velikost se týká pouze oblastí, do kterých musí být kolize šířeny - a které jsou proto označovány jako tzv. kolizní domény. Jsou to jednotlivé kabelové segmenty či skupiny kabelových segmentů, propojené na úrovni fyzické vrstvy, neboli prostřednictvím opakovačů. Ty totiž propouští kolize, zatímco aktivní síťové prvky pracující na vyšších úrovních (např. mosty, switche, směrovače) již kolize nepropouští. Kolizní domény tedy končí vždy u nejbližšího mostu, směrovače či switche.

Jiným zajímavým důsledkem právě popsaného chování uzlů (i celkového charakteru přístupové metody Ethernetu) je skutečnost, že ke kolizím může docházet jen na začátku vysílání jednotlivých Ethernetových rámců - pokud se totiž každý uzel chová disciplinovaně a dodržuje pravidla přístupové metody Ethernetu, neměl by „skočit do řeči" jinému uzlu v době, kdy tento vysílá. Může se tak stát pouze na začátku vysílání, díky tomu že jiný uzel otestoval stav přenosového média ještě v době, kdy nikdo nevysílal, a o něco později (díky své nenulové reakční době a díky konečné rychlosti šíření signálu) začal vysílat také. Jakmile toto pevně dané a předem známé „nebezpečné období" skončí, má právě vysílající uzel záruku, že už mu do jeho vysílání nikdo nevstoupí, neboli že bude moci dokončit své vysílání bez nebezpečí kolizí. Díky tomu stačí každému uzlu monitorovat případné kolize jen po určitou dobu na začátku jeho vysílání. I to přispívá k celkové jednoduchosti a pružnosti Ethernetu.