Protokoly s posuvným okénkem slouží k efektivnímu zajištění spolehlivého přenosu dat nespolehlivým kanálem. Spolehlivostí není míněna stoprocentní jistota úspěšného přenosu dat; znamená, že pokud ani opakované pokusy o přenos nebudou úspěšné, bude oznámena chyba. Spolehlivosti se obecně dosahuje postupem nazývaným zpětná vazba s automatickým opakováním, což je potvrzování přenesených dat pomocí zpětného kanálu a opakovaným vysíláním při chybě. U jednoduchých protokolů musí odesilatel po odeslání každého bloku dat čekat na potvrzení (jednotlivé potvrzování); protokoly s posuvným okénkem jsou efektivnější, protože umožňují vyslání většího množství dat bez čekání na potvrzení od příjemce. Toto množství vytváří „okénko“, které umožňuje používat omezený rozsah čísel na potvrzování a regulovat rychlost vysílání, aby nedošlo k zahlcení komunikačního spoje.

Princip fungování Koncepčně je každé přenosové jednotce (většinou rámcům linkové vrstvy, ale v TCP jednotlivým bytům) přiřazeno jednoznačné pořadové číslo. Příjemce tato čísla používá pro řazení přijatých paketů do správného pořadí, zahazování duplicitních paketů a identifikaci chybějících. V praktické implementaci je nutné omezit velikost pořadových čísel, obvykle pomocí funkce modulo.

Omezením počtu paketů, které mohou být vyslány nebo přijaty v libovolném okamžiku, protokol s posuvným okénkem umožňuje přenos neomezeného počtu paketů při použití pořadových čísel s pevnou velikostí. Termín „okénko“ na straně odesilatele reprezentuje logickou hranici celkového počtu paketů, které ještě mají být potvrzeny příjemcem. Příjemce informuje odesilatele v každém potvrzovacím paketu o aktuální maximální velikosti přijímací vyrovnávací paměti (velikosti okénka). V TCP hlavičce je šestnáctibitové pole pro oznámení velikosti přijímacího okénka odesilateli. Největší použitelné okénko je tedy 216 = 64 kilobytů. V režimu s pomalým startem odesilatel začíná posílat malý počet paketů a tento počet zvyšuje při každém vysílání po přijetí potvrzení paketu z příjemce. Po každém potvrzení přijetí paketu se okénko posune o jeden paket pro vysílání dalšího paketu. Po dosažení hranice okénka odesilatel posílá jeden paket při přijetí každého potvrzovacího paketu. Jestliže je například velikost okénka 10 paketů, pak v režimu pomalého startu odesilatele může začít přenos jedním paketem následovaným dvěma pakety (před přenosem dvou paketů musí být přijato potvrzení jednoho paketu), následovaný třemi pakety a tak dále, dokud se bez potvrzení neposílá 10 paketů. Po dosažení 10 paketů je vysílání omezeno na vyslání jednoho paketu při přijetí jednoho potvrzovacího paketu. Při simulaci to vypadá, jako kdyby se okénko posouvalo o jeden paket při přijetí každého potvrzovacího paketu. Také na přijímací straně se okénko posunuje o jeden paket pro každý přijatý paket. Metoda posuvného okénka zaručuje, že nedojde k zahlcení sítě provozem. Aplikační vrstva bude stále nabízet data pro přenos na TCP bez ohledu na problémy se zahlcením sítě, protože TCP na straně odesilatele i příjemce implementuje metodu posuvného okénko pro vyrovnávací paměť paketů. Velikost okénka se může měnit dynamicky podle intenzity provozu v síti.

Pro dosažení maximální propustnosti musí být vysílací okénko tak velké, aby odesilatel nebyl brzděn čekáním na potvrzení, což znamená, že okénko musí mít takovou velikost, aby bylo možné vysílat data bez potvrzení po celou dobu trvání obousměrného zpoždění (RTT). Velikost okénka musí být větší než součin přenosové rychlosti a zpoždění komunikačního spoje. Jestliže tomu tak není, bude protokol omezovat efektivní šířku pásma spoje.

Motivace Pokud se pro detekci a opravu chyb při komunikaci používá zpětná vazba s automatickým opakováním, musí příjemce potvrzovat přijaté pakety podle protokolu. Jestliže odesilateli nepřijde potvrzení v přiměřeném čase, pošle data znovu.

Když odesilatel nedostane potvrzení, nemůže vědět, zda příjemce skutečně paket přijal; jak původní paket, tak potvrzení se mohlo ztratit nebo poškodit při přenosu. Jestliže algoritmus detekce a opravy chyb odhalí poškození, příjemce paket zahodí a nepošle žádné potvrzení. Podobně příjemce obvykle nemá jistotu, zda jeho potvrzení bylo přijato. Pokud se ztratí potvrzení, mohou příjemci dojít stejná data dvakrát nebo vícekrát. V tomto případě příjemce musí znovu vyslat potvrzení, aby zabránil dalšímu opakování vysílání, ale duplicitní data ignoruje.

