Nastavení připojení TCP
Když procházíme web, posíláme e-maily nebo hrajeme online hru, často nemyslíme na složité síťové připojení, které se za tím skrývá. Nicméně právě tyto zdánlivě malé kroky zajišťují stabilní komunikaci mezi námi a serverem. Jedním z nejdůležitějších kroků je nastavení TCP spojení a jádrem toho je třícestný handshake.
Tento článek podrobně probere princip, proces a význam třícestného podání ruky. Krok za krokem vysvětlíme, proč je třícestný handshake potřeba, jak zajišťuje stabilitu a spolehlivost připojení a jak je důležitý pro přenos dat. S hlubším pochopením třícestného handshake získáme lepší porozumění základním mechanismům síťové komunikace a jasnější pohled na spolehlivost TCP spojení.
TCP Třícestný proces handshake a stavové přechody
TCP je spojově orientovaný transportní protokol, který vyžaduje navázání spojení před přenosem dat. Tento proces navázání spojení se provádí třícestným podáním ruky.
Podívejme se blíže na TCP pakety, které jsou odesílány v každém spojení.
Zpočátku jsou klient i server UZAVŘENY. Nejprve server aktivně naslouchá na portu a je ve stavu LISTEN, což znamená, že server musí být spuštěn. Poté je klient připraven začít přistupovat na webovou stránku. Musí navázat spojení se serverem. Formát prvního paketu připojení je následující:
Když klient zahájí spojení, vygeneruje náhodné počáteční pořadové číslo (client_isn) a umístí ho do pole "Číslo sekvence" v hlavičce TCP. Klient zároveň nastaví pozici příznaku SYN na 1, aby označil, že odchozí paket je paket SYN. Klient uvede, že si přeje navázat spojení se serverem odesláním prvního paketu SYN na server. Tento paket neobsahuje data aplikační vrstvy (tj. odeslaná data). V tomto okamžiku je stav klienta označen jako SYN-SENT.
Když server přijme paket SYN od klienta, náhodně inicializuje své vlastní sériové číslo (server_isn) a poté toto číslo vloží do pole "Sériové číslo" v hlavičce TCP. Dále server zadá client_isn + 1 do pole "Číslo potvrzení" a nastaví bity SYN i ACK na 1. Nakonec server odešle paket klientovi, který neobsahuje žádná data na aplikační vrstvě (a žádná data pro server odeslat). V tuto chvíli je server ve stavu SYN-RCVD.
Jakmile klient obdrží paket ze serveru, potřebuje provést následující optimalizace, aby mohl odpovědět na konečný paket odpovědi: Nejprve klient nastaví bit ACK hlavičky TCP paketu odpovědi na 1; Za druhé, klient zadá hodnotu server_isn + 1 do pole "Potvrdit číslo odpovědi"; Nakonec klient odešle paket na server. Tento paket může přenášet data z klienta na server. Po dokončení těchto operací se klient dostane do stavu ESTABLISHED.
Jakmile server obdrží paket odpovědi od klienta, přepne se také do stavu ESTABLISHED.
Jak můžete vidět z výše uvedeného procesu, při provádění třícestného podání může třetí podání přenášet data, ale první dva podání nikoli. To je otázka, která je často kladena v rozhovorech. Jakmile je třícestné navázání spojení dokončeno, obě strany přejdou do stavu ESTABLISHED, což znamená, že spojení bylo úspěšně navázáno, v tomto okamžiku si klient a server mohou začít posílat data.
Proč tři podání rukou? Ne dvakrát, čtyřikrát?
Obvyklá odpověď zní: "Protože třístranné podání ruky zaručuje schopnost přijímat a odesílat." Tato odpověď je správná, ale je to pouze povrchní důvod, neuvádí hlavní důvod. V následujícím textu rozeberu důvody trojitého podání ruky ze tří aspektů, abych prohloubil naše porozumění této problematice.
Třícestný handshake může účinně zabránit inicializaci historicky opakovaných připojení (hlavní důvod)
Třícestný handshake zaručuje, že obě strany obdržely spolehlivé počáteční pořadové číslo.
Třístranné podání ruky zabraňuje plýtvání zdroji.
Důvod 1: Vyhněte se historickým duplicitním spojením
Stručně řečeno, hlavním důvodem třícestného handshake je vyhnout se zmatkům způsobeným inicializací starého duplicitního připojení. Ve složitém síťovém prostředí není přenos datových paketů vždy odeslán do cílového hostitele v souladu se zadaným časem a staré datové pakety mohou dorazit do cílového hostitele jako první z důvodu přetížení sítě a dalších důvodů. Aby se tomu zabránilo, TCP používá k navázání spojení třícestný handshake.
Když klient odešle více paketů pro vytvoření připojení SYN za sebou, v situacích, jako je přetížení sítě, může dojít k následujícímu:
1- Staré pakety SYN dorazí na server dříve, než nejnovější pakety SYN.
2- Server odpoví paketem SYN + ACK klientovi po obdržení starého paketu SYN.
3- Když klient obdrží paket SYN + ACK, určí, že připojení je historické připojení (pořadové číslo vypršelo nebo vypršel časový limit) podle vlastního kontextu a poté odešle paket RST na server, aby spojení přerušil.
Při dvou-handshake spojení neexistuje způsob, jak určit, zda je aktuální spojení historické spojení. Třícestný handshake umožňuje klientovi určit, zda je aktuální připojení historické připojení na základě kontextu, kdy je připraveno odeslat třetí paket:
1- Pokud se jedná o historické spojení (vypršela platnost pořadového čísla nebo vypršel časový limit), paket odeslaný třetím handshake je paket RST pro přerušení historického připojení.
2- Pokud se nejedná o historické spojení, paket odeslaný potřetí je paket ACK a dvě komunikující strany úspěšně navazují spojení.
Proto hlavním důvodem, proč TCP používá třícestný handshake, je to, že inicializuje připojení, aby se zabránilo historickým připojením.
Důvod 2: Synchronizace počátečních pořadových čísel obou stran
Obě strany protokolu TCP musí udržovat pořadové číslo, které je klíčovým faktorem pro zajištění spolehlivého přenosu. Sekvenční čísla hrají důležitou roli v TCP spojení. Dělají následující:
Přijímač může eliminovat duplicitní data a zajistit přesnost dat.
Přijímač může přijímat pakety v pořadí podle pořadového čísla, aby byla zajištěna integrita dat.
● Pořadové číslo může identifikovat datový paket, který byl přijat druhou stranou, a umožňuje tak spolehlivý přenos dat.
Proto po navázání TCP spojení klient odešle SYN pakety s počátečním pořadovým číslem a požaduje, aby server odpověděl ACK paketem indikujícím úspěšné přijetí klientského SYN paketu. Poté server odešle paket SYN s počátečním pořadovým číslem klientovi a čeká, až klient jednou provždy odpoví, aby se zajistila spolehlivá synchronizace počátečních pořadových čísel.
Přestože čtyřstranné podání ruky je možné také spolehlivě synchronizovat počáteční sekvenční čísla obou stran, druhý a třetí krok lze spojit do jediného kroku a výsledkem je třístranné podání ruky. Dva handshake však mohou zaručit pouze to, že počáteční pořadové číslo jedné strany bude úspěšně přijato druhou stranou, ale není zaručeno, že počáteční pořadové číslo obou stran bude možné potvrdit. Proto je třícestný handshake tou nejlepší volbou pro zajištění stability a spolehlivosti TCP spojení.
Důvod 3: Vyhněte se plýtvání zdroji
Pokud dojde pouze k „dvou handshake“, když je klientský požadavek SYN v síti zablokován, klient nemůže přijmout ACK paket odeslaný serverem, takže bude SYN odeslán znovu. Protože však neexistuje žádné třetí handshake, server nemůže určit, zda klient obdržel potvrzení ACK k navázání spojení. Proto může server proaktivně navázat spojení pouze po obdržení každého požadavku SYN. To vede k následujícímu:
Plýtvání zdroji: Pokud je klientův požadavek SYN zablokován, což má za následek opakované vysílání více SYN paketů, server po obdržení požadavku naváže více redundantních neplatných spojení. To vede ke zbytečnému plýtvání zdroji serveru.
Uchovávání zpráv: Kvůli chybějícímu třetímu handshake nemá server žádný způsob, jak zjistit, zda klient správně obdržel potvrzení ACK k navázání spojení. Výsledkem je, že pokud se zprávy zaseknou v síti, klient bude stále znovu a znovu posílat požadavky SYN, což způsobí, že server bude neustále navazovat nová připojení. To zvýší zahlcení sítě a zpoždění a negativně ovlivní celkový výkon sítě.
Proto, aby byla zajištěna stabilita a spolehlivost síťového připojení, TCP používá k navázání spojení třícestný handshake, aby se zabránilo výskytu těchto problémů.
Shrnutí
TheZprostředkovatel síťových paketůNavázání TCP spojení se provádí třícestným podáním ruky. Během třícestného handshake klient nejprve odešle paket s příznakem SYN na server, což znamená, že chce navázat spojení. Po obdržení požadavku od klienta server odpoví klientovi paketem s příznaky SYN a ACK, což značí, že požadavek na připojení je přijat, a odešle své vlastní počáteční pořadové číslo. Nakonec klient odpoví serveru příznakem ACK, což znamená, že připojení bylo úspěšně navázáno. Obě strany jsou tedy ve stavu ESTABLISHED a mohou si začít posílat data.
Obecně je proces třícestného handshake pro navázání TCP spojení navržen tak, aby zajistil stabilitu a spolehlivost spojení, zabránil zmatkům a plýtvání zdroji u historických spojení a zajistil, že obě strany budou schopny přijímat a odesílat data.
Čas odeslání: leden-08-2025