Protokol TCP (Transmision Control Protocol)

TCP je protokol transportnej vrstvy a leží nad IP. Jeho hlavnou úlohou je spoľahlivý prenos dát. Číslo v záhlaví jeho IP protokolu je 6. Jeho hlavne atribúty sú:

Protokol TCP Transportnej vrstvy je spojovacou službou (connection oriented). Je to služba, ktorá nadviaže spojenie medzi dvoma aplikáciami – na určitý čas vytvorí spojenie virtuálny okruh. Tento okruh je plne duplexný (dáta sa prenášajú súčasne, nezávisle od seba oboma smermi). Prenášané bajty sú číslované. Stratené, alebo poškodené dáta sú znovu vyžiadané. Integrita prenášaných dát je zabezpečená kontrolným súčtom. Konce spojení (“odosielateľ” a “adresát”) sú určené tzv. číslom portu. Toto číslo je dvojbajtové, takže môže nadobúdať hodnôt 0 až 65535. U čísel portov sa často vyjadruje okolnosť, že sa jedná o porty protokolu TCP tým, že sa za číslo napíše lomítko a názov protokolu (tcp). Pre protokol UDP je iná sada portov než pre protokol TCP (tiež 0 až 65535), tj. napr. port 53/tcp nemá nič spoločné s portom 53/udp.


            Obrázok - Porty TCP a UDP

Cieľová aplikácia je v Internete adresovaná (jednoznačne určená) IP-adresou, číslom portu a použitým protokolom (TCP alebo UDP). Protokol IP dopraví IP-datagram na konkrétny počítač. Na tomto počítači bežia jednotlivé aplikácie. Podľa čísla cieľového portu operačný systém spozná, ktorej aplikácii má TCP-segment doručiť. 

Základnou jednotkou prenosu v protokole TCP je TCP segment. TCP segment sa vkladá do IP-datagramu. IP-datagram sa vkladá do linkového rámca. Ak sa použije príliš veľký TCP-segment, ktorý sa celý vloží do veľkého IP-datagramu, ktorý je väčší než maximálna veľkosť prenášaného linkového rámca (MTU), tak IP protokol musí previesť fragmentáciu IP-datagramu (viz obr 9.2). 


            Obrázok - Segmentácia a fragmentácia

 TCP segment

Hlavička paketu TCP protokolu je dlhá 20 slabík (bez položky Voľby), za ktorou nasledujú údaje (pozri tabuľku).

16
32 bits
Source port
Destination port
Sequence number
Acknowledgement number
Offset
Resrvd
U
A
P
R
S
F
Window
Checksum
Urgent pointer
Option + Padding
Data
TCP hlavička

- Tabuľka - Štruktúra TCP paketu

 Názov

Veľkosť

  Zdrojový port   2 BAJTY
  Cieľový port   2 BAJTY
  Sekvenčné číslo   4 BAJTY
  Potvrdzovacie číslo   4 BAJTYTY
  Dĺžka hlavičky   4 BITY
 Rezervované  6 BITOV
 Príznaky  6 BITOV
 Veľkosť okna  2 BAJTY
 Kontrolná suma  2 BAJTY
 Ukazovateľ naliehavých údajov  2 BAJTY
 Voľby  1 BAJT

 

Zdrojový port (source port) je port odosielateľa TCP segmentu, cieľový port (destination port) je portom adresáta TCP segmentu. Pätica: zdrojový port, cieľový port, zdrojová IP-adresa, cieľová IP-adresa a protokol (TCP) jednoznačne identifikuje v danom okamihu spojenie v Internete. 
TCP segment je časť z toku dát tečúcich od odosielateľa k príjemcovi. Poradové číslo odosielaného bajtu je poradové číslo prvého bajtu TCP segmentu v toku dát od odosielateľa k príjemcovi (TCP segment nesie bajty od poradového čísla odosielaného bajtu až do dĺžky segmentu). Tok dát v opačnom smere má samostatné (iné) číslovanie svojich dát. 

Vždy, keď je nastavený príznak SYN, operačný systém odosielateľa začína číslovať znovu, tj. vygeneruje štartovacie poradové číslo odosielaného bajtu, tzv. ISN (Initial Sequence Number). 

Naopak, poradové číslo prijatého bajtu vyjadruje číslo nasledujúceho bajtu, ktorý je príjemca pripravený prijať, tj. príjemca potvrdzuje, že správne prijal všetko až do poradového čísla prijatého bajtu mínus jedna. 

Nadviazanie a ukončenie spojenia protokolom TCP

Pretože je protokol IP datagramovou (nespojovanou službou), tak sa protokol IP príliš nepotreboval zaťažovať prípadmi, kedy IP-datagram nie je doručený. IP protokol takéto stavy môže nanajvýš signalizovať protokolom ICMP. Signalizácia protokolom ICMP je iba dobrou vôľou protokolu IP. V praxi sa stretávame s veľa prípadmi, kedy signalizácia pomocou protokolu ICMP je potlačovaná, pretože je nežiaduca - napr. z bezpečnostných dôvodov. 

