Transport

Maszyna stanów TCP

Pełna maszyna stanów TCP: LISTEN, SYN-SENT, ESTABLISHED, FIN-WAIT, CLOSE-WAIT, LAST-ACK, TIME-WAIT.

Wprowadzenie: Stany połączenia TCP

Połączenie TCP przechodzi przez określoną sekwencję stanów. Punkt końcowy zmienia stan w reakcji na zdarzenie, takie jak żądanie aplikacji, odebranie segmentu z flagą sterującą, potwierdzenie albo wygaśnięcie licznika czasu. Stan określa, jakie operacje i przejścia są w danym momencie prawidłowe.

Protokół sterowania transmisją (TCP) zarządza połączeniami za pomocą takiego uporządkowanego modelu stanów. Niezawodne dostarczanie danych wymaga śledzenia numerów sekwencyjnych, potwierdzeń, oczekujących segmentów sterujących i liczników czasu. Formalny zbiór stanów oraz przejść jest znany jako maszyna stanów TCP.

Model ten jest . W danym momencie blok kontrolny TCP jest reprezentowany przez jeden stan z ograniczonego, zdefiniowanego zbioru. Przejścia wywołują zdarzenia takie jak żądanie połączenia przez aplikację, segment z określoną flagą, potwierdzenie albo wygaśnięcie licznika czasu. Maszyna stanów porządkuje uzgadnianie, transfer danych i uporządkowane zamykanie między punktami końcowymi. Każdy punkt końcowy wykonuje własną instancję modelu, więc podczas uzgadniania lub zamykania obie strony mogą chwilowo znajdować się w różnych stanach. Przejście aktualizuje też zmienne sekwencji, liczniki retransmisji i działania wymagane przy następnym zdarzeniu.

Diagram stanów: Cykl życia połączenia TCP

Diagram przedstawia stany zdefiniowane dla połączenia TCP oraz zdarzenia powodujące przejścia między nimi. Każdy stan ma określone warunki wejścia i wyjścia. Strzałka oznacza przejście po obsłużeniu odpowiadającego jej zdarzenia. Diagram nie narzuca jednej ścieżki dla każdego połączenia.

Typowy aktywny inicjator przechodzi przez SYN-SENT, a później przez jeden ze stanów FIN-WAIT. Pasywny inicjator zwykle rozpoczyna w LISTEN i po odebraniu FIN może wejść w CLOSE-WAIT. ESTABLISHED jest stanem transferu danych, w którym oba punkty końcowe mogą wymieniać bajty aplikacyjne. Diagram obejmuje również rzadsze ścieżki, w tym otwarcie jednoczesne, jednoczesne zamykanie, zdarzenia związane z retransmisją oraz przerwanie przez RST. Brak segmentu sam nie tworzy nowego stanu, ponieważ kolejne przejście wywołują licznik i późniejsze segmenty.

Stany TCP: Szczegółowy opis

Opis każdego stanu przedstawia jego cel, typowe zdarzenie wejścia oraz przejście wyjściowe. Nazewnictwo odpowiada maszynie stanów TCP używanej w specyfikacji protokołu. Nazwy opisują zachowanie lokalnego TCP, dlatego określenie aktywny zamykający dotyczy punktu końcowego wysyłającego pierwszy FIN. Aplikacja może zamknąć jeden kierunek, gdy druga strona nadal wysyła dane, co uzasadnia rozdzielenie stanów końcowych. Maszyna stanów śledzi sterowanie transportem, a uwierzytelnianie aplikacji, granice komunikatów i znaczenie żądań należą do wyższych warstw.

CLOSED

Warunek: Brak aktywnego bloku kontrolnego połączenia.
CLOSED oznacza brak połączenia. Punkt końcowy znajduje się w tym stanie przed otwarciem lub rozpoczęciem nasłuchiwania i wraca do CLOSED po pełnym zakończeniu połączenia. Stan jest uwzględniony w modelu TCP, choć opisuje brak aktywnego połączenia. W CLOSED nie działa przestrzeń numerów sekwencyjnych ani stan retransmisji przypisany do punktu końcowego, więc segment przychodzący jest obsługiwany według reguł dla nieistniejącego połączenia.

