Transmission Control Protocol (TCP) je přepravní protokol, který se používá nad rámec IP k zajištění spolehlivého přenosu paketů. TCP obsahuje mechanismy pro řešení mnoha problémů, které vznikají při odesílání zpráv ve formě paketů, jako jsou ztracené pakety, pakety ve špatném pořadí, duplicitní pakety a poškozené pakety. Vzhledem k tomu, že je protokol TCP používaný nejčastěji nad rámec IP, je tato skupina internetových protokolů někdy označována jako TCP/IP.

Protokol UDP (User Datagram Protocol) je jednoduchou alternativou protokolu TCP. UDP je nespojovaná služba (rozdíl oproti protokolu TCP) - nenavazuje spojení. Odesílatel odešle UDP datagram příjemci a už se nestará o to, zda se náhodou datagram cestou neztratil (o to se případně musí postarat aplikační protokol stojící výše).

TCP a UDP protokoly patří do transportní vrstvy v TCP/IP modelu, čili jsou o vrstvu výše než protokol IP. Proč jsou potřeba dva protokoly?

IP přepravuje data mezi libovolnými počítači v Internetu, protokol TCP dopravuje data mezi dvěma konkrétními aplikacemi běžícími na těchto počítačích. Pro dopravu dat mezi počítači využívá protokol IP. IP protokol adresuje pouze síťové rozhraní počítače (např. síťový adaptér).

Protokol TCP

Protokol TCP je spojovanou službou (connection oriented):

  • mezi dvěma aplikacemi naváže spojení

  • na dobu spojení vytvoří virtuální okruh

  • okruh je plně duplexní - data se mohou přenášet současně oběma směry na sobě nezávisle

  • přenášené bajty jsou číslovány

  • ztracená nebo poškozená data jsou znovu vyžádána

  • integrita dat je zabezpečena kontrolním součtem

Zabezpečeni přenosu je účinné pouze proti poruchám technických prostředků. Nejedná se o zabezpečení proti inteligentnímu útočníkovi, který data modifikuje a zároveň modifikuje i kontrolní součet. Proti těmto útokům je účinný např. protokol SSL (vyšší vrstva).

Konce spojení (odesílatel - adresát) jsou určeny číslem portu. Číslo portu je dvojbajtové - může nabývat hodnot 0-65535. Pro protokol UPD je označeni portu také dvojbajtové. Jedná se o jinou sadu portů. Pro rozlišení se zapisuje např. 53/tcp nebo 53/udp (tyto dva porty nemají nic společné).

Cílová aplikace je v Internetu jednoznačně určena (adresována):

  • IP-adresou

  • číslem portu

  • použitým protokolem - TCP nebo UDP

Protokol IP dopraví IP-datagram na konkrétní počítač. Na tomto počítači běží jednotlivé aplikace. Podle čísla portu operační systém pozná, které aplikaci má TCP-segment doručit.

Porty připomínají poštovní schránky v paneláku

TCP porty

Základní jednotkou přenosu v protokolu TCP je TCP-segment. Někdy se říká TCP-paket, ale segment je lepší vyjádření.

Příklad: Aplikace potřebuje přenést soubor 2 GB velký. TCP-segmenty jsou baleny do IP-datagramů, které má pole 'délka' dlouhé 16 bitů, tak TCP-segment může být dlouhý maximálně 65535 minus délka TCP-záhlaví. Přenášené 2 GB dat musí být rozděleny na segmenty, které se vkládají do TCP-paketu - tedy TCP-segmentu.

TCP-segment se vkládá do IP-datagramu, IP-datagram se vkládá do linkového rámce (např. Ethernet protokolu). Je-li TCP-segment příliš velký, který se celý vloží do velkého IP-datagramu, který je větší než max. velikost přenášeného linkového rámce (MTU), pak IP protokol musí provádět fragmentaci IP-datagramu.

Fragmentace zvyšuje režii, proto je cílem vytvářet segmenty takové velikosti, aby fragmentace nebyla nutná.

TCP segmentace a IP fragmentace

TCP segmentace a fragmentace

TCP segment

Při odesílání paketů pomocí TCP/IP, je datový podíl každého IP paketu formátován jako TCP segment.

TCP segment

TCP segment2

