Kluczowe tajemnice połączeń TCP brokera pakietów sieciowych: Odkryto potrzebę potrójnego uzgadniania

Konfiguracja połączenia TCP
Kiedy przeglądamy sieć, wysyłamy e-maile lub gramy w gry online, często nie myślimy o złożonym połączeniu sieciowym, które za tym stoi. Jednak to te pozornie małe kroki zapewniają stabilną komunikację między nami a serwerem. Jednym z najważniejszych kroków jest konfiguracja połączenia TCP, a jego sednem jest trójstronne uzgadnianie.

W tym artykule szczegółowo omówimy zasadę, proces i znaczenie trzyetapowego uzgadniania. Krok po kroku wyjaśnimy, dlaczego trzyetapowe uzgadnianie jest potrzebne, w jaki sposób zapewnia stabilność i niezawodność połączenia oraz jak ważne jest dla transferu danych. Dzięki głębszemu zrozumieniu trzyetapowego uzgadniania uzyskamy lepsze zrozumienie mechanizmów leżących u podstaw komunikacji sieciowej i 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 ustanowienia połączenia przed transmisją danych. Proces ustanawiania połączenia odbywa się poprzez trzyetapowe uzgadnianie.

 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 jest w stanie LISTEN, co oznacza, że ​​serwer musi zostać uruchomiony. Następnie klient jest gotowy do rozpoczęcia 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” nagłówka TCP. Jednocześnie klient ustawia pozycję flagi SYN na 1, aby wskazać, że wychodzący pakiet jest pakietem SYN. ​​Klient wskazuje, że chce nawiązać połączenie z serwerem, wysyłając pierwszy pakiet SYN do serwera. Ten pakiet nie zawiera danych warstwy aplikacji (tj. danych wysłanych). W tym momencie status klienta jest oznaczony jako SYN-SENT.

Pakiet SYN+ACK

Gdy serwer otrzymuje pakiet SYN od klienta, losowo inicjuje swój własny numer seryjny (server_isn), a następnie umieszcza ten numer w polu „Serial number” nagłówka TCP. Następnie serwer wprowadza client_isn + 1 w polu „Acknowledgement number” 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 żadnych danych do wysłania przez serwer). W tym momencie serwer znajduje się w stanie SYN-RCVD.

Pakiet ACK

Gdy klient otrzyma pakiet z serwera, musi wykonać następujące optymalizacje, aby odpowiedzieć na ostateczny pakiet odpowiedzi: Po pierwsze, klient ustawia bit ACK nagłówka TCP pakietu odpowiedzi na 1; Po drugie, klient wprowadza wartość server_isn + 1 w polu „Confirm answer number”; Na koniec, klient wysyła pakiet do serwera. Ten pakiet 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 wykonywania trzyetapowego uścisku dłoni, trzeciemu uściskowi dłoni może zostać przyznane prawo do przenoszenia danych, ale pierwszym dwóm uściskom dłoni nie. To pytanie często zadawane jest na rozmowach kwalifikacyjnych. Po zakończeniu trzyetapowego uścisku dłoni obie strony przechodzą w stan ESTABLISHED, wskazujący, że połączenie zostało pomyślnie nawiązane, w którym momencie klient i serwer mogą rozpocząć wysyłanie do siebie danych.

Dlaczego trzy uściski dłoni? Nie dwa, cztery razy?
Częstą odpowiedzią jest: „Ponieważ trzykrotne uściśnięcie dłoni gwarantuje możliwość odbierania i wysyłania”. Ta odpowiedź jest poprawna, ale jest tylko powierzchownym powodem, nie przedstawia głównego powodu. W dalszej części przeanalizuję powody potrójnego uściśnięcia dłoni z trzech aspektów, aby pogłębić nasze zrozumienie tego problemu.

Uścisk dłoni trzyetapowy może skutecznie zapobiec inicjalizacji historycznie powtarzanych połączeń (główny powód)
Trzyetapowe uzgadnianie daje pewność, ż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 powodem trzyetapowego uzgadniania jest uniknięcie zamieszania spowodowanego 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ąć, TCP używa trzyetapowego uzgadniania w celu nawiązania połączenia.

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

