Kluczowe tajemnice połączeń TCP z brokerem pakietów sieciowych: demistyfikacja potrzeby potrójnego uzgadniania

Konfiguracja połączenia TCP
Przeglądając strony internetowe, wysyłając e-maile czy grając w gry online, często nie myślimy o skomplikowanym połączeniu sieciowym, które się za tym kryje. Jednak to właśnie te pozornie drobne kroki zapewniają stabilną komunikację między nami a serwerem. Jednym z najważniejszych kroków jest nawiązanie połączenia TCP, a jego sednem jest potrójne uzgadnianie (tri-way handshake).

W tym artykule szczegółowo omówimy zasadę, proces i znaczenie trzyetapowego uzgadniania. Krok po kroku wyjaśnimy, dlaczego jest ono potrzebne, jak zapewnia stabilność i niezawodność połączenia oraz jak ważne jest dla przesyłu danych. Głębsze zrozumienie trzyetapowego uzgadniania pozwoli nam lepiej zrozumieć mechanizmy komunikacji sieciowej i uzyskać jaśniejszy obraz niezawodności połączeń TCP.

Proces trójstronnego uzgadniania TCP i przejścia stanów
TCP to protokół transportowy zorientowany na połączenie, który wymaga nawiązania połączenia przed transmisją danych. Proces nawiązywania połączenia odbywa się poprzez potrójne uzgadnianie (handshake).

 Trójstronne uzgadnianie TCP

Przyjrzyjmy się bliżej pakietom TCP wysyłanym w każdym połączeniu.

Początkowo zarówno klient, jak i serwer są ZAMKNIĘTE. Najpierw serwer aktywnie nasłuchuje na porcie i znajduje się w stanie LISTEN, co oznacza, że ​​musi zostać uruchomiony. Następnie klient jest gotowy do uzyskania dostępu do strony internetowej. Musi nawiązać połączenie z serwerem. Format pierwszego pakietu połączenia jest następujący:

 Pakiet SYN

Gdy klient inicjuje połączenie, generuje losowy początkowy numer sekwencyjny (client_isn) i umieszcza go w polu „Numer sekwencyjny” w nagłówku TCP. Jednocześnie klient ustawia flagę SYN na 1, aby wskazać, że pakiet wychodzący jest pakietem SYN. ​​Klient sygnalizuje chęć nawiązania połączenia z serwerem, wysyłając do niego pierwszy pakiet SYN. ​​Pakiet ten nie zawiera danych warstwy aplikacji (tj. danych wysłanych). W tym momencie status klienta jest oznaczony jako SYN-SENT (WYSŁANY).

Pakiet SYN+ACK

Gdy serwer odbiera pakiet SYN od klienta, losowo inicjuje swój własny numer seryjny (server_isn), a następnie wpisuje ten numer w polu „Numer seryjny” w nagłówku TCP. Następnie serwer wpisuje wartość client_isn + 1 w polu „Numer potwierdzenia” i ustawia bity SYN i ACK na 1. Na koniec serwer wysyła pakiet do klienta, który nie zawiera żadnych danych warstwy aplikacji (ani danych do wysłania przez serwer). W tym momencie serwer znajduje się w stanie SYN-RCVD.

Pakiet ACK

Po odebraniu pakietu z serwera klient musi wykonać następujące optymalizacje, aby odpowiedzieć na ostateczny pakiet odpowiedzi: Najpierw klient ustawia bit ACK w nagłówku TCP pakietu odpowiedzi na 1; Następnie klient wprowadza wartość server_isn + 1 w polu „Potwierdź numer odpowiedzi”; Na koniec klient wysyła pakiet do serwera. Pakiet ten może przenosić dane od klienta do serwera. Po zakończeniu tych operacji klient przejdzie w stan ESTABLISHED.

Gdy serwer otrzyma pakiet odpowiedzi od klienta, przełącza się również w stan ESTABLISHED.

Jak widać z powyższego procesu, podczas trzyetapowego uzgadniania, trzecie uzgadnianie może przesyłać dane, ale dwa pierwsze nie. To pytanie często zadawane jest na rozmowach kwalifikacyjnych. Po zakończeniu trzyetapowego uzgadniania obie strony przechodzą w stan ESTABLISHED, co oznacza, że ​​połączenie zostało pomyślnie nawiązane i w tym momencie klient i serwer mogą rozpocząć przesyłanie do siebie danych.