Každý TCP segment obsahuje záhlaví a data. TCP záhlaví obsahuje mnohem více polí než UDP záhlaví a v závislosti na velikosti pole možností může dosahovat velikosti od ‍20 do 60 bajtů.

TCP záhlaví sdílí některá pole se záhlavím UDP: číslo zdrojového portu, číslo cílového portu a kontrolní součet.

Navázání a ukončení spojení protokolem TCP

Protokol TCP využívá k transportu dat protokol IP, nad tímto protokolem zřizuje spojovanou službu. Musí řešit problémy:

  • navazování spojení

  • ukončení spojení

  • potvrzování přijatých dat

  • vyžádání ztracených dat

  • problémy průchodnosti přenosové cesty

Popis TCP segmentu je jen malé část popisu TCP protokolu. Podstatně rozsáhlejší částí je popis výměny TCP segmentů - handshaking - mezi oběma konci spojení

Navazování spojení

Protokol TCP umožňuje jedné straně navazovat spojení, druhá strana spojení buď akceptuje nebo odmítne. Z hlediska aplikační vrstvy:

  • server - strana, která spojení očekává

  • klient - strana, která spojení navazuje

Nejběžnější aplikační model je klient/server. Protokol TCP umožňuje i to, že by spojení navazovaly obě strany současně.

Příklad:

  • klient si přeje navázat spojení se serverem bežícím na počítači server na portu 4433 (server:4433)

  • klient pro spojení používá port 1458

  • port serveru musí být všeobecně znám - klienti o něm musí vědět

  • klientovi je zpravidla přidělen nějaký volný port operačním systémem na dobu spojení - OS přiděluje tímto způsobem portu větší než 1024 (klientské, neprivilegované porty)

  • porty menší než 1024 - privilegované porty, může je použít pouze privilegovaný uživatel (UNIX - root)

  • servery používají všeobecně známá čísla portů - přiděluje organizace IANA tvůrcům serverů

Proces navázání spojení

Navazování spojení

tcp spojeni

  • klient vygeneruje náhodné číslo, které použije jako startovací pořadové číslo odesílaného bajtu (ISN)

  • ISN = 145165778

  • vytvoření startovacího pořadového čísla odesílaného bajtu označí v TCP segmentu nastavením příznaku SYN (…​.S.)

  • v žádném dalším segmentu tohoto spojení nemůže klient nastavit příznak SYN

  • segment (1) je prvním segmentem TCP - nemůže potvrzovat žádná přijatá data

  • pole pořadové číslo bajtu nemá platný význam - binární nuly

  • nemůže být u tohoto segmentu nastaven příznak ACK

  • kombinace nastaveného příznaku SYN a nenastaveného ACK je specifická pro první TCP segment spojení - žádost o spojení

  • součástí segmentů (1) a (2) byla volitelná položka záhlaví - MSS (Maximum segment size)

  • položka oznamuje druhé straně max. délku datové části TCP segmentu jakou si přeje přijímat (aby se zamezilo fragmentaci IP-datagramů)

  • volba MSS se může vyskytovat pouze v TCP segmentech s nastaveným SYN (první dva segmenty)

  • implicitně je MSS = 536 bajtů (použitelné pro spojení mimo lokální síť - WAN)

  • pro Ethernet II je max. délka datové části rámce = 1500 (1500 - 20 pro IP-záhlaví - 20 pro TCP záhlaví = 1460)

  • segment (2) již potvrzuje přijatí data - nastaven příznak ACK

  • od segmentu (2) budou již všechny segmenty potvrzovat přijatá data - bude nastaven příznak ACK

  • segment (3) také potvrzuje příznak SYN

  • segment (3) a další již nemohou nést volitelnou položku záhlaví MSS

  • segmentem (3) končí navazovaní spojení

  • protokol TCP potřebuje pro navázání spojení třífázový handshaking

  • segment (4) - od klienta k serveru, po obdržení ACK od druhé strany je možné začít s vysíláním dat

  • jedná se o duplexní spoj

  • segment, který nese aplikační data má nastaven příznak PSH

  • segment s nastaveným ACK a PSH (.AP…​) - nese aplikační data a potvrzuje příjem dat od druhé strany

  • segment s pouze ACK (.A…​.) pouze potvrzuje příjem dat (asi momentálně nemá co poslat, ale musí potvrzovat příjem)

Stavy při navazování spojení

tcp navazovani stavy

