Korlátozás nélküli egyirányú (szimplex) protokoll
75. ábra: Korlátozás nélküli egyirányú protokoll blokkvázlata
Az első vizsgált protokoll a lehető legegyszerűbb: az adatátviteli sebesség, a feldolgozás nincs korlátozva: amilyen sebességgel küldi az ADÓ a kereteket, a VEVŐ ugyanilyen sebességgel képes ezt venni. Ez a gyakorlatban azt jelenti, hogy az ADÓ és a VEVŐ hálózati rétege mindig készen áll, a feldolgozási idő elhanyagolható, és a keretek esetleges tárolására szolgáló puffer kapacitás végtelen. Az adatkapcsolati rétegek közötti csatorna hibamentes, kerethiba, keretvesztés nem fordul elő. Az átvitel egyirányú.
Egyirányú “megáll és vár” protokoll
76. ábra: Egyirányú "megáll és vár" protokoll blokkvázlata
A valóságban nagyon sok esetben a VEVŐ nem képes olyan sebességgel feldolgozni a kereteket, azaz valahogy az ADÓ-t le kell lassítani olyan mértékben hogy a VEVŐ küldött kereteket mindig fel tudja dolgozni. Ez csak egy módon lehetséges: informálni kell az adót arról, hogy mikor küldheti a következő keretet, azaz a vétel és a feldolgozás tényét nyugtázni kell. Vagyis a protokoll megköveteli az ADÓ-tól, hogy egy keret elküldése után addig várjon, amíg a kis üres (nincs adat!!!) nyugtakeret meg nem érkezik. Ezt a protokollt szokták “megáll ás vár” (stop and wait) protokollnak nevezni.
Látható, hogy bár az adatforgalom szimplex, azért a keretek már különböző időpontokban két irányban áramlanak, ezért fél-duplex csatorna kialakítást igényel a fizikai réteg vonatkozásában. A protokoll jól működik az adatkeretek átvitelekor, hiszen a VEVŐ csak akkor küld vissza nyugtát, ha a keret vétele helyes volt. Mi van azonban akkor, ha VEVŐ által küldött nyugtakeret sérül meg? Mivel nyugta nincs, az ADÓ egy bizonyos idő múlva ismét elküldené a nem nyugtázott keretet, amit a VEVŐ ismételten venne, azaz a benne lévő adatok megkettőződve kerülnének a hálózati réteghez. Ez sajnos súlyos hiba.
A VEVŐ-nek kell egy olyan módszert alkalmaznia, amely megkülönböztethetővé teszi a számára az először látott kereteket az újraadásra kerültektől.
Ennek egyszerű megoldása az, hogy az ADÓ egy számot helyez el minden elküldendő keret fejrészébe, és ezáltal a VEVŐ eldöntheti, hogy először adott, vagy ismételt keretről van-e szó. Mivel a keretek és a nyugták egymás után vannak, ezért elegendő 1 bittel jelezni az újraküldés tényét. Nézzük: a k-adik keretre (amelynek újraküldési bitje 0 volt, jelezve az első küldést) a VEVŐ nyugtát küld, de az elvész. Az ADÓ mivel a k-adik keretet elküldte, de nem nyugtázták (legalábbis azt hiszi), egy adott időzítés lejárta után ismételten elküldi a keretet, de már 1-es újraküldési bittel). A VEVŐ ezt véve, a bit alapján már tudja hogy ezt már vette, ezért nyugtát küld vissza az elveszett helyett, de a keretet eldobja.
77. ábra: Egyirányú összetett protokoll blokkvázlata
Kétirányú protokollok
Az előző esetekben az adatátvitel egyirányú volt, bár az utolsó két esetnél a nyugtázás miatt az ellenirányú átvitelre is szükség volt az ADÓ informálása miatt. A gyakorlatban az adatátvitel is a legtöbbször kétirányú, ezért célszerű ezt a kialakítást is megvizsgálni. A megoldás lehetne két különálló, ellentétes irányú adatcsatorna használata, de az a nyugtázás miatt valójában négy információs utat jelentene, ahol a nyugtacsatornák kihasználása kicsi lenne.
Jobb megoldás, ha mindkét irány számára ugyanazt a csatornát használjuk, hiszen az adatkereteket a nyugtakeretektől a keret fejrészében elhelyezett jelző meg tudja különböztetni, és ez a keret vételekor azonosítható.
Egy egyszerű megoldással az átviendő keretek számát csökkenthetjük: bármelyik irányba tartó adatkeretre ráültethetjük az előző ellenirányú adatkeret nyugtáját. Ezt szokták ráültetési (piggy-back) technikának is hívni. Hogy egy nyugta akkor is visszajusson, ha éppen nincs visszafelé küldött adatkeret, célszerű egy adott időzítés lejártakor a VEVŐ-nek önállóan útnak indítani. Persze, ha az adó eltérő időzítése miatt újra elküldi a keretet, akkor ez problémát jelent.
Az eddigiekben feltételeztük hogy a csatornán mindig egy adatkeret, majd rá válaszul egy nyugtakeret halad. A valóságban a csatorna jobb kihasználását teszi lehetővé, ha megengedjük, hogy a csatornán több keret is tartózkodhat. Az ezt lehetővé eljárásokat csúszóablakos (sliding window) vagy forgóablakos protokolloknak nevezik. A könyvben az első megnevezést fogjuk használni.
79. ábra: Csúszóablakos protokoll
A protokollban minden egyes kimenő keret egy 0-max (az ábrán:0-7) közötti sorszámot kap. A lényeg az, hogy a sorban elküldendő keretek sorszámaiból egy aktualizált listát tart fenn az ADÓ. A listában szereplő sorszámú keretek az adási ablakba (sending window) esnek. Az ADÓ adási ablakában az elküldött, de még nem nyugtázott keretek vannak. Mikor egy nyugta megérkezik az ablak alsó fele feljebb csúszik, lehetővé téve újabb keret elküldését. Nem kell a kereteket egyenként nyugtázni, ha pl. az ADÓ az 1-es sorszámú keretre kap nyugtát, ez azt jelenti, hogy nyugtázott a 6,7,0,1 keret. (ld. ábra). Mivel a kereteket esetleg újra kell adni, ezért az ablakban lévő kereteket ismételt adásra készen memória-pufferekben kell tartani. Az ADÓ ezenkívül az ablakban lévő minden keret elküldésétől eltelt időt nyilván tartja, és ha ez egy értéknél (timeout) nagyobb, akkor újra adja.
A VEVŐ egy vételi ablakot (receiving window) tart fenn, amely az elfogadható keretek sorszámait tartalmazza. Bármelyik ablakon kívüli keret érkezésekor az eldobódik. Ha a k-adik keret érkezik, akkor rá a nyugta a következő két feltétel teljesülése esetén lesz visszaküldve: 1. A k-adik keret még nem lett nyugtázva. 2. Minden keretet az elsőnek várt (az ábrán a 6.) és a k-adik között már vettünk.
Egybites csúszóablakos protokoll
Ez a legegyszerűbb ilyen jellegű protokoll. Hasonló a megáll-és-vár protokollhoz, de az átvitel mindkét irányban folyik, és az ellenirányú csomag hordozza az előzőleg küldött nyugtáját. Legyen két állomás, A és B! Jelölések: küld, vesz, pl Avesz=A vesz. A keret jelölése: (sorszám, nyugta, az A vagy B által küldött adatcsomag jelölése). Mivel mindig csak akkor lehet új keretet küldeni, ha nyugtázva van az előző, a sorszám és nyugta értéke csak 0 vagy 1 lehet.
A kezdi az adást, küldi B-nek a keretet: (itt az 1 nyugta csak azért van, hogy B “azt higgye” hogy az előző küldése sikeres volt) Aküld(0,1,A0).
B veszi, és a nyugtát a saját keretével visszaküldi: Bvesz(0,1,A0), Bküld(0,0,B0)
A veszi B első keretét és küldött kerete nyugtáját, és küldi az újabb keretet: Avesz(0,0,B0), Aküld(1,1,A1). A következő ábrán összefoglalva:
80. ábra: Egybites csúszóablakos protokoll
A protokoll nagyon jól működik: Ha például A nem kapja meg pl. az A0-ra nyugtáját, azaz B (0,1,B0)-át küld, akkor ismét elküldi B-nek a (0,1,A0) keretet (mivel A nyugtázhatja a B0 keretet. Akár többször is küldheti (próbálkozhat), miközben B sorban adja a saját kereteit. A protokollt semmilyen elveszett keret, vagy a lejárt időzítés miatt újraküldött keret nem készteti arra, hogy kettőzött keretet adjon tovább a hálózati rétegnek, vagy egy keretet kihagyjon. Azonban keretkettőződés lép fel, ha A és B egyszerre kezd adni. Ugyanis ehhez induláskor 1-es nyugtával kell elküldenie a saját keretét:
Aküld(0,1,A0) Bküld(0,1,B0), és a vétel:
Avesz(0,1,B0) Bvesz(0,1,A0) amit el is fogadnak.
Mivel mindkét vételben 1-es nyugta van a várt 0 helyett, mindkettő újraküldi az előző keretet: Aküld(0,0,A0) Bküld(0,0,B0), amelyeket mindkettő vesz és továbbad.
Mind az ADÓ mind a VEVŐ számára egy elemes csúszóablak elegendő: az ADÓ az ablakba 0-át ír mikor elküld egy 0 sorszámú keretet, és amíg nem kap ezzel egyező nyugtát, újra küldi. Ha megjön a nyugta, akkor 1-et ír az ablakba, és várja a nyugtát. A VEVŐ csúszóablaka kezdetben 0-át tartalmaz, azaz 0 sorszámot vár. Ha ilyen keretet kap nyugtázza, és az ablakba 1-es (várt) sorszámot ír.
Visszalépés n-el technikájú protokoll
Ha a keretek átviteli ideje hosszú, például műholdas átvitel esetén, akkor nem jó az a megoldás, hogy újabb keretet, csak az előző nyugtázása után indítunk. A megoldás az, hogy az ADÓ nem 1 hanem k darab keretet küld el nyugtázás nélkül. Az n. keret elküldése után kezdi várni a nyugtákat és folytatni az k+1,... keretek küldését. Az ilyen esetben a csúszóablak mérete k kell hogy legyen. Ezt a megoldást csővonal-nak (pipelining) hívják, utalva arra a szemléletes képre, hogy a keretek egy csőbe haladnak, sorban egymás után.
Mi van azonban akkor, ha egy keret a sorban megsérül? Két megközelítés ismert: az egyik a címben már megnevezett visszalépés n-el (go back n) protokoll. Ennél a módszernél a VEVŐ, a hibás keret utáni kereteket nyugtázatlanul eldobja, kényszerítve az ADÓ-t az ismétlésre. Ez a stratégia 1 méretű vételi ablaknak felel meg. Zajos vonalak esetén ez a megoldás nagymértékben csökkenti az adatátviteli sebességet a sok újraküldés miatt.
Szelektív ismétlő
protokollA másik, csővonal esetén használható általános hibakezelési eljárást szelektív ismétlésnek (selective repeat) hívják, és működése már az előzőek és az elnevezése alapján már kitalálható: ennél a hibás keretet követő összes jó keret tárolásra kerül. Amikor az ADÓ felfedezi, hogy volt hibás keret (nem kap nyugtát róla), akkor csak a hibást küldi újra. Ennél a protokollnál, mind az ADÓ mind a VEVŐ fenntart ablakot, a keretsorszámoknak. Az ADÓ ablaka 0-tól sorszmax-ig növekszik. A VEVŐ ablaka rögzített méretű, a megfelelő működés érdekében 1-nél nagyobb.
A következőkben néhány konkrét megoldást mutatunk be.
1.fejezet: A hálózatok célja, alkalmazása, alapfogalmak
2.fejezet: Fizikai átviteli jellemzők és módszerek
3.fejezet: Közeg-hozzáférési módszerek
4.fejezet: Adatkapcsolati protokollok: Keretek képzése, Hibakezelés, CCITT V.41-es ajánlása, IBM BISYNC, HDLC, Ellenőrző kérdések
8.fejezet: A TCP/IP protokoll és az Internet