Fungování protokolu V typické implementaci je nt  číslo dalšího paketu, který má být poslán, tj. pořadové číslo prvního zatím nevyslaného paketu. Obdobně nr je číslo prvního zatím nepřijatého paketu. Zatím budeme pro zjednodušení předpokládat, že ani jedno z čísel v průběhu času neklesá.

Odesilatel i příjemce si udržují aktuální hodnoty nt a nr. Také si pamatují velikost okénka wt a wr. Velikosti okének se mohou měnit, ale v jednodušších implementacích jsou pevné. Aby bylo možné přenášet data, velikost okénka musí být větší než nula.

Příjemce si také pamatuje nejvyšší dosud přijaté pořadové číslo; v proměnné ns má hodnotu o jedničku větší. Jednoduché přijímače, které přijímají pakety pouze po řadě, mají wr = 1, a nr = ns. U chytřejších přijímačů se nr a ns může lišit.

Základním pravidlem je, že všechny pakety s číslem nižším než nr byly přijaty, žádné pakety s číslem vyšším než ns nebyly přijaty a v rozsahu nr a ns byly některé pakety přijaty.

Když příjemce přijme paket, aktualizuje si proměnné a pošle potvrzení s novým nr. Odesilatel si udržuje číslo na nejvyššího potvrzení, které přijal. Odesilatel ví, že všechny pakety s číslem menším než na byly přijaty, ale o paketech mezi na a ns to neví; tj. na ≤ nr ≤ ns.

Pro pořadová čísla vždy platí: na ≤ nr ≤ ns ≤ nt ≤ na + wt. Tj.: na ≤ nr: Nejvyšší potvrzení přijaté odesilatelem nemůže být vyšší než nejvyšší nr potvrzený příjemcem. nr ≤ ns: Rozpětí plně přijatých paketů se nemůže rozšířit za konec částečně přijatých paketů. ns ≤ nt: Nejvyšší přijaté číslo paketu nemůže být větší než nejvyšší číslo poslaného paketu. nt ≤ na + wt: Nejvyšší číslo posílaného paketu je omezené nejvyšším přijatým potvrzením a velikostí vysílacího okénka.

Fungování odesilatele Odesilatel může po přijetí potvrzení na poslat až wt paketů. To znamená, že může vysílat pakety číslo nt, dokud nt < na+wt.

Pokud při komunikaci nedochází k chybám, odesilateli přicházejí rychle potvrzení pro všechny pakety, které odeslal, takže na je rovno nt. Pokud dojde k chybě, musí odesilatel po přiměřeném zpoždění opakovat vysílání paketů s čísly mezi na a nt.

Metody pro definování „přiměřeného zpoždění“ mohou být velmi komplikované, ale ovlivňují pouze efektivitu komunikace; základní spolehlivost protokolu s posuvným okénkem na detailech nezávisí.

Fungování příjemce Při přijetí paketu s číslem x příjemce zkontroluje, zda padne do přijímacího okénka: nr ≤ x < ns+wr (nejjednodušším příjemcům stačí udržovat jednu hodnotu nr=ns). Paket, jehož číslo padne do okénka, příjemce přijme. Pokud má přijatý pakt číslo nr, příjemce zvětší přijímací pořadové číslo o 1 nebo o více, pokud už má přijaty a uloženy následující pakety. Jestliže x > nr, paket bude uložen až do doby, dokud nebudou přijaty všechny předchozí paketyPeterson, Larry L. & Davie, Bruce S. "Computer Networks: A Systems Approach ", Morgan Kaufmann, 2000. . Jestliže x≥ns, je ns aktualizováno na ns=x+1.

Jestliže číslo paketu neleží uvnitř přijímací okénka, příjemce jej zahodí a nemění ani nr ani ns.

Bez ohledu na to, zda byl paket v pořádku přijat nebo ne, příjemce pošle potvrzení obsahující aktuální nr. Potvrzení může obsahovat i informace o dalších paketech přijatých mezi nr nebo ns pro zlepšení efektivity – to je tak zvané selektivní opakování.

Nemá význam, aby velikost přijímacího okénka wr byla větší než vysílacího wt, protože není třeba se starat o přijaté pakety, které zatím nebyly vyslané; užitečný rozsah je 1 ≤ wr ≤ wt.