LISTEN

Rola: Punkt końcowy wykonujący otwarcie pasywne.
Warunek: Oczekiwanie na przychodzący SYN.
Ten stan oznacza punkt końcowy przygotowany do przyjęcia połączenia. Aplikacja serwerowa, na przykład serwer WWW, wiąże się z portem takim jak 443 dla HTTPS i pasywnie oczekuje na inicjację klienta.
Przejście:Wchodzi ze stanu CLOSED po wywołaniu przez aplikację 'listen()'. Po odebraniu SYN przechodzi do 'SYN_RCVD'.

SYN-SENT

Rola: Punkt końcowy wykonujący otwarcie aktywne.
Warunek: Wysłano SYN i oczekiwana jest odpowiedź.
Punkt końcowy wchodzi w ten stan po wysłaniu SYN w celu zażądania połączenia. Aktywnie ustanawia połączenie i oczekuje na SYN-ACK lub inną prawidłową odpowiedź drugiej strony.
Przejście:Wchodzi ze stanu CLOSED, gdy aplikacja inicjuje połączenie. Po otrzymaniu SYN-ACK wysyła ACK i przechodzi do 'ESTABLISHED'. Jednoczesne odebranie SYN podczas otwarcia aktywnego prowadzi do 'SYN_RCVD'.

SYN-RCVD

Rola: Punkt końcowy, który odpowiedział na SYN.
Warunek: Wysłano SYN-ACK i oczekiwane jest końcowe ACK.
Punkt końcowy wchodzi w ten stan po odebraniu SYN i wysłaniu własnego SYN-ACK. Zapisał informacje synchronizacyjne drugiej strony i oczekuje na ACK kończące trójetapowe uzgadnianie.
Przejście:Zwykle wchodzi ze stanu 'LISTEN' po odebraniu SYN. Po otrzymaniu końcowego ACK przechodzi do 'ESTABLISHED'. Otwarcie jednoczesne również może przechodzić przez ten stan.

ESTABLISHED

Rola: Oba punkty końcowe.
Warunek: Uzgadnianie zakończone, transfer danych dozwolony.
ESTABLISHED jest głównym stanem transferu danych. Po trójetapowym uzgadnianiu oba punkty końcowe mogą wysyłać i odbierać bajty aplikacyjne w obu kierunkach. W fazie transferu aktywne są numery sekwencyjne, potwierdzenia, kontrola przepływu i kontrola przeciążenia.
Przejście:Każdy punkt końcowy może opuścić ten stan przez wysłanie FIN. Nadawca przechodzi do 'FIN_WAIT_1', a punkt odbierający FIN potwierdza go i przechodzi do 'CLOSE_WAIT'. Przerwanie połączenia może również nastąpić przez RST.

Stany Zamykania Połączenia

Typowe uporządkowane zamknięcie TCP wykorzystuje cztery wymiany sterujące, lecz jednoczesne zamknięcie i przerwanie przez RST prowadzą do innych przejść. Stany końcowe opisują zwykłą wymianę. Punkt końcowy wysyłający pierwszy FIN to "aktywny zamykający", a punkt, który go odbiera, to "pasywny zamykający". FIN zajmuje jeden numer sekwencyjny i potwierdza koniec jednego kierunku strumienia bajtów. Obsługa ACK oraz wygaśnięcie licznika określają, kiedy można usunąć blok kontrolny.

FIN-WAIT-1

