![]() |
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ú:
Poskytuje plne duplexný obojsmerný virtuálny okruh.
Z hľadiska užívateľa sú dáta videne ako tok, nie ako oddelené pakety
Zabezpečuje spoľahlivý prenos dát pomocou.
. poradových čísel
. kontrolných súm
. potvrdení
. opakovaného prenosu paketov pri vypršaní nastavenej doby čakania.
Pre väčšiu účinnosť používa princíp posuvných okien (sliding windows).
Umožňuje vysielanie urgentných dát a zrušenie už odoslaných bafrovaných dát.
Adresuje užívateľské procesy pomocou 16 bitových čísel portov.
Umožňuje spoľahlivé ukončenie spojenia.
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
|
|||||||
Destination port | ||||||||
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 číslo TCP portu, ktorý identifikuje zdrojový aplikačný program.
Cieľový port (Destination port) je číslo, ktoré identifikuje cieľový aplikačný program.
Sekvenčné číslo (Sequence number) je identifikačné číslo posielaného segmentu.
Potvrdzovacie číslo (Acknowledge number) je identifikačné číslo očakávaného segmentu.
Dĺžka hlavičky (Header length) určuje dĺžku hlavičky TCP segmentu v dvoj slovách a počíta sa sem aj veľkosť položky Voľby.
Príznaky (Flags) je skupina šiestich bitov, ktorá sa viaže na ďalšie položky:
- U URG TCP segment nesie naliehavé dáta
- A ACK TCP segment má platné pole “Poradové číslo prijatého bajtu”
- P PSH spravidla sa používa k signalizácii, že TCP segment nesie aplikačné dáta a príjemca má tieto dáta predávať aplikácii, použitie tohto príznaku nieje ustálené
- R RST odmietnutie TCP spojenia
- S SYN odosielateľ začína s novou sekvenciou číslovania, tj. TCP segment nesie poradové číslo prvého odosielaného bajtu (ISN)
- F FIN odosielateľ ukončil odosielanie dát (pokiaľ použijeme prirovnanie k práci so súborom, potom príznak FIN odpovedá koncu súboru (EOF)).
Veľkosť okna (Window size) slúži na riadenie toku a potvrdzovania.
Kontrolná suma (Checksum) slúži na zabezpečenie údajov.
Ukazovateľ naliehavých údajov (Urgent pointer) určuje začiatok naliehavých údajov.
Voľby (Options) je nepovinná položka, využíva sa najmä pri nadväzovaní spojenia.
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:
LISTEN – server je pripravený na spojenie s klientmi.
SYN_RCVD – server prijal od klienta prvý TCP segment s príznakom SYN.
- Klient v stave:
SYN_SEND – klient poslal prvý TCP segment s príznakom SYN.
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:
FIN_WAIT1 – strana zistila, že už odoslala všetky dáta, v TCP segmente nastaví príznak FIN.
CLOSE_WAIT – druhá strana prijala aktívne ukončenie spojenia a neostáva jej nič iné len ho potvrdiť segmentom.
FIN_WAIT2 – je stav potom, čo strana obdržala potvrdenie aktívneho ukončenia spojenia. V stave FIN_WAIT2 strana zostáva dovtedy, pokiaľ druhá strana nepošle TCP segment s príznakom FIN. Pokiaľ aplikácia nepočíta s prenosom dát v polo uzavretom spojení a spojenie je nečinné 11,25 minúty, tak operačný systém automatický zmení stav spojenia na CLOSED.
LAST_ACK – druhá strana už odoslala všetky dáta a signalizuje úplné ukončenia segmentom.
TIME_WAIT – všetky dáta oboma smermi boli prenesené. Je nutné iba potvrdiť úplné uzavretie spojenia.
CLOSED – druhá strana prijala potvrdenie úplného uzavretia spojenia a prechádza do stavu CLOSED.
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