Potřebný rozsah hodnot čísel paketů náhled|400px|Posloupnost čísel modulo 4 s wr=1. Na počátku, nt=nr=0. První sloupec je počáteční stav, druhý sloupec po odeslání prvního rámce, třetí po přijetí prvního rámce, čtvrtý po přijetí prvního potvrzení. Zatím jsme předpokládali, že pořadová čísla mohou mít neomezenou velikost, takže mohou stále růst. V praxi je ale nutné velikost pořadových čísel x omezit na x mod N, pro nějaké konečné N. (N obvykle je mocnina 2.)

Odesilatel pak bude přijímat pouze potvrzení v rozsahu na až nt včetně. Protože to zaručuje, že nt−na ≤ wt, existuje nejvýše wt+1 možných pořadových čísel, která mohou přijít v libovolném okamžiku. Odesilatel tedy může jednoznačně dekódovat pořadové číslo, pokud N > wt.

Silnější omezení je vynuceno příjemcem. Fungování protokolu závisí na tom, aby příjemce byl schopen spolehlivě rozlišit nové pakety (které musí být přijaty a zpracovány) od opakovaného vysílání starých paketů (který musí být zahozeny a znovu odvysíláno poslední potvrzení). To lze provést, pokud známe velikost okénka odesilatele. Po přijetí paketu s číslem x, příjemce ví, že x < na+wt, tak na > x−wt. Tedy pakety s čísly x−wt nebudou znovu vysílány.

Nejnižší pořadové číslo, které budeme ochotni přijímat v budoucnosti, je ns−wt

Příjemce také ví, že na odesilatele nemůže být větší než nejvyšší dosud poslané potvrzení, což je nr. Tedy nejvyšší pořadové číslo paketu, který může příjemce dostat, je nr+wt ≤ ns+wt.

Příjemce tedy může v určitém okamžiku rozlišit 2wt různých pořadových čísel. Proto se může zdát, že musíme mít N ≥ 2wt. Ale skutečný limit je nižší.

Příjemce nemusí akceptovat ani příliš malá ani příliš velká pořadová čísla (menší než nr nebo větší nebo rovná ns+wr). V těchto případech příjemce paket ignoruje a pouze znovu pošle potvrzení. Musí pouze platit N ≥ wt+wr. Často bývá wr<wt (viz např. opakování s návratem níže), což umožňuje, aby wt bylo pro pevné N větší.

Příklady

Nejjednodušší posuvné okénko: jednotlivé potvrzování I když se obvykle k protokolům s posuvným okénkem nepočítá, je jednotlivé potvrzování ve skutečnosti nejjednodušší možnou implementací posuvného okénka. Vysílací i přijímací okénko má velikost 1 paket. To vyžaduje N=1+1=2 pořadová čísla (obvykle reprezentovaná jediným bitem).

Příklad nejednoznačnosti Odesilatel střídavě posílá pakety označené „lichý“ a „sudý“. Potvrzení také říká „lichý“ nebo „sudý“. Předpokládejme, že odesilatel, který měl poslat lichý paket, nečekal na jeho („liché“) potvrzení a místo toho okamžitě poslal následující sudý paket. Pak může přijmout potvrzení říkající „další očekávaný paket je lichý“. Tak by se odesilatel dostal do dilematu: přijal příjemce oba pakety nebo žádný?

Opakování s návratem Opakování s návratem je protokol s posuvným okénkem s wt>1, ale s pevným wr=1. Kromě prvního dosud nepřeneseného paketu příjemce všechny ostatní pakety odmítá. Jestliže dojde, ke ztrátě paketu při přenosu, následující pakety jsou ignorovány, dokud není znovu vyslán chybějící paket, což způsobí zpoždění minimálně jednoho obousměrného zpoždění. Proto je tato metoda neefektivní na spojích, kde dochází často ke ztrátě nebo poškození paketů.

Příklad nejednoznačnosti Předpokládejme, že používáme tříbitová pořadová čísla, jako je tomu u normálních režimů protokolu HDLC. To dává N=2³=8. Protože wr=1, musí být wt≤7. Důvodem je, že po přenosu 7 paketů existují 8 možných výsledků: mohlo být úspěšně přijato 0 až 7 paketů. To je 8 možností a odesilatel je potřebuje všechny rozlišit.

Pokud by odesilatel poslal 8 paketů bez čekání na potvrzení, mohl by se dostat do stejného dilematu jako při jednotlivém potvrzování: znamená opakování stejného čísla v potvrzení, že bylo přijato úspěšně všech 8 paketů nebo žádný?

Selektivní opakování Nejobecnějším případem protokolu s posuvným okénkem je selektivní opakování. U tohoto protokolu příjemce přijímá pakety s pořadovými čísly vyššími než je aktuální nr a ukládá je, dokud se nezaplní díry po nepřijatých paketech. To vyžaduje mnohem komplikovanější práci s vyrovnávacími pamětmi na straně příjemce.