TCP kapcsolat beállítása
Amikor a weben böngészünk, e-mailt küldünk vagy online játékkal játszunk, gyakran nem gondolunk a mögötte meghúzódó bonyolult hálózati kapcsolatra. Azonban ezek az aprónak tűnő 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, ennek 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átvitelhez. 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 világosabb képet kapunk a TCP-kapcsolatok megbízhatóságáról.
TCP háromutas kézfogási folyamat és állapotátmenetek
A TCP egy kapcsolatorientált szállítási protokoll, amely az adatátvitel előtt kapcsolatépítést igényel. Ez a kapcsolatlétesítési folyamat 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 a kliens és a szerver is ZÁRVA van. Először is, a szerver aktívan figyel egy porton, és LISTEN á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ő csatlakozási csomag formátuma a következő:
Amikor egy kliens kapcsolatot kezdeményez, véletlenszerű kezdeti sorszámot generál (client_isn), és elhelyezi a TCP fejléc "Sequence number" mezőjében. Ugyanakkor a kliens a SYN zászló pozícióját 1-re állítja, jelezve, hogy a kimenő csomag SYN csomag. A kliens az első SYN csomag elküldésével jelzi, hogy kapcsolatot kíván létesíteni a szerverrel. Ez a csomag nem tartalmaz alkalmazásréteg-adatokat (azaz elküldött adatokat). Ezen a ponton a kliens állapota SYN-SENT-ként van megjelölve.
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 a TCP-fejléc "Serial number" mezőjébe helyezi. Ezután a szerver beírja a client_isn + 1 értéket az "Acknowledgement number" mezőbe, és mind a SYN, mind az ACK bitet 1-re állítja. Végül a szerver elküldi a csomagot a kliensnek, amely nem tartalmaz alkalmazásrétegű adatokat (és a szerver adatait sem) küldeni). Jelenleg a szerver SYN-RCVD állapotban van.
Miután az ügyfél megkapta a csomagot a kiszolgálótól, a következő optimalizálásokat kell végrehajtania, hogy válaszoljon a végső válaszcsomagra: Először is, a kliens a válaszcsomag TCP fejlécének ACK bitjét 1-re állítja; Másodszor, az ügyfél 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 szerverig. A műveletek befejezése után a kliens LÉTESÍTETT állapotba lép.
Amint a szerver megkapja a válaszcsomagot a klienstől, szintén ESTABLISHED állapotba vált.
Amint az a fenti folyamatból látható, háromirányú kézfogás végrehajtásakor a harmadik kézfogás engedélyezi az adatátvitelt, de az első két kézfogás nem. Ezt a kérdést gyakran felteszik az interjúkban. A háromirányú kézfogás befejeztével mindkét fél LÉTREHOZOTT állapotba kerül, jelezve, hogy a kapcsolat sikeresen létrejött, ekkor a kliens és a szerver elkezdheti az adatok küldését egymásnak.
Miért három kézfogás? Nem kétszer, négyszer?
A gyakori válasz: "Mert a háromirányú kézfogás garantálja a fogadás és küldés képességét." Ez a válasz helyes, de ez csak a felszíni ok, nem hozza fel a fő okot. A következőkben három aspektusból elemzem a hármas kézfogás okait, hogy elmélyítsük a kérdés 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 (a fő ok)
A háromirányú kézfogás garantálja, hogy mindkét fél megbízható kezdeti sorszámot kapott.
A háromirányú kézfogás elkerüli az erőforrások pazarlását.
1. ok: Kerülje a történelmi ismétlődő csatlakozásokat
Dióhéjban a háromirányú kézfogás fő oka a régi duplikált kapcsolat inicializálása okozta zavarok elkerülése. Bonyolult hálózati környezetben az adatcsomagok átvitele nem mindig a megadott időben érkezik meg a célállomásra, és előfordulhat, hogy a régi adatcsomagok először a célállomáshoz érkeznek a hálózati torlódások és egyéb okok miatt. Ennek elkerülése érdekében a TCP háromirányú 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, olyan helyzetekben, mint például a hálózati torlódás, a következők fordulhatnak elő:
1- A régi SYN-csomagok a legújabb SYN-csomagok előtt érkeznek a szerverre.
2- A szerver egy SYN + ACK csomagot válaszol a kliensnek, miután megkapta a régi SYN csomagot.
3- Amikor az ügyfél megkapja a SYN + ACK csomagot, saját kontextusának megfelelően megállapítja, hogy a kapcsolat történelmi kapcsolat (a sorszám lejárt vagy időtúllépés), majd elküldi az RST-csomagot a szervernek, hogy megszakítsa a kapcsolatot.
Kétkézfogásos kapcsolat esetén nincs mód annak megállapítására, hogy a jelenlegi kapcsolat történelmi 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 történelmi kapcsolat-e, amikor készen áll a harmadik csomag küldésére:
1- Ha történeti kapcsolatról van szó (a sorszám lejárt vagy időtúllépés), a harmadik kézfogás által küldött csomag egy RST-csomag, amely megszakítja a történelmi kapcsolatot.
2- Ha nem történeti kapcsolatról van szó, akkor a harmadik alkalommal küldött csomag ACK csomag, és a két kommunikáló fél sikeresen létrehozza a kapcsolatot.
Ezért a fő oka annak, hogy a TCP a háromirányú kézfogást használja, hogy inicializálja a kapcsolatot, hogy megakadályozza a korábbi kapcsolatokat.
2. ok: Mindkét fél kezdeti sorszámának szinkronizálása
A TCP protokoll mindkét oldalának meg kell őriznie egy sorszámot, ami kulcsfontosságú tényező a megbízható átvitel biztosításához. A sorszámok fontos szerepet játszanak a TCP-kapcsolatokban. A következőket teszik:
A vevő képes kiküszöbölni az ismétlődő adatokat, és biztosítani tudja az adatok pontosságát.
A vevő a sorszám szerinti sorrendben tudja fogadni a csomagokat, hogy biztosítsa az adatok sértetlenségét.
● A sorszám azonosíthatja a másik fél által fogadott adatcsomagot, ami megbízható adatátvitelt tesz lehetővé.
Ezért a TCP-kapcsolat létesítésekor az ügyfél SYN-csomagokat küld a kezdeti sorszámmal, és megköveteli a szervertől, hogy válaszoljon egy ACK-csomaggal, jelezve a kliens SYN-csomagjának sikeres fogadását. Ezután a szerver elküldi a SYN-csomagot a kezdeti sorszámmal az ügyfélnek, és megvárja, hogy az ügyfél egyszer és mindenkorra válaszoljon, hogy biztosítsa a kezdeti sorszámok megbízható szinkronizálását.
Bár négyirányú kézfogással is lehetséges mindkét fél kezdeti sorszámának megbízható szinkronizálása, a második és a harmadik lépés egyetlen lépésben kombinálható, ami háromirányú kézfogást eredményez. A két kézfogás azonban csak azt tudja garantálni, hogy az egyik fél kezdeti sorszámát a másik fél sikeresen megkapja, arra viszont nincs garancia, hogy mindkét fél kezdeti sorszámát meg lehet erősíteni. 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" van, amikor 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 az ügyfél kapott-e ACK nyugtát a kapcsolat létrehozásához. Ezért a szerver csak minden egyes SYN kérés fogadása után tud proaktívan kapcsolatot létesíteni. Ez a következőkhöz vezet:
Erőforrások pazarlása: Ha az ügyfél SYN-kérelme blokkolva van, ami több SYN-csomag ismételt továbbítását eredményezi, a szerver a kérelem beérkezése után több redundáns érvénytelen kapcsolatot hoz létre. 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 szerver nem tudja megtudni, hogy a kliens helyesen kapta-e a kapcsolat létrehozásához szükséges ACK nyugtát. Ennek eredményeként, ha az üzenetek elakadnak a hálózatban, a kliens folyamatosan SYN kéréseket küld újra és újra, aminek következtében a szerver folyamatosan új kapcsolatokat létesít. Ez növeli a hálózati torlódást és késést, és negatívan befolyásolja a hálózat általános 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 az ilyen problémák előfordulását.
Összegzés
AHálózati csomagközvetítőA TCP-kapcsolat létrehozása 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 megkapta a kérést a klienstől, a szerver egy SYN és ACK jelzőkkel ellátott csomagot válaszol a kliensnek, jelezve, hogy a csatlakozási kérelem elfogadásra került, és elküldi a saját kezdeti sorszámát. Végül az ügyfél egy ACK jelzővel válaszol a szervernek, jelezve, hogy a kapcsolat sikeresen létrejött. Így a két fél LÉTESÍTETT állapotban van, és megkezdheti az adatküldést egymásnak.
Általánosságban elmondható, hogy a TCP-kapcsolat létrehozásának háromirányú kézfogási folyamatát úgy tervezték, hogy biztosítsa a kapcsolat stabilitását és megbízhatóságát, elkerülje a korábbi kapcsolatok miatti összetévesztést és az erőforrások pazarlását, valamint biztosítsa, hogy mindkét fél képes legyen az adatok fogadására és küldésére.
Feladás időpontja: 2025-08-08