Rola: Aktywny zamykający.
Warunek: Wysłano lokalny FIN i oczekiwane jest jego ACK.
Aplikacja lokalna zasygnalizowała brak dalszych danych w tym kierunku i zażądała zamknięcia. Stos TCP wysyła FIN do drugiej strony i wchodzi w ten stan, oczekując na potwierdzenie tego 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.
Warunek: Lokalny FIN został potwierdzony, oczekiwany jest FIN drugiej strony.
Lokalna maszyna otrzymała potwierdzenie swojego FIN. Jej kierunek wysyłania jest zamknięty, lecz może nadal odbierać dane do czasu otrzymania FIN od drugiej strony. Ten FIN zamyka 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.
Warunek: Odebrano i potwierdzono FIN drugiej strony, oczekiwane jest lokalne zamknięcie.
Lokalna maszyna otrzymała FIN i wysłała ACK. Kierunek odbioru jest zamknięty, lecz lokalna aplikacja może zakończyć wysyłanie pozostałych danych. Aplikacja została powiadomiona i powinna zamknąć własny kierunek.
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.
Warunek: Po FIN drugiej strony wysłano lokalny FIN, oczekiwane jest jego ACK.
Lokalna maszyna wysłała własny FIN po zamknięciu kierunku przez aplikację i czeka teraz na końcowe ACK dla tego 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.
Warunek: Odebrano ostatni FIN i wysłano ACK, działa licznik zamknięcia.
Po odebraniu FIN drugiej strony i wysłaniu ostatniego ACK punkt końcowy, który zainicjował zamknięcie, wchodzi w stan TIME-WAIT. Pozostaje w nim przez okres (dwa razy Maksymalny Czas Życia Segmentu). RFC 9293 przyjmuje MSL równy dwóm minutom na potrzeby tej specyfikacji, a implementacje mogą stosować optymalizacje liczników oparte na znacznikach czasu.
Cel:Ten okres ma dwa cele: 1) pozwala ponowić ostatni ACK, gdy druga strona retransmituje FIN po utracie tego ACK; 2) zapobiega pomyleniu opóźnionych zduplikowanych segmentów z późniejszym połączeniem używającym tej samej krotki adresów i portów. Po wygaśnięciu licznika punkt końcowy przechodzi do 'CLOSED'.

CLOSING

Rola: Oba punkty końcowe przy jednoczesnym zamknięciu.
Warunek: Każdy FIN dotarł przed ACK lokalnego FIN.
Ten stan występuje, gdy oba punkty końcowe zamykają się w podobnym czasie, a ich segmenty FIN przecinają się w sieci. Każda strona wysyła FIN i otrzymuje FIN drugiej strony przed potwierdzeniem własnego FIN. Po otrzymaniu ACK własnego FIN punkt końcowy przechodzi do TIME-WAIT.

Cykl życia połączenia: Przykładowa sekwencja

Tabela przedstawia typowe żądanie internetowe, w którym klient inicjuje uporządkowane zamknięcie. Pokazuje zmiany stanów punktów końcowych po uzgadnianiu, transferze danych i zdarzeniach kończących połączenie.

Typowe Połączenie (Klient inicjuje zamknięcie)

KrokZdarzenieStan KlientaStan Serwera
1Serwer rozpoczyna nasłuchiwanieCLOSEDLISTEN
2Klient łączy się, wysyła SYNSYN-SENTLISTEN
3Serwer odbiera SYN, wysyła SYN-ACKSYN-SENTSYN-RCVD
4Klient odbiera SYN-ACK, wysyła ACKESTABLISHEDSYN-RCVD
5Serwer odbiera ACK (Transfer danych)ESTABLISHEDESTABLISHED
6Aplikacja klienta zamyka, wysyła FINFIN-WAIT-1ESTABLISHED
7Serwer odbiera FIN, wysyła ACKFIN-WAIT-1CLOSE-WAIT
8Klient odbiera ACK dla swojego FINFIN-WAIT-2CLOSE-WAIT
9Aplikacja serwera zamyka, wysyła FINFIN-WAIT-2LAST-ACK
10Klient odbiera FIN, wysyła ACKTIME-WAITLAST-ACK
11Serwer odbiera ostatnie ACKTIME-WAITCLOSED
12Licznik 2MSL klienta wygasaCLOSEDCLOSED

Powiązane artykuły