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艅.

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)

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
    Maszyna stan贸w TCP | Teleinf Edu