Gdy klient wysyła wiele pakietów ustanawiania połączenia SYN jeden po drugim, 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, ustali, ż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 z dwoma uściskami dłoni nie ma możliwości ustalenia, czy bieżące połączenie jest połączeniem historycznym. Trzykrotny uścisk dłoni 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 jest pakietem ACK, a obie komunikujące się strony pomyślnie nawiązują połączenie.

Dlatego głównym powodem, dla którego protokół TCP stosuje trzyetapowe uzgadnianie, jest inicjalizacja połączenia w celu uniemożliwienia nawiązania historycznych połączeń.

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

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

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

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

Dlatego po ustanowieniu połączenia TCP klient wysyła pakiety SYN z początkowym numerem sekwencyjnym i wymaga, aby serwer odpowiedział pakietem ACK, wskazującym na pomyślne odebranie pakietu SYN klienta. Następnie serwer wysyła pakiet SYN z początkowym numerem sekwencyjnym do klienta i czeka, aż klient odpowie raz na zawsze, aby upewnić się, że początkowe numery sekwencyjne są niezawodnie zsynchronizowane.

Zsynchronizuj początkowe numery seryjne obu stron

Chociaż czteroetapowe uzgadnianie jest również możliwe w celu niezawodnej synchronizacji początkowych numerów sekwencji obu stron, drugi i trzeci krok można połączyć w jeden krok, co skutkuje trzyetapowym uzgadnianiem. Jednak dwa uzgadniania mogą zagwarantować jedynie, że początkowy numer sekwencji jednej strony zostanie pomyślnie odebrany przez drugą stronę, ale nie ma gwarancji, że początkowy numer sekwencji obu stron może zostać potwierdzony. Dlatego trzyetapowe uzgadnianie jest najlepszym wyborem, aby zapewnić stabilność i niezawodność połączeń TCP.

Powód 3: Unikaj marnowania zasobów
Jeśli występuje tylko „dwukrotne uzgadnianie”, gdy żądanie SYN klienta jest blokowane w sieci, klient nie może odebrać pakietu ACK wysłanego przez serwer, więc SYN zostanie ponownie wysłany. Jednak ponieważ nie ma trzeciego uzgadniania, serwer nie może ustalić, czy klient otrzymał potwierdzenie ACK w celu nawiązania połączenia. Dlatego serwer może proaktywnie nawiązać połączenie tylko po otrzymaniu każdego żądania SYN. ​​Prowadzi to do następującego:

Marnowanie zasobów: Jeśli żądanie SYN klienta zostanie zablokowane, co spowoduje powtarzającą się transmisję wielu pakietów SYN, serwer ustanowi wiele redundantnych nieprawidłowych połączeń po otrzymaniu żądania. Prowadzi to do niepotrzebnego marnowania zasobów serwera.

Retencja wiadomości: Ze względu na brak trzeciego uścisku dłoni serwer nie ma możliwości dowiedzenia się, 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, powodując, że serwer będzie stale nawiązywał nowe połączenia. Zwiększy to przeciążenie sieci i opóźnienia oraz negatywnie wpłynie na ogólną wydajność sieci.

Unikaj marnowania zasobów

Aby zagwarantować stabilność i niezawodność połączenia sieciowego, protokół TCP stosuje trzyetapową uzgadnianie w celu nawiązania połączenia, co pozwala uniknąć występowania tego typu problemów.

Streszczenie
TenBroker pakietów sieciowychNawiązanie połączenia TCP odbywa się za pomocą trzyetapowego uzgadniania. Podczas trzyetapowego uzgadniania klient najpierw wysyła pakiet z flagą SYN do serwera, wskazując, że chce nawiązać połączenie. Po otrzymaniu żądania od klienta serwer odpowiada pakietem z flagami SYN i ACK do klienta, wskazując, że żądanie połączenia zostało zaakceptowane, i wysyła swój własny początkowy numer sekwencyjny. Na koniec klient odpowiada flagą ACK do serwera, aby wskazać, że połączenie zostało pomyślnie nawiązane. W ten sposób obie strony znajdują się w stanie ESTABLISHED i mogą rozpocząć wysyłanie do siebie danych.

Zasadniczo proces trzyetapowego 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