TCP | |
---|---|
název | protokol kontroly přenosu |
Úroveň (podle modelu OSI ) | Doprava |
Rodina | TCP/IP |
Specifikace | RFC 793 (září 1981) / STD 7 |
Hlavní implementace | UNIX , Linux , BSD , Windows |
Rozšiřitelnost | Možnosti |
Mediální soubory na Wikimedia Commons |
Transmission Control Protocol (TCP, přenosový řídící protokol) je jedním z hlavních protokolů přenosu dat na internetu. Navrženo pro řízení přenosu internetových dat . Pakety v TCP se nazývají segmenty .
V zásobníku protokolů plní TCP/IP funkce transportní vrstvy modelu OSI .
Mechanismus TCP poskytuje datový tok přednastavený pro připojení , znovu požaduje data v případě ztráty dat a eliminuje duplikaci při příjmu dvou kopií stejného paketu, čímž zaručuje (na rozdíl od UDP ) integritu přenášených dat a informuje odesílatele o výsledky přenosu.
Implementace TCP jsou obvykle zabudovány do jader OS . Existují implementace TCP, které běží v uživatelském prostoru .
Při přenosu z počítače do počítače přes internet funguje TCP na nejvyšší úrovni mezi dvěma koncovými systémy, jako je prohlížeč a webový server. TCP provádí spolehlivý přenos proudu bajtů z jednoho procesu do druhého.
Bit | 0:3 | 4-6 | 7-15 | 16-31 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Zdrojový port | Cílový přístav | ||||||||||||||||||||||||||||||
32 | pořadové číslo (SN) | |||||||||||||||||||||||||||||||
64 | Číslo potvrzení (ACK SN ) | |||||||||||||||||||||||||||||||
96 | Délka záhlaví, ( Posun dat ) | Rezervováno | Vlajky | Velikost okna | ||||||||||||||||||||||||||||
128 | Kontrolní součet, kontrolní součet | Ukazatel důležitosti, naléhavý bod | ||||||||||||||||||||||||||||||
160 | Možnosti (volitelné, ale téměř vždy používané) | |||||||||||||||||||||||||||||||
160/192+ | Data |
Tato 16bitová pole obsahují čísla portů – čísla, která jsou určena speciálním seznamem .
Zdrojový port identifikuje klientskou aplikaci, ze které jsou pakety odesílány. Na základě tohoto čísla jsou klientovi zaslána data odpovědi.
Cílový port identifikuje port, na který byl paket odeslán.
Pořadové číslo (32 bitů) – měřeno v bajtech a každý přenesený bajt užitečného zatížení (užitného zatížení) zvyšuje tuto hodnotu o 1.
Pokud je nastaven příznak SYN (sestavuje se relace), pak pole obsahuje počáteční pořadové číslo - ISN (Initial Sequence Number). Z bezpečnostních důvodů je tato hodnota generována náhodně a může být mezi 0 a 2 32 −1 (4294967295). První byte užitečného zatížení v navazované relaci bude ISN+1.
Jinak, pokud není nastaveno SYN, první datový bajt přenesený v tomto paketu má toto pořadové číslo.
Protože tok TCP může být obecně delší než počet různých stavů tohoto pole, musí být všechny operace s pořadovým číslem provedeny modulo 2 32 . To představuje praktický limit pro použití TCP. Pokud je přenosová rychlost komunikačního systému taková, že během MSL (Maximum Segment Lifetime) dojde k přetečení pořadového čísla, pak se v síti mohou objevit dva segmenty se stejným číslem, které patří do různých částí toku, a přijímač obdrží nesprávná data.
Acknowledgement Number (ACK SN) (32 bitů) - Pokud je nastaven příznak ACK, pak toto pole obsahuje pořadové číslo oktetu, který si odesílatel tohoto segmentu přeje přijmout. To znamená, že všechny předchozí oktety ( od ISN+1 do ACK-1 včetně) byly úspěšně přijaty.
Každá strana vypočítá své vlastní pořadové číslo pro přenášená data a samostatné číslo potvrzení pro přijatá data. Pořadové číslo každé strany odpovídá číslu potvrzení druhé strany.
Délka hlavičky (Data offset) je 4 bity a udává hodnotu délky hlavičky měřenou ve 32bitových slovech . Minimální velikost je 20 bajtů (pět 32bitových slov ) a maximální 60 bajtů (patnáct 32bitových slov ). Délka hlavičky určuje posun užitečného zatížení od začátku segmentu. Například datový offset 1111 2 označuje, že záhlaví je patnáct 32bitových slov (15 řádků * 32 bitů na řádek / 8 bitů = 60 bajtů).
Rezervováno (3 bity) pro budoucí použití a musí být nastaveno na nulu.
Toto pole obsahuje 9bitové příznaky:
Window Size nezávisle určuje počet bajtů dat ( payload ), po jejichž odeslání odesílatel očekává potvrzení od příjemce, že data byla přijata. Jinými slovy, přijímač paketu má vyrovnávací paměť o délce bajtů "velikost okna" pro příjem dat.
Ve výchozím nastavení se velikost okna měří v bajtech, takže je omezena na 2 16 (65535) bajtů. Díky možnosti měřítka TCP Window však lze tuto velikost zvětšit až na 1 GB. Aby byla tato možnost povolena, musí se na tom obě strany dohodnout ve svých SYN segmentech.
Pole kontrolního součtu je 16bitový doplněk součtu všech 16bitových slov záhlaví (včetně pseudozáhlaví) a dat. Pokud má segment, na kterém se vypočítává kontrolní součet, délku, která není násobkem 16 bitů, pak se délka segmentu zvětší na násobek 16 přidáním nulových výplňových bitů k němu vpravo. Výplňové bity (0) se ve zprávě neposílají a používají se pouze k výpočtu kontrolního součtu. Při výpočtu kontrolního součtu se předpokládá, že hodnota samotného pole kontrolního součtu je 0.
16bitová hodnota kladného posunu od pořadového čísla v tomto segmentu. Toto pole udává pořadové číslo oktetu, který ukončuje urgentní data. Pole se bere v úvahu pouze u paketů s nastaveným příznakem URG. Používá se pro data mimo pásmo .
V některých případech může být použit k rozšíření protokolu. Někdy se používá pro testování. V současné době možnosti téměř vždy zahrnují 2 bajty NOP (v tomto případě 0x01) a 10 bajtů určujících časová razítka . Délku pole možností můžete vypočítat pomocí hodnoty pole posunu.
Na rozdíl od tradiční alternativy UDP, která může začít vysílat pakety okamžitě, TCP vytváří spojení, která musí být vytvořena před přenosem dat. TCP spojení lze rozdělit do 3 fází:
Stavy relace TCP | |
---|---|
ZAVŘENO | Počáteční stav uzlu. Vlastně fiktivní |
POSLOUCHAT | Server čeká na požadavky klienta na připojení |
SYN-ODESLANO | Klient odeslal serveru požadavek na navázání spojení a čeká na odpověď |
SYN PŘIJAT | Server přijal požadavek na připojení, odeslal požadavek na odpověď a čeká na potvrzení |
ZALOŽENO | Připojení navázáno, přenos dat probíhá |
FIN-WAIT-1 | Jedna ze stran (říkejme tomu uzel-1) ukončí spojení odesláním segmentu s příznakem FIN |
ZAVŘÍT-ČEKAT | Druhá strana (uzel-2) vstoupí do tohoto stavu odesláním ACK segmentu a pokračuje v jednosměrném přenosu |
FIN-WAIT-2 | Uzel-1 přijme ACK, pokračuje ve čtení a čeká na segment s příznakem FIN. |
LAST-ACK | Uzel-2 ukončí přenos a odešle segment s příznakem FIN |
ČAS-ČEKÁNÍ | Uzel-1 přijal segment s příznakem FIN, odeslal segment s příznakem ACK a čeká 2*MSL sekundy, než definitivně uzavře spojení. |
ZAVÍRÁNÍ | Obě strany zahájily spojení ve stejnou dobu: po odeslání segmentu s příznakem FIN přijme uzel-1 také segment FIN, odešle ACK a čeká na segment ACK (potvrzení jeho požadavku na odpojení) |
Proces zahájení relace TCP (také nazývané handshake ) se skládá ze tří kroků.
1. Klient, který hodlá navázat spojení, odešle na server segment s pořadovým číslem a příznakem SYN.
2. Pokud klient obdrží segment s příznakem SYN, pak si pamatuje pořadové číslo a odešle segment s příznakem ACK.
3. Pokud server ve stavu SYN-RECEIVED přijme segment s příznakem ACK, přejde do stavu ESTABLISHED.
Proces se nazývá „třícestný handshake“ (anglicky three way handshake ), protože i přes to, že proces navázání spojení pomocí čtyř segmentů je možný (SYN směrem k serveru, ACK směrem ke klientovi, SYN směrem k klient, ACK směrem k serveru), v praxi se pro úsporu času používají tři segmenty.
Příklad základního vyjednávání ve 3 krocích:
TCP A TCP B 1. UZAVŘENÝ POSLECH 2. SYN-ODESLANÁ --> <SEQ=100><CTL=SYN> --> SYN-PŘIJAT 3. ZALOŽENO <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED 4. ZALOŽENO --> <SEQ=101><ACK=301><CTL=ACK> --> ZALOŽENO 5. ZALOŽENO <-- <SEQ=301><ACK=101><CTL=ACK> <-- ZALOŽENONa řádku 2 začne TCP A odesílat segment SYN indikující použití pořadových čísel začínajících na 100;
Na řádku 3 posílá TCP B SYN a potvrzení přijatého SYN do TCP A. Pole potvrzení ukazuje TCP B čekající na pořadové číslo 101, který potvrzuje SYN číslo 100;
Na řádku 4 TCP A odpoví prázdným segmentem s ACK pro segment SYN z TCP B;
Na řádku 5 odesílá TCP B nějaká data. Všimněte si, že číslo potvrzení segmentu na řádku 5 (ACK=101) je stejné jako pořadové číslo na řádku 4 (SEQ=101), protože ACK nezabírá místo pro pořadové číslo (pokud to uděláte, budete muset potvrdit potvrzení - ACK pro ACK).
Existují experimentální rozšíření protokolu TCP, která snižují počet paketů při navazování spojení, jako je TCP Fast Open . Dříve existovalo také rozšíření T/TCP . Pro transparentní šifrování dat se navrhuje použít rozšíření tcpcrypt .
Při výměně dat přijímač použije pořadové číslo obsažené v přijatých segmentech k obnovení jejich původního pořadí. Přijímač oznámí vysílající straně pořadové číslo, do kterého úspěšně přijal data, tím, že je zařadí do pole čísla potvrzení. Všechna přijatá data, která jsou v rozsahu potvrzených sekvencí, jsou ignorována. Pokud přijatý segment obsahuje pořadové číslo větší, než se očekávalo, pak se data ze segmentu uloží do vyrovnávací paměti, ale potvrzené pořadové číslo se nezmění. Pokud je následně přijat segment odpovídající očekávanému pořadovému číslu, pořadí dat bude automaticky změněno na základě pořadových čísel v segmentech.
Aby bylo zajištěno, že vysílací strana neposílá data intenzivněji, než může přijímač zpracovat, obsahuje TCP zařízení pro řízení toku. K tomu slouží pole "okno". V segmentech odesílaných z přijímače na vysílací stranu udává pole "okno" aktuální velikost přijímací vyrovnávací paměti. Vysílací strana zachovává velikost okna a neodesílá více dat, než zadává přijímač. Pokud přijímač zadal velikost okna nula, pak se ve směru tohoto uzlu neodesílají žádná data, dokud přijímač neoznámí větší velikost okna.
V některých případech může odesílající aplikace výslovně požadovat, aby byla data odeslána až do určité sekvence přijímající aplikaci, aniž by je ukládala do vyrovnávací paměti. K tomu slouží příznak PSH. Pokud je v přijatém segmentu nalezen příznak PSH, pak implementace TCP vrátí všechna aktuálně uložená data přijímající aplikaci. "Push" se používá například v interaktivních aplikacích. V síťových terminálech nemá smysl čekat na vstup uživatele poté, co dokončí zadávání příkazu. Proto musí poslední segment obsahující příkaz obsahovat příznak PSH, aby jej aplikace na přijímací straně mohla začít provádět.
Ukončení připojení lze zvážit ve třech krocích:
TCP vyžaduje explicitní maximální velikost segmentu ( MSS ), pokud je virtuální připojení vytvořeno přes segment sítě, kde je maximální velikost jednotky ( MTU ) menší než standardní ethernetová MTU (1500 bajtů).
V protokolech tunelování, jako jsou GRE , IPIP a PPPoE , je MTU tunelu menší než standardní, takže maximální velikost segmentu TCP má délku paketu větší než MTU. To vede k fragmentaci a snížení přenosové rychlosti užitečných dat. Pokud je fragmentace na libovolném uzlu zakázána, pak to z pohledu uživatele vypadá jako „zamrznutí“ připojení. V tomto případě může dojít k "zablokování" v libovolných časech, konkrétně když odesílatel použil segmenty delší, než je povolená velikost. K vyřešení tohoto problému používají směrovače pravidla brány firewall, která přidávají parametr MSS ke všem paketům, které iniciují připojení, takže odesílatel používá segmenty platné velikosti.
MSS lze také ovládat nastavením operačního systému.
Ačkoli protokol provádí kontrolu kontrolního součtu na každém segmentu, použitý algoritmus je považován za slabý [1] .
Obecně se distribuovaným síťovým aplikacím doporučuje používat další software k zajištění integrity přenášených informací [2] .
Nedostatky protokolu se projevují úspěšnými teoretickými i praktickými útoky, kdy útočník může získat přístup k přenášeným datům, vydávat se za druhou stranu nebo uvést systém do nefunkčního stavu.
TCP hlavička neobsahuje informace o adrese odesílatele a příjemce, takže i když se port příjemce shoduje, nelze s jistotou říci, že zpráva dorazila na správné místo. Protože účelem protokolu TCP je spolehlivé doručování zpráv, má tento bod zásadní význam. Tento problém lze vyřešit různými způsoby. Nejviditelnější je přidání informace o cílové adrese do TCP hlavičky, ale to za prvé vede k duplikaci informací, což snižuje podíl užitečných informací přenášených segmentem TCP, a za druhé porušuje princip zapouzdření OSI model. Proto vývojáři protokolu šli jinou cestou a použili další pseudozáhlaví:
Pseudo hlavička IPv4 TCP
bitů | 0 | jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct | 16 | 17 | osmnáct | 19 | dvacet | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | třicet | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0-31 | IP adresa odesílatele (zdrojová adresa) | |||||||||||||||||||||||||||||||
32-63 | Cílová IP adresa | |||||||||||||||||||||||||||||||
64-95 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Protokol | Délka segmentu TCP (délka TCP) |
Pseudo hlavička IPv6 TCP
bitů | 0 | jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct | 16 | 17 | osmnáct | 19 | dvacet | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | třicet | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0-95 | IP adresa odesílatele (zdrojová adresa) | |||||||||||||||||||||||||||||||
128-223 | Cílová IP adresa | |||||||||||||||||||||||||||||||
224-255 | Délka segmentu TCP (délka TCP) | |||||||||||||||||||||||||||||||
256-287 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Protokol vyšší úrovně (Další záhlaví) |
Pseudohlavička není součástí segmentu TCP. Používá se k výpočtu kontrolního součtu před odesláním zprávy a po jejím přijetí (příjemce sestaví vlastní pseudozáhlaví pomocí adresy hostitele, ze kterého zpráva přišla, a své vlastní adresy a poté vypočítá kontrolní součet).
Mnoho implementací zásobníku TCP/IP poskytuje možnost využít hardwarovou podporu k automatickému výpočtu kontrolního součtu v síťovém adaptéru před přenosem do sítě nebo po přijetí ze sítě pro ověření. To může operační systém zbavit plýtvání cennými cykly procesoru při výpočtu kontrolního součtu.
Tato funkce může způsobit , že analyzátory provozu , které zachycují odchozí pakety před jejich odesláním do síťového adaptéru a nevědí o delegování výpočtu kontrolního součtu na síťový adaptér, mohou hlásit chybu kontrolního součtu v odchozích paketech.
protokoly TCP /IP podle vrstev modelu OSI | Základní|
---|---|
Fyzický | |
odvedeny | |
síť | |
Doprava | |
zasedání | |
Zastoupení | |
Aplikovaný | |
Uplatněno jiné | |
Seznam portů TCP a UDP |
![]() |
---|