TCP kapcsolat beállítása
Amikor böngészünk a weben, e-mailt küldünk, vagy online játékot játszunk, gyakran nem gondolunk a mögötte rejlő összetett hálózati kapcsolatra. Pedig ezek a látszólag apró lépések biztosítják a stabil kommunikációt köztünk és a szerver között. Az egyik legfontosabb lépés a TCP-kapcsolat beállítása, amelynek a lényege a háromirányú kézfogás.
Ez a cikk részletesen tárgyalja a háromirányú kézfogás elvét, folyamatát és fontosságát. Lépésről lépésre elmagyarázzuk, miért van szükség a háromirányú kézfogásra, hogyan biztosítja a kapcsolat stabilitását és megbízhatóságát, és mennyire fontos az adatátvitel szempontjából. A háromirányú kézfogás mélyebb megértésével jobban megértjük a hálózati kommunikáció mögöttes mechanizmusait, és tisztább képet kapunk a TCP-kapcsolatok megbízhatóságáról.
TCP háromirányú kézfogási folyamat és állapotátmenetek
A TCP egy kapcsolat-orientált átviteli protokoll, amely az adatátvitel előtt kapcsolatépítést igényel. Ez a kapcsolatlétesítési folyamat egy háromirányú kézfogással történik.
Nézzük meg közelebbről az egyes kapcsolatokban elküldött TCP csomagokat.
Kezdetben mind a kliens, mind a szerver ZÁRVA van. Először a szerver aktívan figyel egy porton, és VÉLELŐ állapotban van, ami azt jelenti, hogy a szervert el kell indítani. Ezután a kliens készen áll a weboldal elérésére. Kapcsolatot kell létesítenie a szerverrel. Az első kapcsolati csomag formátuma a következő:
Amikor egy kliens kapcsolatot kezdeményez, generál egy véletlenszerű kezdeti sorszámot (client_isn), és elhelyezi azt a TCP fejléc „Sorszám” mezőjében. Ezzel egyidejűleg a kliens a SYN jelző pozícióját 1-re állítja, jelezve, hogy a kimenő csomag egy SYN csomag. A kliens az első SYN csomag szervernek történő elküldésével jelzi, hogy kapcsolatot kíván létesíteni a szerverrel. Ez a csomag nem tartalmaz alkalmazásrétegbeli adatokat (azaz elküldött adatokat). Ezen a ponton a kliens állapota SYN-SENT jelzéssel van ellátva.
Amikor egy szerver SYN csomagot kap egy klienstől, véletlenszerűen inicializálja a saját sorozatszámát (server_isn), majd ezt a számot beírja a TCP fejléc „Sorozatszám” mezőjébe. Ezután a szerver beírja a client_isn + 1 értéket az „Acknowledgement number” mezőbe, és mind a SYN, mind az ACK biteket 1-re állítja. Végül a szerver elküldi a csomagot a kliensnek, amely nem tartalmaz alkalmazásrétegbeli adatokat (és a szerver számára küldendő adatokat sem). Ekkor a szerver SYN-RCVD állapotban van.
Miután a kliens megkapja a csomagot a szervertől, a következő optimalizálásokat kell végrehajtania a végső válaszcsomagra való válaszadáshoz: Először is, a kliens a válaszcsomag TCP fejlécének ACK bitjét 1-re állítja; Másodszor, a kliens beírja a server_isn + 1 értéket a "Válaszszám megerősítése" mezőbe; Végül a kliens elküldi a csomagot a szervernek. Ez a csomag adatokat szállíthat a klienstől a szerver felé. Ezen műveletek befejezése után a kliens ESTABLISHED állapotba kerül.
Miután a szerver megkapja a válaszcsomagot a klienstől, ő is LÉTREHOZOTT állapotba vált.
Amint a fenti folyamatból látható, háromirányú kézfogás végrehajtásakor a harmadik kézfogás továbbíthat adatokat, de az első két kézfogás nem. Ez egy olyan kérdés, amelyet gyakran feltesznek az interjúk során. Miután a háromirányú kézfogás befejeződött, mindkét fél LÉTREHOZOTT állapotba kerül, jelezve, hogy a kapcsolat sikeresen létrejött, ekkor a kliens és a szerver megkezdheti az adatok küldését egymásnak.
Miért három kézfogás? Nem kétszer, hanem négyszer?
A gyakori válasz: „Mert a háromoldalú kézfogás garantálja a vétel és küldés képességét.” Ez a válasz helyes, de ez csak a felszínes ok, nem a fő okot helyezi előtérbe. A következőkben három szempontból elemzem a háromoldalú kézfogás okait, hogy elmélyítsem a probléma megértését.
A háromirányú kézfogás hatékonyan elkerülheti a történelmileg ismétlődő kapcsolatok inicializálását (ez a fő ok).
A háromoldalú kézfogás garantálja, hogy mindkét fél megbízható kezdeti sorszámot kapott.
A háromoldalú kézfogás elkerüli az erőforrások pazarlását.
1. ok: Kerülje a korábbi ismétlődő illesztéseket
Dióhéjban a háromutas kézfogás fő célja a régi, ismétlődő kapcsolatinicializálás okozta zavar elkerülése. Egy összetett hálózati környezetben az adatcsomagok átvitele nem mindig a megadott idő szerint történik meg a célállomásra, és a régi adatcsomagok a hálózati torlódás és egyéb okok miatt előbb érkezhetnek meg a célállomásra. Ennek elkerülése érdekében a TCP háromutas kézfogást használ a kapcsolat létrehozásához.
Amikor egy kliens egymás után több SYN kapcsolatlétesítési csomagot küld, például hálózati torlódás esetén, a következők fordulhatnak elő:
1- A régi SYN csomagok a legújabb SYN csomagok előtt érkeznek meg a szerverre.
2- A szerver egy SYN + ACK csomaggal válaszol a kliensnek, miután megkapta a régi SYN csomagot.
3- Amikor a kliens megkapja a SYN + ACK csomagot, a saját kontextusa alapján megállapítja, hogy a kapcsolat egy korábbi kapcsolat (a sorszám lejárt vagy időtúllépés történt), majd elküldi az RST csomagot a szervernek a kapcsolat megszakításához.
Kétirányú kézfogás esetén nincs mód annak megállapítására, hogy az aktuális kapcsolat egy korábbi kapcsolat-e. A háromirányú kézfogás lehetővé teszi az ügyfél számára, hogy a kontextus alapján megállapítsa, hogy az aktuális kapcsolat egy korábbi kapcsolat-e, amikor készen áll a harmadik csomag küldésére:
1- Ha egy korábbi kapcsolatról van szó (a sorszám lejárt vagy időtúllépés történt), akkor a harmadik kézfogás által küldött csomag egy RST csomag, amely megszakítja a korábbi kapcsolatot.
2- Ha nem történelmi kapcsolatról van szó, akkor a harmadszorra elküldött csomag egy ACK csomag, és a két kommunikáló fél sikeresen létrehozza a kapcsolatot.
Ezért a TCP azért használja a háromirányú kézfogást, mert inicializálja a kapcsolatot a korábbi kapcsolatok megelőzése érdekében.
2. ok: Mindkét fél kezdeti sorszámának szinkronizálása
A TCP protokoll mindkét oldalának fenn kell tartania egy sorszámot, ami kulcsfontosságú tényező a megbízható átvitel biztosításában. A sorszámok fontos szerepet játszanak a TCP kapcsolatokban. A következőket teszik:
A vevő kiküszöbölheti a duplikált adatokat és biztosíthatja az adatok pontosságát.
A vevő a csomagokat a sorszám sorrendjében fogadhatja, hogy biztosítsa az adatok integritását.
● A sorszám azonosíthatja a másik fél által fogadott adatcsomagot, lehetővé téve a megbízható adatátvitelt.
Ezért egy TCP-kapcsolat létrehozásakor a kliens SYN csomagokat küld a kezdeti sorszámmal, és megköveteli a szervertől, hogy egy ACK csomaggal válaszoljon, amely jelzi a kliens SYN csomagjának sikeres vételét. Ezután a szerver elküldi a SYN csomagot a kezdeti sorszámmal a kliensnek, és megvárja, amíg a kliens egyszer s mindenkorra válaszol, hogy biztosítsa a kezdeti sorszámok megbízható szinkronizálását.
Bár egy négyirányú kézfogással is megbízhatóan szinkronizálható a két fél kezdeti sorszáma, a második és harmadik lépés egyetlen lépéssé kombinálható, így háromirányú kézfogást eredményezve. A két kézfogás azonban csak azt garantálja, hogy az egyik fél kezdeti sorszámát sikeresen megkapja a másik fél, de nincs garancia arra, hogy mindkét fél kezdeti sorszáma megerősíthető. Ezért a háromirányú kézfogás a legjobb választás a TCP-kapcsolatok stabilitásának és megbízhatóságának biztosítása érdekében.
3. ok: Kerülje az erőforrások pazarlását
Ha csak „két kézfogás” történik, és a kliens SYN kérése blokkolva van a hálózatban, a kliens nem tudja fogadni a szerver által küldött ACK csomagot, így a SYN újraküldésre kerül. Mivel azonban nincs harmadik kézfogás, a szerver nem tudja megállapítani, hogy a kliens kapott-e ACK visszaigazolást a kapcsolat létrehozásához. Ezért a szerver csak proaktívan tud kapcsolatot létesíteni minden egyes SYN kérés fogadása után. Ez a következőkhöz vezet:
Erőforrás-pazarlás: Ha a kliens SYN-kérését blokkolják, ami több SYN-csomag ismételt továbbítását eredményezi, a szerver több redundáns, érvénytelen kapcsolatot hoz létre a kérés fogadása után. Ez a szerver erőforrásainak szükségtelen pazarlásához vezet.
Üzenetmegőrzés: A harmadik kézfogás hiánya miatt a szervernek nincs módja megtudni, hogy a kliens megfelelően megkapta-e az ACK visszaigazolást a kapcsolat létrehozásához. Ennek eredményeként, ha az üzenetek elakadnak a hálózatban, a kliens újra és újra SYN kéréseket fog küldeni, aminek következtében a szerver folyamatosan új kapcsolatokat létesít. Ez növeli a hálózati torlódást és a késleltetést, és negatívan befolyásolja a hálózat teljesítményét.
Ezért a hálózati kapcsolat stabilitásának és megbízhatóságának biztosítása érdekében a TCP háromirányú kézfogást használ a kapcsolat létrehozásához, hogy elkerülje ezen problémák előfordulását.
Összefoglalás
AHálózati csomagközvetítőA TCP kapcsolat felépítése háromirányú kézfogással történik. A háromirányú kézfogás során a kliens először egy SYN jelzővel ellátott csomagot küld a szervernek, jelezve, hogy kapcsolatot kíván létesíteni. Miután a klienstől megkapta a kérést, a szerver egy SYN és ACK jelzőkkel ellátott csomaggal válaszol a kliensnek, jelezve, hogy a kapcsolati kérést elfogadta, és elküldi a saját kezdeti sorszámát. Végül a kliens egy ACK jelzővel válaszol a szervernek, jelezve, hogy a kapcsolat sikeresen létrejött. Így a két fél LÉTREHOZOTT állapotban van, és megkezdhetik az adatok küldését egymásnak.
Általánosságban elmondható, hogy a TCP-kapcsolatok háromirányú kézfogási folyamata a kapcsolat stabilitásának és megbízhatóságának biztosítására, a korábbi kapcsolatok miatti zavarok és erőforrás-pazarlás elkerülésére, valamint annak biztosítására szolgál, hogy mindkét fél képes legyen adatok fogadására és küldésére.
Közzététel ideje: 2025. január 8.