Protokol TCP využíva k transportu dát Internetom protokol IP, avšak nad týmto protokolom zriaďuje spojovaciu službu. Musí riešiť problémy nadviazania a ukončenia spojenia, potvrdzovanie prijatých dát, vyžiadanie stratených dát, ale tiež problémy priechodnosti prenosovej cesty. Popis TCP segmentu je teda len malou časťou TCP protokolu, podstatne rozsiahlejšia časť je popis výmeny TCP segmentov (handshaking) medzi oboma koncami TCP spojenia. 

Protokol TCP umožňuje jednej strane nadväzovať spojenie. Druhá strana spojenie buď akceptuje, alebo odmietne. Z hľadiska aplikačnej vrstvy bude stranou nadväzujúcou spojenie klient a server tá strana, ktorá spojenie očakáva. 

Zaujímavosťou je, že TCP protokol umožňuje, aby obe strany nadväzovali spojenie súčasne. V praxi sa s niečím takým stretávame veľmi zriedka a preto sa budeme ďalej venovať prípadu, kedy jedna strana spojenie nadväzuje a druhá očakáva.

Klient si praje napr. nadviazať spojenie so serverom bežiacom na počítači “Server“ na porte 4433. Klient pre spojenie použije port 1458. Bežnejšie však je, že klient na konkrétnom čísle netrvá. Operačný systém mu pridelí voľný port automaticky keď o to požiada. Ak aplikácia klienta trvá na použití konkrétneho čísla pre port riskuje tým to, že spojenie nebude vytvorené, lebo daný port sa už na strane klienta používa. Porty menšie ako 1024 sa označujú ako privilegované. Používajú sa hlavne na strane servera a bývajú priradené štandardným službám na sieti (napr. Telnet-23,http-80,atď...). Z toho vyplýva, že ak požiadame o pridelenie portu operačný systém tak nám bude (až na niektoré výnimky) pridelený prvý voľný port väčší ako 1023. 

Nadviazanie spojenia:

1. Klient začína nadväzovať spojenie odoslaním prvého TCP segmentu, kde je port odosielateľa 1458 a port príjemcu 4433. Tento TCP segment klient vloží do IP-datagramu, ktorého adresa odosielateľa bude „Klient“ a IP-adresa príjemcu „Server“. Klient vygeneruje náhodné číslo, ktoré použije ako štartovacie poradové číslo odosielaného bajtu. Klient nastaví príznak SYN, ktorý už v priebehu spojenia klient v žiadnom segmente nepoužije. Segment (1) je prvým segmentom v TCP komunikácii, preto nemôže potvrdzovať žiadne dáta, čiže nenastaví sa príznak ACK. Kombinácia nastaveného príznaku SYN a nenastaveného ACK je zvláštna tým, že sa používa iba pri nadväzovaní spojenia. Túto vlastnosť môžeme využiť vtedy, ak chceme zamedziť nadväzovaniu TCP spojenia. Stačí nastaviť filter tak, aby neprepúšťal žiadne datagramy s takouto kombináciou príznakov. 

2. Server prijme prvý TCP segment a vytvorí nový TCP segment (2). V segmente (2) nastaví príznaky ACK a SYN. Príznak ACK hovorí, že server prijal SYN signál a príznak SYN hovorí, že server vygeneroval nové poradové číslo. V segmente (2) nastaví potvrdzovacie číslo na hodnotu o jednotku väčšiu ako bolo poradové číslo segmentu (1). Strana servera pošle segment (2) strane klienta na port 1458.

3. Klient prijme segment (2), potvrdí ho segmentom (3) a začne vysielať dáta.

4. Rovnako strana servera prijme segment (3) a začne vysielať.

Tento mechanizmus sa nazýva potrasenie rukou (ang. handshaking)


            Obrázok - Nadväzovanie spojenia

V každom okamihu spojenia je spojenie v tzv. stave. Pri nadväzovaní spojenia môže byť:

Server v stave:

- Server v stave:

- Klient v stave:

Ak sa spojenie nadviaže, potom klient aj server prechádzajú do stavu ESTABLISHED, tj. Spojenie nadviazané.
Spojenie a ich stavy ľahko zistíme po zadaní príkazu: netstat –a


Ukončenie spojenia

Ukončenie spojenia môže iniciovať ľubovoľná strana. Strana, ktorá prvá odošle príznak FIN vykonáva tzv. aktívne ukončenie spojenia. Druhá strana musí uskutočniť pasívne ukončenie. Ak jedna strana vykoná aktívne ukončenie spojenia, nemôže už posielať dáta. Druhá strana však môže dáta posielať až dovtedy, pokiaľ sama neuskutoční ukončenie spojenia. 

Stavy pri ukončovaní spojenia:


            Obrázok - Ukončenie spojenia


RFC793 http://www.ietf.org/rfc/rfc793.html
RFC1146 http://www.ietf.org/rfc/rfc1146.html
RFC1072 http://www.ietf.org/rfc/rfc1072.html
This RFC has been replaced by RFC 1323.
RFC1693 http://www.ietf.org/rfc/rfc1693.html