Odmítnutí spojení

Spojení se odmítá nastavením příznaku RST (Reset) v záhlaví segmentu TCP. Spojení je odmítáno v zásadě ve dvou případech:

  • Klient požaduje spojení na portu, na kterém neběží žádný server.

  • Je odmítnuto pokračovat v již navázaném spojení. Možno rozlišit dva případy:

    • Aplikace si po odeslání ukončit spojení rychle (nechce dlouho vyčkávaly ve stavu TIME_WAIT). Proto použije odmítnutí spojení.

    • Jedna ze dvou stran zjistí, že protějšek je nedůvěryhodný, pak okamžitě ukončí spojení. Např, při použití protokolu SSL. Protokol SSL zabezpečuje bezpečnou komunikaci (šifrovanou a autentizovanou). Pokud se nedokáže jedna strana autentizovat nebo neumí použít silné kryptografické algoritmy, jak vyžaduje druhá strana, tak je spojení okamžitě ukončeno nastavením příznaku RST.

Ukončování spojení

Spojení zpravidla zahajuje klient (v architektuře klient/server), ukončit spojení může libovolná strana.

Spojení ukončuje TCP segment s příznakem FIN. Provádí tzv. aktivní ukončení spojení (active close). Druhá strana je nucena provést tzv. pasivní ukončení (pasive close).

Postup při ukončování spojení:

Ukončování spojení

tcp uzavirani

  • segment (6) aktivuje uzavření spojení nastavením FIN

  • segment (7) potvrzuje uzavření spojení - zahájeno polouzavřené spojení - half duplex

  • strana, která aktivně spojení uzavřela, již nemůže poslat data

  • většinou segment (7) obsahuje také příznak FIN a spojení uzavře i druhá strana

  • ale - strana, která zatím neposlala FIN, může v přenosu dat pokračovat (half duplex) - polouzavřené spojení

  • segmentem (8) uzavírá spojení i druhá strana (.A…​F)

  • segment (9) potvrzuje uzavření spojení (.A…​.)

Stavy při ukončování spojení

tcp uzavirani stavy

  • FIN_WAIT1 - strana zjistila, že již vše odeslala, a oznámí to příznakem FIN (obdoba konce souboru EOF) - signalizuje aktivní uzavření spojení

  • CLOSE_WAIT - druhá strana obdržela aktivní uzavření spojení a nezbývá nic jiného než toto potvrdit (segment (7)) - přechod do pasivního uzavření spojení

  • FIN_WAIT2 - stav po obdržení potvrzení segmentem (7) od protějšku. Strana teď čeká na aktivní ukončení od druhé strany

  • LAST_ACK - druhá strana odeslala všechna data a signalizuje ukončení spojení segmentem (8)

  • TIME_WAIT - všechna data byla již oběma směry předána. Je nutné pouze potvrdit úplné uzavření spojení. Odeslání (9) je potvrzeno úplné ukončení spojení. Tento segment již není potvrzován.

  • CLOSED - druhá strana obdržela potvrzení úplného uzavření spojení a přechází do stavu CLOSED. Strana, která odeslala (9) přechází do stavu CLOSED po uplynutí určitého intervalu (cca 30s)

Ukončení spojení je čtyřfázové.

Protokol UDP

Protokol UDP je jednoduchou alternativou protokolu TCP. Protokol je nespojovaná služba (rozdíl oproti protokolu TCP) - nenavazuje spojení. Odesílatel odešle UDP datagram příjemci a už se nestará o to, Zda se náhodou datagram cestou neztratil (o to se případně musí postarat aplikační protokol). UPD datagramy jsou baleny do IP datagramu:

UDP datagram

UDP datagram

Záhlaví UDP protokolu je velice jednoduché. Obsahuje čísla zdrojového a cílového portu - to je zcela analogické protokolu TCP. UDP má svoji nezávislou sadu čísel portů.

Pole délka dat obsahuje délku UDP datagramu (záhlaví + data). Výpočet kontrolního součtu je v protokolu UDP nepovinné.

Oběžníky

Adresátem UDP datagramu nemusí být pouze jednoznačná IP adresa, tedy konkrétní síťové rozhraní počítače, ale i skupina stanic — adresovat lze i oběžník.

Adresovat lze všeobecné oběžníky — broadcast, ale i adresné oběžníky — multicast.