Po co trzy uściski dłoni? Nie dwa, a cztery?
Najczęstszą odpowiedzią jest: „Ponieważ potrójne uzgadnianie gwarantuje możliwość odbierania i wysyłania”. Ta odpowiedź jest poprawna, ale jest to jedynie powierzchowny powód, nie wskazujący na przyczynę główną. W dalszej części przeanalizuję powody potrójnego uzgadniania z trzech punktów widzenia, aby pogłębić nasze zrozumienie tego zagadnienia.

Trójetapowe uzgadnianie może skutecznie zapobiec inicjalizacji historycznie powtarzanych połączeń (główny powód)
Trójetapowe uzgadnianie gwarantuje, że obie strony otrzymały niezawodny początkowy numer sekwencyjny.
Trójstronne uzgadnianie pozwala uniknąć marnowania zasobów.

Powód 1: Unikaj historycznych duplikatów połączeń
Krótko mówiąc, głównym celem trójstronnego uzgadniania jest uniknięcie nieporozumień spowodowanych przez starą, zduplikowaną inicjalizację połączenia. W złożonym środowisku sieciowym transmisja pakietów danych nie zawsze jest wysyłana do hosta docelowego zgodnie z określonym czasem, a stare pakiety danych mogą dotrzeć do hosta docelowego jako pierwsze z powodu przeciążenia sieci i innych przyczyn. Aby tego uniknąć, protokół TCP używa trójstronnego uzgadniania do nawiązania połączenia.

trzyetapowe uzgadnianie pozwala uniknąć historycznych duplikatów połączeń

Gdy klient wysyła kolejno wiele pakietów ustanawiania połączenia SYN, np. w przypadku przeciążenia sieci, mogą wystąpić następujące zdarzenia:

1- Stare pakiety SYN docierają do serwera przed najnowszymi pakietami SYN.
2- Serwer odpowie klientowi pakietem SYN + ACK po otrzymaniu starego pakietu SYN.
3- Gdy klient otrzyma pakiet SYN + ACK, ustala, że ​​połączenie jest połączeniem historycznym (wygasł numer sekwencyjny lub nastąpiło przekroczenie limitu czasu) zgodnie z własnym kontekstem, a następnie wysyła pakiet RST do serwera, aby przerwać połączenie.

W przypadku połączenia dwukrotnego uzgadniania nie ma możliwości ustalenia, czy bieżące połączenie jest połączeniem historycznym. Trójkrotne uzgadnianie pozwala klientowi ustalić, czy bieżące połączenie jest połączeniem historycznym, na podstawie kontekstu, gdy jest gotowy do wysłania trzeciego pakietu:

1- Jeżeli jest to połączenie historyczne (numer sekwencyjny wygasł lub nastąpiło przekroczenie limitu czasu), pakiet wysłany podczas trzeciego uzgadniania jest pakietem RST w celu przerwania połączenia historycznego.
2- Jeżeli nie jest to połączenie historyczne, pakiet wysłany po raz trzeci staje się pakietem ACK, a dwie komunikujące się strony pomyślnie nawiązują połączenie.

Dlatego głównym powodem, dla którego protokół TCP wykorzystuje trójetapowe uzgadnianie, jest inicjalizacja połączenia w celu zapobieżenia historycznym połączeniom.

Powód 2: Aby zsynchronizować początkowe numery sekwencyjne obu stron
Obie strony protokołu TCP muszą utrzymywać numer sekwencyjny, co jest kluczowym czynnikiem zapewniającym niezawodną transmisję. Numery sekwencyjne odgrywają ważną rolę w połączeniach TCP. Spełniają one następujące funkcje:

Odbiornik może eliminować duplikaty danych i zapewniać ich dokładność.

Odbiornik może odbierać pakiety w kolejności zgodnej z numerem sekwencyjnym, co zapewnia integralność danych.

● Numer sekwencyjny pozwala zidentyfikować pakiet danych odebrany przez drugą stronę, umożliwiając niezawodną transmisję danych.

