Slidy z prednášky
YouTube

1.  Úloha transportnej vrstvy

V aplikačnej vrstve sme sa venovali protokolom, pomocou ktorých vedeli komunikovať dve sieťové aplikácie, aby si vedeli poslať nejaké konkrétne dáta, nazývané správy (napr. súbor, heslo, DNS záznam). Komunikácia, a teda aj výmena správ je realizovaná typicky cez rozhranie nazývané soket, cez ktoré odovzdáva aplikácia (proces) správy transportnej vrstve a tiež prijíma správy z transportnej vrstvy. Hlavnou úlohou transportnej vrstvy je umožniť prenos správ (prúdu dát) medzi dvoma procesmi alebo vláknami na rôznych koncových zariadeniach. Transportná vrstva pri tom využíva sieťovú vrstvu, ktorá dokáže dopraviť pakety z počítača na počítač. Neformálne povedané, transportná vrstva „spracuje“ to, čo dôjde po sieti na dané zariadenie, zrekonštruuje z toho správy aplikačnej vrstvy a pošle ich správnemu soketu a tým aj aplikácii, čo ho otvorila.

Na internete sa používajú hlavne dva transportné protokoly TCP a UDP. V tejto a ďalšej prednáške sa im budeme venovať podrobnejšie.

2.  Delenie správ a adresácia soketov na transportnej vrstve

Internet je paketmi riadená počítačová sieť. Pakety majú obmedzenú veľkosť, bežne cca 1,5 kB. Keďže správy (dáta) odosielané z aplikačnej vrstvy môžu byť rôzne veľké, pokojne aj niekoľko gigabajtov, transportná vrstva tieto správy rozdelí na menšie časti. Každej z týchto častí pribalí hlavičku s informáciami pre transportnú vrstvu cieľovej stanice, čím vznikne segment. Segment odovzdá ďalej sieťovej vrstve, ktorá sa postará o jeho prenos k transportnej vrstve cieľovej stanice. Transportná vrstva v cieľovej stanici vyextrahuje zo segmentov kúsky správy (dát) a pošle ich správnemu soketu, teda na spracovanie procesu prijímacej aplikácie.

V hlavičke každého segmentu sa nachádzajú dve dôležité dvojbajtové čísla: zdrojový port a cieľový port s možnými hodnotami 0 až 65535. Pozrime sa bližšie na to, ako sa tieto čísla využívajú na adresáciu soketov. Keď proces otvára nový soket, musí byť asociovaný s nejakým číslom portu na jednom, alebo viacerých sieťových rozhraniach (typicky je pridelené jedno sieťové rozhranie so svojou IP adresou pre každú sieťovú kartu a jedno rozhranie pre localhost). Soket môže aplikácia otvoriť buď ako server, alebo ako klient.

Keď proces otvorí serverový soket, explicitne povie číslo portu, s ktorým bude asociovaný, alebo si nechá operačným systémom prideliť voľný port. Každý segment, ktorý bude odoslaný pre tento soket, musí mať ako cieľový port toto číslo portu.

Klientsky proces pri otváraní soketu musí špecifikovať IP adresu cieľovej stanice a číslo cieľového portu, aby bolo jasné, s akým soketom chce komunikovať. Okrem toho musí obsadiť nejaké číslo portu na svojom počítači, t.j. zdrojový port, čím určí „návratovú adresu“ pre serverový proces, aby vedel, kam má poslať odpoveď.

V prípade UDP protokolu je cieľový soket jednoznačne určený cieľovou IP adresou a cieľovým portom. To tiež znamená, že žiaden iný soket už nemôže mať pridelené toto číslo portu na tom istom rozhraní s danou IP adresou. Akékoľvek dáta určené pre tento port na tomto počítači budú odovzdané tomuto soketu.

V protokole TCP je soket jednoznačne určený štvoricou zdrojová IP adresa, zdrojový port, cieľová IP adresa a cieľový port. Keďže ide o protokol, kde sa udržiava spojenie, je potrebné uvažovať dva prípady určovania cieľového soketu. Buď ide o nové, alebo už vytvorené spojenie. Pokiaľ hovoríme o už vytvorenom spojení, tak ide vždy o komunikáciu medzi tými istými soketmi, z ktorých každý má pridelenú stále rovnakú IP adresu a port. Ani k jednému z týchto soketov už nemôže posielať dáta iný proces z iného soketu, lebo má buď inú IP adresu alebo iné číslo portu.

Ako teda nadviazať novú TCP komunikáciu? Serverový TCP soket je špeciálny typ soketu, ktorému sú preposielané všetky pokusy o nadviazanie spojenia na danej IP adrese a porte pre zatiaľ neasociovanú zdrojovú IP adresu a port. Serverový soket vytvorí nový soket, ktorý je asociovaný s rovnakou IP adresou a portom ako serverový soket a zároveň s touto novou zdrojovou adresou a zdrojovým portom. Odteraz aj serverový soket aj nový soket budú počúvať na rovnakej IP adrese a rovnakom porte, ale s týmto novým klientom už bude komunikovať iba nový soket.

