TCP přenos dat a potvrzovací proces

Každý oktet v rámci segmentu je potvrzen tím, že je potvrzeno přijetí segmentu, který oktet obsahuje. Potvrzování je podobné potvrzování u navazování spojení (handshaking). Používá příznak ACK a sekvenční čísla.

Každý oktet v rámci segmentu je potvrzen tím, že je potvrzeno přijetí segmentu, který oktet obsahuje. Potvrzování je podobné potvrzování u navazování spojení (handshaking). Používá příznak ACK a sekvenční čísla.

Zdrojový proces musí uchovávat všechna odeslaná data dokud neobdrží potvrzení jejich převzetí. Jestliže potvrzení nepřijde do určité doby (uživatelsky ovlivnitelná veličina), proces považuje data za ztracená nebo poškozená a odešle je znovu – všechna počínaje prvním nepotvrzeným bytem. Pokud nepřijde odpověď do vypršení časovače, je provedeno opětovné odeslání všech nepotvrzených dat. Počet možných opakování je uživatelsky ovlivnitelný a dojde-li k jeho překročení je pro vyšší vrstvy generována chyba a přerušeno TCP spojení.

TCP proces má dvě fronty – frontu pro odesílaná data a frontu pro přijímaná data. Již bylo řečeno, že data v odesílací frontě jsou držena dokud nepřijde potvrzení jejich přijetí. Poté je fronta uvolněna a od vyšší vrstvy jsou přijata nová data k odeslání.

Cílový proces si podle sekvenčních čísel ukládá přijímané segmenty do přijímací fronty (bufferu) a tím dochází ke skládání přijímané informace. Tato data postupuje ke zpracování vyšší vrstvě.

Potvrzovací proces

Již bylo řečeno, že potvrzovací proces je založen na sekvenčních číslech. Sekvenční čísla jsou generována v první chvíli náhodně a v průběhu procesu komunikace jsou postupně zvyšována o příslušný počet již odeslaných (obdržených) oktetů (bytů). Protože potvrzování každého segmentu je neefektivní, byl zvolen specifický model řízení toku dat založený na tzv. okně (window). Tento model zefektivňuje proces potvrzování přijatých paketů. Jenom pro zajímavost si zkuste spočítat jak dlouho by trval přenos 1 MB dat po internetu za předpokladu, že by byl potvrzován každý paket, zpoždění průchodu paketu od jednoho uzlu k druhému a zpět je 100 ms a MTU je 500 byte. Uvažujme ideální síť kde nedochází ke ztrátám paketů. Pro zjednodušení nebudeme počítat skutečnou dobu, ale pouze navýšení doby přenosu. Při uvedených hodnotách by došlo k cca 2.000 potvrzením, při každém čekáme 100 ms, takže potvrzovací mechanismus zabere 200 sekund navíc. Přínos okna je v tom, že významně redukuje počet potvrzování.

Okno má určitou velikost, která představuje objem dat přenesený do potvrzení. Počáteční velikost okna je určena v procesu ustavení spojení a může být v průběhu přenosu měněna.

Na obrázku jsou vidět data a způsob implementace okna. Úplně vlevo jsou data, která byla již odeslána a potvrzena, dále je okno a data, která teprve čekají na zařazení do procesu. Okno má dvě části – odeslaná (ale ještě nepotvrzená data) a neodeslaná data a tři významné body:

levá strana – všechna data vlevo byla odeslána a potvrzena; data vpravo jsou obsažena v okně;

pravá stana – data vlevo jsou obsažena v okně, data vpravo čekají na další posun okna; nejvyšší oktet v okně je posledním, který bude v rámci tohoto okna odeslán před potvrzením z cílového uzlu;

hranice – je významný bod uvnitř okna, data vlevo byla odeslána a čekají na potvrzení, data vpravo budou odeslána ještě před přijetím potvrzení.

Všechny referenční body se dynamicky posunují. Hranice se posunuje v rámci okna dokud nedojde k pravé straně. Poté proces čeká na přijetí potvrzení. Jakmile potvrzení dorazí je přesunuto celé okno a proces se opakuje. V případě, že nedorazí potvrzení v době dané časovačem, je odesláno celé okno.