Dlatego po nawiązaniu połączenia TCP klient wysyła pakiety SYN z początkowym numerem sekwencyjnym i żąda od serwera odpowiedzi w postaci pakietu ACK, potwierdzającego pomyślne odebranie pakietu SYN klienta. Następnie serwer wysyła pakiet SYN z początkowym numerem sekwencyjnym do klienta i czeka na jego jednorazową odpowiedź, aby upewnić się, że początkowe numery sekwencyjne są niezawodnie zsynchronizowane.

Zsynchronizuj początkowe numery seryjne obu stron

Chociaż czteroetapowe uzgadnianie (Handshake) umożliwia niezawodną synchronizację początkowych numerów sekwencyjnych obu stron, drugi i trzeci krok można połączyć w jeden, co skutkuje potrójnym uzgadnianiem. Jednakże, dwa uzgadniania gwarantują jedynie pomyślne odebranie początkowego numeru sekwencyjnego jednej strony przez drugą, ale nie dają gwarancji, że początkowy numer sekwencyjny obu stron zostanie potwierdzony. Dlatego potrójne uzgadnianie jest najlepszym wyborem, aby zapewnić stabilność i niezawodność połączeń TCP.

Powód 3: Unikaj marnowania zasobów
W przypadku jedynie „podwójnego uzgadniania”, gdy żądanie klienta SYN jest blokowane w sieci, klient nie może odebrać pakietu ACK wysłanego przez serwer, więc pakiet SYN zostanie wysłany ponownie. Ponieważ jednak nie ma trzeciego uzgadniania, serwer nie może ustalić, czy klient otrzymał potwierdzenie ACK umożliwiające nawiązanie połączenia. W związku z tym serwer może proaktywnie nawiązać połączenie tylko po otrzymaniu każdego żądania SYN. ​​Prowadzi to do następującego wniosku:

Marnotrawstwo zasobów: Jeśli żądanie SYN klienta zostanie zablokowane, co spowoduje wielokrotną transmisję wielu pakietów SYN, serwer nawiąże wiele redundantnych, nieprawidłowych połączeń po odebraniu żądania. Prowadzi to do niepotrzebnego marnowania zasobów serwera.

Retencja wiadomości: Z powodu braku trzeciego uzgadniania, serwer nie ma możliwości sprawdzenia, czy klient prawidłowo odebrał potwierdzenie ACK w celu nawiązania połączenia. W rezultacie, jeśli wiadomości utkną w sieci, klient będzie wysyłał żądania SYN w kółko, zmuszając serwer do ciągłego nawiązywania nowych połączeń. Zwiększy to przeciążenie sieci i opóźnienia, a także negatywnie wpłynie na ogólną wydajność sieci.

Unikaj marnowania zasobów

Dlatego też, aby zagwarantować stabilność i niezawodność połączenia sieciowego, protokół TCP używa trzyetapowego uzgadniania do nawiązania połączenia, co pozwala uniknąć występowania tych problemów.

Streszczenie
TenBroker pakietów sieciowychNawiązanie połączenia TCP odbywa się za pomocą trzyetapowego uzgadniania (Tri-Way Handshake). Podczas trzyetapowego uzgadniania klient najpierw wysyła do serwera pakiet z flagą SYN, sygnalizując chęć nawiązania połączenia. Po otrzymaniu żądania od klienta, serwer odpowiada klientowi pakietem z flagami SYN i ACK, sygnalizując akceptację żądania połączenia, i wysyła swój własny początkowy numer sekwencyjny. Na koniec klient odpowiada serwerowi flagą ACK, sygnalizując pomyślne nawiązanie połączenia. W ten sposób obie strony znajdują się w stanie ESTABLISHED i mogą rozpocząć wymianę danych.

Zasadniczo proces trójstronnego uzgadniania przy nawiązywaniu połączenia TCP ma na celu zapewnienie stabilności i niezawodności połączenia, uniknięcie nieporozumień i marnotrawstwa zasobów w przypadku historycznych połączeń oraz zapewnienie, że obie strony będą mogły odbierać i wysyłać dane.


Czas publikacji: 08-01-2025