Maszyna stanów TCP
Pełna maszyna stanów TCP: LISTEN, SYN-SENT, ESTABLISHED, FIN-WAIT, CLOSE-WAIT, LAST-ACK, TIME-WAIT.
Wprowadzenie: Zasady Kulturalnej Rozmowy
Pomyśl o cyklu życia zwykłej rozmowy telefonicznej. Nie zaczyna się ona natychmiast. Istnieje wyraźna sekwencja stanów: Twój telefon jest w spoczynku, wybierasz numer, po drugiej stronie dzwoni, ktoś odbiera, rozmawiacie, mówisz do widzenia, oni mówią do widzenia, i oboje odkładacie słuchawkę. Każdy z tych etapów to odrębny stan, a przechodzisz z jednego stanu do drugiego na podstawie konkretnych zdarzeń (wybranie numeru, odebranie, odłożenie słuchawki).
Protokół Kontroli Transmisji (TCP) zarządza swoimi połączeniami w bardzo podobny, wysoce ustrukturyzowany sposób. Ponieważ TCP obiecuje niezawodność i porządek, nie może po prostu losowo rozpoczynać i kończyć wysyłania danych. Potrzebuje formalnego zestawu zasad, który definiuje każdą możliwą fazę jego istnienia, od momentu utworzenia do całkowitego zakończenia. Ten zestaw zasad jest znany jako Maszyna Stanów TCP.
Jest to rodzaj , co jest formalnym sposobem powiedzenia, że połączenie TCP może w danym momencie znajdować się tylko w jednym z ograniczonej, dobrze zdefiniowanej liczby stanów. Przejścia między tymi stanami są wywoływane przez określone zdarzenia, takie jak żądanie połączenia przez aplikację, otrzymanie pakietu danych z ustawioną określoną flagą lub wygaśnięcie licznika czasu. Zrozumienie tej maszyny stanów jest kluczem do zrozumienia, w jaki sposób TCP osiąga swoją legendarną niezawodność.
Diagram Stanów: Mapa Cyklu Życia Połączenia
Cały cykl życia połączenia TCP można zwizualizować na jednym diagramie. Ten diagram pokazuje wszystkie możliwe stany i zdarzenia, które powodują przejście z jednego stanu do drugiego. Chociaż na pierwszy rzut oka może wydawać się skomplikowany, w kolejnych sekcjach rozłożymy go na czynniki pierwsze, stan po stanie. Strzałki reprezentują przepływ połączenia w zależności od zdarzeń.
Maszyna stanów TCP
Poznaj maszynę stanów skończonej która zarządza cyklem życia połączenia TCP wg RFC 793
Wybierz stan aby zobaczyć szczegóły
Typowa ścieżka dla klienta obejmuje stany takie jak SYN-SENT i FIN-WAIT, podczas gdy serwer zazwyczaj przechodzi przez stany LISTEN i CLOSE-WAIT. Celem jest stan ESTABLISHED, w którym obie strony mogą wymieniać dane.
Szczegółowy Opis Stanów TCP
Przyjrzyjmy się każdemu stanowi na diagramie, wyjaśniając jego cel, jak do niego wejść i jak go opuścić.
CLOSED
Analogia: Słuchawka telefonu jest odłożona, nie jest używana.
Technicznie nie jest to stan, ale raczej punkt początkowy i końcowy. Reprezentuje brak połączenia. Połączenie zaczyna się w stanie CLOSED, zanim podjęta zostanie jakakolwiek próba połączenia, i powraca do stanu CLOSED po jego całkowitym zakończeniu.
LISTEN
Rola: Tylko Serwer.
Analogia: Czekanie, aż telefon zadzwoni.
Ten stan reprezentuje serwer, który jest gotowy na przyjęcie nadchodzącego połączenia. Aplikacja serwerowa, jak serwer WWW, wiąże się z określonym numerem portu (np. port 443 dla HTTPS) i wchodzi w stan LISTEN, pasywnie oczekując, aż klient zainicjuje połączenie.
Przejście:Wchodzi w ten stan ze stanu CLOSED po wywołaniu przez aplikację 'listen()'. Przejdzie do stanu 'SYN_RCVD' po otrzymaniu przychodzącego pakietu SYN.
SYN-SENT
Rola: Tylko Klient.
Analogia: Właśnie wybrałeś numer i czekasz, aż ktoś odbierze.
Klient wchodzi w ten stan po wysłaniu pakietu SYN (Synchronize) do serwera w celu zażądania połączenia. Klient aktywnie próbuje ustanowić połączenie i czeka na odpowiedź od serwera (pakiet SYN-ACK).
Przejście:Wchodzi ze stanu CLOSED, gdy aplikacja inicjuje połączenie. Jeśli otrzyma SYN-ACK, wysyła ACK i przechodzi do 'ESTABLISHED'. Jeśli otrzyma SYN od drugiej strony w tym samym czasie (jednoczesne otwarcie), przechodzi do 'SYN_RCVD'.
SYN-RCVD
Rola: Głównie Serwer.
Analogia: Telefon zadzwonił, odebrałeś i powiedziałeś "Halo?", a teraz czekasz, aż dzwoniący odpowie.
Serwer wchodzi w ten stan po otrzymaniu żądania SYN od klienta i odesłaniu własnej odpowiedzi SYN-ACK. Serwer potwierdził żądanie klienta i wysłał własne informacje synchronizacyjne. Teraz czeka na ostatnie potwierdzenie ACK od klienta, aby zakończyć trójetapowe uzgadnianie.
Przejście:Wchodzi ze stanu 'LISTEN' po otrzymaniu SYN. Przechodzi do 'ESTABLISHED' po otrzymaniu ostatniego ACK od klienta.
ESTABLISHED
Rola: Klient i Serwer.
Analogia: Obie strony są na linii i mogą teraz prowadzić rozmowę.
Jest to główny stan połączenia TCP. Gdy trójetapowe uzgadnianie zostanie zakończone, zarówno klient, jak i serwer wchodzą w stan ESTABLISHED. Oznacza to, że połączenie jest w pełni otwarte, a dane aplikacji mogą być wysyłane i odbierane w obu kierunkach. Połączenie pozostaje w tym stanie przez cały czas fazy transferu danych.
Przejście:Obie strony wchodzą w ten stan po zakończeniu trójetapowego uzgadniania. Połączenie opuści ten stan, gdy którakolwiek ze stron zdecyduje się je zamknąć, wysyłając pakiet FIN. Strona, która wyśle FIN, przejdzie do 'FIN_WAIT_1'. Strona, która otrzyma FIN, przejdzie do 'CLOSE_WAIT'.
Stany Zamykania Połączenia
Zamykanie połączenia TCP to elegancki, czteroetapowy proces. Poniższe stany zarządzają tym zakończeniem. Strona, która inicjuje proces zamykania, nazywana jest "aktywnym zamykającym", a druga strona "pasywnym zamykającym".
FIN-WAIT-1
Rola: Aktywny Zamykający.
Analogia: Właśnie powiedziałeś: "Dobra, skończyłem mówić, do widzenia", i czekasz, aż druga osoba potwierdzi, że cię usłyszała.
Aplikacja na lokalnej maszynie zasygnalizowała, że nie ma więcej danych do wysłania i zażądała zamknięcia połączenia. Stos TCP wysyła pakiet FIN na drugi koniec i wchodzi w ten stan, czekając na potwierdzenie (ACK) swojego FIN.
Przejście:Wchodzi ze stanu 'ESTABLISHED' po zamknięciu połączenia przez lokalną aplikację. Po otrzymaniu ACK od drugiej strony, przechodzi do 'FIN_WAIT_2'.
FIN-WAIT-2
Rola: Aktywny Zamykający.
Analogia: Druga osoba powiedziała: "Ok, usłyszałem, że mówisz do widzenia". Teraz cicho czekasz, aż skończy swoje ostatnie słowa i też powie do widzenia.
Lokalna maszyna otrzymała potwierdzenie dla swojego pakietu FIN. Jej kierunek wysyłania jest teraz zamknięty. Teraz czeka na pakiet FIN z drugiego końca, aby zamknąć drugi kierunek połączenia.
Przejście:Wchodzi z 'FIN_WAIT_1' po otrzymaniu ACK dla swojego FIN. Przejdzie do 'TIME_WAIT' po otrzymaniu pakietu FIN od drugiej strony.
CLOSE-WAIT
Rola: Pasywny Zamykający.
Analogia: Usłyszałeś, że druga osoba mówi do widzenia. Odpowiedziałeś "Ok", ale nadal masz kilka ostatnich rzeczy do powiedzenia, zanim się rozłączysz.
Ten stan reprezentuje pasywną stronę zakończenia. Lokalna maszyna otrzymała pakiet FIN z drugiego końca i odesłała potwierdzenie ACK. Oznacza to, że połączenie jest teraz "półzamknięte". Lokalna aplikacja została poinformowana, że druga strona skończyła, i powinna teraz zakończyć swoją pracę i zamknąć połączenie ze swojej strony.
Przejście:Wchodzi z 'ESTABLISHED' po otrzymaniu pakietu FIN. Przechodzi do 'LAST_ACK' po tym, jak jego własna aplikacja wyda polecenie zamknięcia.
LAST-ACK
Rola: Pasywny Zamykający.
Analogia: Skończyłeś swoje ostatnie słowa i teraz również powiedziałeś: "Ok, do widzenia ode mnie też". Czekasz już tylko na ostatnie potwierdzenie, zanim całkowicie się rozłączysz.
Lokalna maszyna wysłała swój własny pakiet FIN na drugi koniec (po tym, jak jej aplikacja zamknęła połączenie) i teraz czeka na ostatnie potwierdzenie (ACK) dla swojego pakietu FIN.
Przejście:Wchodzi z 'CLOSE_WAIT' po wysłaniu własnego FIN. Po otrzymaniu ostatniego ACK przechodzi do 'CLOSED'.
TIME-WAIT
Rola: Aktywny Zamykający.
Analogia: Usłyszałeś ostatnie do widzenia i wysłałeś swoje ostatnie potwierdzenie. Trzymasz telefon przy uchu jeszcze przez chwilę, żeby upewnić się, że linia jest naprawdę martwa i nie ma żadnych ech.
Jest to kluczowy stan końcowy dla strony, która zainicjowała zamknięcie. Po otrzymaniu ostatniego FIN z drugiej strony i wysłaniu swojego ostatniego ACK, połączenie wchodzi w stan TIME-WAIT. Pozostanie w tym stanie przez okres (dwa razy Maksymalny Czas Życia Segmentu, zazwyczaj od 30 do 120 sekund).
Cel:Ten okres oczekiwania służy dwóm celom: 1) Zapewnia, że ostatnie wysłane ACK zostało odebrane. Jeśli zostało utracone, druga strona retransmituje swój FIN, który zostanie odebrany w stanie TIME-WAIT, a nowe ACK może zostać wysłane. 2) Pozwala, aby wszelkie stare, opóźnione zduplikowane pakiety wciąż krążące w sieci wygasły, zapobiegając uszkodzeniu nowego połączenia, które mogłoby później używać tych samych adresów IP i numerów portów. Po wygaśnięciu licznika czasu połączenie przechodzi do 'CLOSED'.
CLOSING
Rola: Obie (w rzadkich przypadkach).
Analogia: Obie osoby mówią "do widzenia" w tym samym momencie.
Jest to stosunkowo rzadki stan, który występuje, gdy obie strony połączenia decydują się aktywnie zamknąć je w tym samym czasie, a ich pakiety FIN mijają się w sieci. Każda strona wysyła FIN, a następnie otrzymuje FIN, zanim otrzyma ACK dla własnego FIN. Po otrzymaniu potwierdzenia dla własnego FIN, połączenie przejdzie do stanu TIME-WAIT.
Połączenie Wszystkiego w Całość: Cykl Życia w Praktyce
Prześledźmy kompletny, typowy cykl życia żądania internetowego, aby zobaczyć, jak te stany się łączą.
Typowe Połączenie (Klient inicjuje zamknięcie)
| Krok | Zdarzenie | Stan Klienta | Stan Serwera |
|---|---|---|---|
| 1 | Serwer rozpoczyna nasłuchiwanie | CLOSED | LISTEN |
| 2 | Klient łączy się, wysyła SYN | SYN-SENT | LISTEN |
| 3 | Serwer odbiera SYN, wysyła SYN-ACK | SYN-SENT | SYN-RCVD |
| 4 | Klient odbiera SYN-ACK, wysyła ACK | ESTABLISHED | SYN-RCVD |
| 5 | Serwer odbiera ACK (Transfer danych) | ESTABLISHED | ESTABLISHED |
| 6 | Aplikacja klienta zamyka, wysyła FIN | FIN-WAIT-1 | ESTABLISHED |
| 7 | Serwer odbiera FIN, wysyła ACK | FIN-WAIT-1 | CLOSE-WAIT |
| 8 | Klient odbiera ACK dla swojego FIN | FIN-WAIT-2 | CLOSE-WAIT |
| 9 | Aplikacja serwera zamyka, wysyła FIN | FIN-WAIT-2 | LAST-ACK |
| 10 | Klient odbiera FIN, wysyła ACK | TIME-WAIT | LAST-ACK |
| 11 | Serwer odbiera ostatnie ACK | TIME-WAIT | CLOSED |
| 12 | Licznik 2MSL klienta wygasa | CLOSED | CLOSED |