Poznámka: Vlastnosť, že mnoho paralelných soketov aplikácie „počúva“ na rovnakom porte má veľkú výhodu pri konfigurovaní firewallov, kedy stačí otvoriť spojenia iba pre zopár konkrétnych portov. Napríklad, ak chceme, aby bol na počítači prístupný iba webový server, otvoríme iba port 80 a ostatné môžeme zakázať. Keby každé nové spojenie vytváralo komunikáciu na inom porte servera, táto komunikácia by cez takto nakonfigurovaný firewall neprešla.

3.  Transportný protokol UDP

UDP: user datagram protocol, RFC 768

Protokol UDP pridáva k možnostiam nižších vrstiev okrem adresácie soketov cez čísla portov, už iba kontrolný súčet. Hlavička UDP segmentu obsahuje zdrojový a cieľový port, informáciu o počte bajtov segmentu a 16 bitový kontrolný súčet.

Napíšme si základné vlastnosti UDP protokolu:

  • nepodporuje spoľahlivý prenos dát
    • Protokoly nižších vrstiev nezabezpečujú spoľahlivosť doručenia každého segmentu na cieľový počítač. To znamená, že UDP segmenty sa môžu stratiť (ich pakety zahodí niektorý router na ceste kvôli zahlteniu, alebo cieľová stanica kvôli tomu, že nestíha daný segment spracovať) alebo byť doručené v inom poradí ako boli vysielané. Protokol UDP tieto vlastnosti zachováva v plnom rozsahu. Aplikačnej vrstve odovzdáva správy (dáta) tak ako prichádzajú. Z toho vyplýva, že ak aplikačná vrstva využíva protokol UDP, musí počítať s tým, že niektoré časti odosielanej správy sa nemusia dostať k cieľovému procesu. Sieťové aplikácie sa teda musia buď vedieť zotaviť zo strát prenesených dát, alebo si správu prenesených dát realizovať sami.
  • bez spojenia
    • Protokol neobsahuje žiadnu inicializáciu ani uzatváranie spojenia. To znamená, že nie je potrebné ani uchovávanie stavu spojenia v koncových staniciach. Dáta sú odosielané k cieľu bez toho, aby bolo vyžadované potvrdenie prijatia správ. Dokonca môže ísť iba o jednosmerné vysielanie bez akejkoľvek spätnej reakcie. Typickým príkladom, kde sa to využíva je streamovanie rádia a televízií (záujemcovia pozrite si RTP protokol, ktorý dokonca umožňuje, že raz odoslané dáta môžu dôjsť k viacerým príjemcom – tzv. multicast).
  • žiadna kontrola toku dát ani zahltenia siete
    • UDP protokol umožňuje odosielať tak rýchlo, ako umožňuje najbližšie sieťové pripojenie, bez ohľadu na to, či je na ceste k cieľu užšie miesto, kde sa strácajú pakety. Odľahčuje to správu odosielania, ale môže to nepriaznivo ovplyvniť sieť a spôsobiť zahltenie príjemcu alebo routrov na ceste.

3.1  Kontrolný súčet

Kontrolný súčet sa používa na odhalenie chýb v dátach spôsobených prenosom. Chyba môže nastať ľubovoľným negatívnym vplyvom pri prenose (silné magnetické pole, nečistota v optickom vlákne a pod.). Chyba sa obvykle prejaví zmenou niektorých bitov segmentu na opačné.

Na vytvorenie kontrolného súčtu vezmeme obsah správy plus čísla portov a rozdelíme na kúsky veľkosti 16 bitov. Tým nám vznikne mnoho 16 bitových čísiel, ktoré všetky sčítame, pričom ignorujeme prenesené bity mimo 16 bitový rozsah.

Napríklad, ak máme urobiť kontrolný súčet z dát 11100110 01100110 01010101 01010101 00001111 00001111, potrebujeme sčítať tri 16 bitové čísla. Najprv sčítame prvé dve a k výsledku pripočítame tretie.

 1110011001100110 
 0101010101010101
 ================
10011101110111011

0011101110111011
0000111100001111
================
0100101011001010

Nakoniec ešte vytvoríme z výsledku inverzné číslo, t.j. zmeníme vo výsledku všetky 1 na 0 a všetky 0 na 1. Takto vzniknuté číslo prehlásime za kontrolný súčet a vložíme ho do hlavičky UDP segmentu. Príjemca segmentu urobí opäť súčet doručeného segmentu rovnakým spôsobom a nakoniec ho pripočíta ku kontrolnému súčtu. Ak vo výsledku sa nachádza aspoň jedna nula, segment obsahuje chybu. Inak predpokladáme, že segment chybu neobsahuje, aj keď to aj tak nevieme na 100%.

          súčet: 0100101011001010
kontrolný súčet: 1011010100110101
                 ================
                 1111111111111111

4.  Úlohy a diskusia

  • Popíšte dôvody, pre ktoré sa môže softvérový vývojár rozhodnúť skôr pre protokol UDP než pre TCP.
  • Je možné aby viac UDP soketov obsadilo rovnaké číslo portu?
  • Predpokladajme, že by ste vytvorili kopírovací protokol nad transportným protokolom UDP. Je možné, aby útočník poslal na váš počítač, ktorý práve prijíma súbor, nejaké UDP segmenty, ktoré by ste mohli považovať za segmenty odosielateľa?

zdroje: