TCP protokol
Transmission Control Protocol (TCP) je nejpoužívanějším protokolem transportní vrstvy v sadě protokolů TCP/IP používaných v síti Internet. Použitím TCP mohou aplikace na počítačích propojených do sítě vytvořit mezi sebou spojení, přes které mohou obousměrně přenášet data. Protokol garantuje spolehlivé doručování a doručování ve správném pořadí. TCP také umožňuje rozlišovat a rozdělovat data pro více aplikací (například webový server a emailový server) běžících na stejném počítači.
TCP využívá mnoho populárních aplikačních protokolů a aplikací na internetu, včetně WWW, e-mailu a SSH.
Technický přehled
TCP je spojově orientovaný protokol pro přenos toku bajtů
na transportní vrstvě se spolehlivým doručováním. V současnosti je zdokumentován
v IETF RFC 793.
V sadě protokolů Internetu je TCP prostřední vrstvou mezi IP protokolem pod ním a aplikací nad ním. Aplikace ke vzájemné komunikaci využívají spolehlivé spojení na způsob roury, zatímco IP protokol neposkytuje takové streamy ale jen nespolehlivé pakety. TCP používá služby protokolu IP; opakovaným odesíláním ztracených nebo poškozených paketů přes nespolehlivou síť zajišťuje spolehlivost a přeuspořádáváním přijatých paketů zajišťuje jejich správné pořadí. Tím TCP plní úlohu transportní vrstvy ve zjednodušeném modelu ISO/OSI počítačové sítě.
Bity 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
28 29 30 31
0 zdrojový port cílový port
32 číslo sekvence
64 potvrzený
bajt
96 offset dat rezervováno příznaky okénko
128 kontrolní součet Urgent
Pointer
160 volby (volitelné)
192 volby (pokračování) výplň (do 32)
224
data
Aplikace posílá proud (stream) bajtů TCP protokolu k doručení sítí, TCP rozděluje proud bajtů do přiměřeně velkých segmentů. (Velikost segmentů je určena parametrem MTU (maximum transmission unit) linkové vrstvy sítě, ke které je počítač připojen.) TCP pak předá takto vzniklé pakety IP protokolu k přepravě internetem do TCP modulu na druhé straně TCP spojení. TCP ověří, že se pakety neztratily tím, že každému paketu přidělil pořadové číslo, které se také použije k ověření, že data byla přijata ve správném pořadí.
TCP modul na straně příjemce posílá zpět potvrzení pro pakety které byly úspěšně přijaty. Pokud by se odesilateli potvrzení nevrátilo do rozumné doby (dané obousměrným zpožděním, anglicky round-trip time, RTT), vypršel by odesilatelův časovač a (pravděpodobně ztracená) data by vyslal znovu.
TCP protokol ověřuje, zda přenesená data nebyla poškozena šumem tím, že před odesláním spočte kontrolní součet, uloží jej do odesílaného paketu a příjemce kontrolní součet vypočte znovu a ověří, že se shodují.
Fungování protokolu v detailu
Zjednodušený stavový diagram TCP.
TCP porty
K rozlišení komunikujících
aplikací používá TCP protokol čísla portů. Každá strana TCP spojení má
přidruženo 16bitové bezznaménkové číslo portu (existuje 65535 portů) přidělené
aplikaci. Porty jsou rozčleněny do třech skupin: dobře známé, registrované a
dynamické/privátní. Seznam dobře známých portů je přiřazován organizací Internet
Assigned Numbers Authority (IANA) a jsou typicky používané systémovými procesy.
Dobře známé aplikace běžící jako servery a pasivně přijímající spojení typicky
používají tyto porty. Několik příkladů: FTP (port 21 a 20), SMTP (port 25), DNS
(port 53) a HTTP (port 80). Registrované porty jsou typicky používané aplikacemi
koncových uživatelů při otevírání spojení k serverům jako libovolná čísla
zdrojových portů, ale také mohou identifikovat služby. Dynamické/privátní porty
mohou být také používány koncovými aplikacemi, ale není to obvyklé.
Navázání a ukončení spojení
Protože TCP je spojovaná transportní služba, musí
se před odesíláním dat navázat spojení mezi klientem a serverem. K tomu slouží
trojcestný handshaking (three-way handshake). V průběhu navazování spojení se
obě strany dohodnou na číslu sekvence a potvrzovacím čísle. Pro navázání spojení
se odesílají datagramy s nastavenými příznaky SYN a ACK.
Jak z názvu vyplývá, navázání spojení probíhá ve třech krocích:
Klient odešle na server datagram s nastaveným příznakem SYN a náhodně
vygenerovaným číslem sekvence (x), potvrzovací číslo=0.
Server odešle
klientovi datagram s nastavenými příznaky SYN a ACK, potvrzovací číslo=x+1,
číslo sekvence je náhodně vygenerované (y)
Klient odešle datagram s
nastaveným příznakem ACK, číslo sekvence=x+1, číslo odpovědi=y+1.
Obě strany
si pamatují číslo sekvence své i protistrany. Používají se totiž i pro další
komunikaci a určují pořadí paketů. Když úspěšně proběhne trojcestný handshaking,
je spojení navázáno a zůstane tak až do ukončení spojení. To se může zneužít na
SYN flood útok.
Ukončení spojení probíhá podobně jako jeho navázání. Používá se k tomu příznaků FIN a ACK:
Klient odešle
datagram s nastaveným příznakem FIN
Server odpoví datagramem s nastaveným
příznakem ACK
Server odešle datagram s nastaveným příznakem FIN
Klient
odpoví s nastaveným příznakem ACK
Teprve po těchto čtyřech krocích je spojení
ukončeno.
Vývoj TCP
Alternativy za TCP
Pro mnoho aplikací není TCP vhodné. Velkým problémem je
(alespoň u normálních implementací), že aplikace po ztrátě jednoho paketu nemůže
dostat následující pakety do té doby, dokud není ztracený paket znovu poslán a
úspěšně přijat. To způsobuje problémy realtimovým aplikacím jako streamovaná
média (např. internetové rádio), realtimové hry pro více hráčů a VoIP, kde je
často užitečnější dostávat data včas, než je dostávat ve správném pořadí a
kompletní.
Složitost TCP může být problém také pro vestavěná zařízení (anglicky embedded systems). Nejlépe známým příkladem je bootování po síti, které obecně používá TFTP (viz PXE). Navíc pro některé triky, jako je přenos dat mezi dvěma uzly, které jsou oba za NATem (použitím STUN nebo podobných protokolů), je mnohem jednodušší, když vám v cestě nestojí složitý protokol jako TCP.
Tam, kde je TCP nevhodné, se často používá UDP, které poskytuje aplikaci kontrolu/ovládání nad multiplexováním a ověřováním kontrolních součtů. Zato ale UDP neprovádí fragmentaci proudu dat do paketů a zpátky jejich rekonstruování, ani opětovné posílání ztracených paketů. To dovoluje vývojáři aplikace napsat si uvedené funkce tak, jak vyhovuje jeho potřebám, nebo je nahradit použitím samoopravných kódů (anglicky forward error correction) nebo interpolace.
SCTP je další IP protokol, který poskytuje spolehlivé, proudově orientované služby nepříliš odlišné od TCP. Je to novější a mnohem složitější protokol než TCP, takže se ještě nedočkal širokého nasazení, ačkoliv je obzvláště navržený k tomu, aby byl používaný v situacích, kdy jsou spolehlivost a téměř real-time ohledy důležité.