Zkratka proTransmission Control ProtocolPokročilý
Definice
TCP je transportní protokol internetu, který nad IP vytváří spolehlivý, uspořádaný a obousměrný proud bajtů mezi dvěma koncovými body. Aplikacím poskytuje spojení, porty, potvrzování doručení, řízení toku a reakci na zahlcení sítě. Používají ho například HTTP/1.1, HTTP/2, SSH, SMTP a mnoho databázových klientů.
Proč TCP existuje mezi IP a aplikací
TCP sedí nad protokolem IP a pod aplikačními protokoly. IP umí doručovat jednotlivé datagramy, ale neřeší, zda dorazí, v jakém pořadí ani zda se neztratí při zahlcení. TCP z těchto nespolehlivých datagramů skládá proud bajtů, se kterým může aplikace pracovat podobně jako se souborem nebo rourou.
Koncové body TCP spojení tvoří dvojice IP adres a portů. Port rozlišuje konkrétní proces nebo službu na stejném stroji: například webový server, SSH démon a databázový server mohou běžet vedle sebe na jedné IP adrese. Operační systém obvykle drží stav spojení v jádře a aplikace s ním pracuje přes socketové API.
Navázání spojení a domluva parametrů
Před přenosem dat proběhne výměna segmentů známá jako třícestný handshake. Klient navrhne počáteční sekvenční číslo, server odpoví vlastním číslem a potvrzením, klient potvrzení dokončí. Spojení tím získá sdílený stav: obě strany vědí, jaká čísla bajtů očekávají a jaké volby spojení platí.
Ukončení spojení je také řízené. Strana, která už nechce posílat další bajty, pošle FIN, druhá strana může ještě chvíli posílat vlastní data a nakonec zavře svůj směr. Reset RST naopak znamená tvrdé přerušení, typicky při chybě, odmítnutém portu nebo zahozeném stavu v síťovém zařízení.
Pořadí, potvrzení a okno příjemce
Každý bajt v TCP proudu má logickou pozici. Příjemce potvrzuje, kam až spojitý proud přijal, a odesílatel podle potvrzení pozná ztracená nebo zpožděná data. Segmenty mohou v síti dorazit mimo pořadí, ale aplikace dostane uspořádaný proud, pokud se spojení úspěšně zotaví.
Řízení toku chrání příjemce před zahlcením. Příjemce oznamuje velikost okna, tedy kolik dalších dat dokáže přijmout bez přetečení bufferů. Odesílatel zároveň reaguje na chování sítě pomocí řízení zahlcení. Přesný algoritmus se může lišit podle operačního systému, principem je ale opatrně zvyšovat tempo a po známkách ztrát nebo zpoždění zpomalit.
Co TCP stojí oproti jednoduššímu UDP
Spolehlivost TCP není zdarma. Handshake přidává zpoždění před prvním bajtem aplikačních dat, potvrzení a opakované přenosy přidávají režii a uspořádání proudu může zdržet novější data za jedním ztraceným segmentem. Pro webové stránky, terminálové relace nebo databázové dotazy je tato vlastnost často výhodná, protože aplikace nemusí opravovat běžné ztráty sama.
UDP dává aplikaci větší kontrolu nad časováním a hranicemi zpráv. TCP naopak zprávy neuchovává: zápis dvou aplikačních zpráv může dorazit jako jeden čtený blok nebo naopak po částech. Protokol nad TCP proto musí definovat délku zprávy, oddělovač nebo vlastní rámcování. TLS, HTTP/2 i mnoho databázových protokolů tuto vrstvu rámcování řeší explicitně.
Příklady z praxe
Načtení webové stránky
Prohlížeč při otevření stránky přes HTTPS nejprve naváže TCP spojení se serverem na cílovém portu. Nad tímto spojením proběhne TLS a teprve potom HTTP požadavek. Pokud se cestou ztratí segment s částí odpovědi, TCP ho znovu vyžádá a prohlížeč dostane souvislý proud dat.
Čtení z TCP socketu
Python otevře TCP spojení na webový server, pošle jednoduchý HTTP požadavek a přečte prvních 200 bajtů odpovědi. Funkce sendall řeší opakované zápisy do socketu, ale kód pořád musí počítat s tím, že recv může vrátit jen část aplikační zprávy. Praktický klient by proto četl ve smyčce a odpověď parsoval podle pravidel HTTP.
import socket with socket.create_connection(("example.com", 80), timeout=5) as s: s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n") print(s.recv(200))
Časté omyly
- MýtusTCP je bezpečný, protože garantuje doručení.
- Ve skutečnostiTCP nešifruje obsah, neověřuje identitu protistrany a samo nechrání před odposlechem. Důvěrnost a autentizaci nad TCP typicky poskytuje TLS nebo jiná bezpečnostní vrstva.
- MýtusTCP posílá celé zprávy přesně tak, jak je zapíšu do socketu.
- Ve skutečnostiTCP předává aplikaci uspořádaný proud bajtů, nikoli zachované hranice jednotlivých zápisů. Aplikační protokol musí sám poznat, kde zpráva začíná a končí.
Časté dotazy
- Proč TCP nezachovává hranice zpráv z aplikace?
- TCP pracuje s proudem bajtů, ne s jednotlivými zprávami aplikace. Volání send může operační systém rozdělit do více segmentů nebo spojit s dalšími zápisy podle bufferů, maximální velikosti segmentu a časování. Aplikační protokol proto musí mít vlastní rámcování, například délkové pole, oddělovač řádků nebo binární hlavičku s typem a délkou zprávy.
- Může TCP zaručit, že data vždy dorazí?
- TCP zaručuje doručení pouze v rámci živého spojení, fungujících koncových strojů a dostupné sítě. Při výpadku napájení, dlouhém přerušení trasy nebo ukončení procesu spojení selže a aplikace dostane chybu nebo timeout. Spolehlivá aplikace proto stále řeší opakování operace, idempotenci a obnovu stavu po pádu.
- Kdy může TCP brzdit interaktivní nebo streamovací aplikaci?
- TCP může brzdit aplikaci, která raději zahodí stará data, než aby čekala na jejich opravu. Ztracený segment dokáže pozdržet předání pozdějších bajtů aplikaci, protože TCP zachovává pořadí proudu. Hry, hlasové hovory a některé streamy proto často sahají po UDP nebo po protokolech postavených nad UDP, kde aplikace řídí ztráty sama.
- Co znamená port u TCP spojení?
- TCP port je číslo, které spolu s IP adresou určuje konkrétní koncový bod komunikace. Server obvykle poslouchá na známém portu, například webová služba na portu pro HTTP nebo HTTPS, zatímco klient dostane dočasný lokální port. Jedno spojení se identifikuje kombinací zdrojové adresy, zdrojového portu, cílové adresy a cílového portu.
Zdroje
- Transmission Control Protocol (TCP)(otevře se v novém okně)
- Requirements for Internet Hosts - Communication Layers(otevře se v novém okně)
- User Datagram Protocol(otevře se v novém okně)
- Service Name and Transport Protocol Port Number Registry(otevře se v novém okně)