Do czego służy funkcja CZAS OCZEKIWANIA w zrywaniu połączenia TCP?

12

Odkryłem, że powodem, dla którego aktywna osoba zbliża się do CZASU OCZEKIWANIA, jest upewnienie się, że końcowe potwierdzenie nie zostanie utracone. Ale skąd ma wiedzieć, czy końcowe ACK zostało utracone? Czy pasywnie bliżej ponownie wyśle ​​FIN, a następnie aktywny bliżej wie, że ACK zostało utracone? Oto zdjęcie TCP FSM.

TCP FSM

czhao
źródło
TCP
Craig Constantine
1
Ten post na blogu ma świetną odpowiedź: vincent.bernat.im/en/blog/…
Warlike Chimpanzee

Odpowiedzi:

5

Czy pasywnie bliżej ponownie wyśle ​​FIN, a następnie aktywny bliżej wie, że ACK zostało utracone?

Tak. Cytowanie z ilustrowanego tomu 1 TCP / IP w sekcji Zarządzanie połączeniami TCP:

  1. Aby zakończyć zamknięcie, ostatni segment zawiera potwierdzenie dla ostatniego FIN. Pamiętaj, że jeśli FIN zostanie utracone, jest ono przesyłane ponownie, dopóki nie zostanie odebrane potwierdzenie ACK.

Upłynął limit czasu. Po LAST_ACKwejściu pasywne zbliżenie zostanie ponownie wysłane, FINgdy upłynie limit czasu, zakładając, że zostało utracone. Jeśli rzeczywiście został zgubiony, aktywny bliżej w końcu odbierze retransmisję FINi wejdzie TIME_WAIT. Jeśli FINnie został utracony, ale finał ACKzostał utracony, aktywny bliżej jest w TIME_WAITśrodku i odbiera FINponownie. Kiedy to nastąpi - Odbieranie FINw TIME_WAIT- w ACKjest retransmitowany.

Wartość limitu czasu w NIETIME_WAIT jest używana do celów retransmisji. Kiedy upłynie limit czasu , zakłada się, że finał został pomyślnie dostarczony, ponieważ pasywne zbliżenie nie retransmitowało pakietów. Tak więc limit czasu to tylko czas, po którym możemy bezpiecznie założyć, że jeśli drugi koniec niczego nie wysłał, to dlatego, że otrzymał końcową i zamknął połączenie.TIME_WAITACKFINTIME_WAITACK

Filipe Gonçalves
źródło
1

Ale skąd ma wiedzieć, czy końcowe ACK zostało utracone?

Ponieważ nie otrzymano go w terminie. Wiem, że to odpowiedź „duh”, ale właśnie dlatego te stany i limity czasu istnieją.

Czy pasywnie bliżej ponownie wyśle ​​FIN

Nie, chyba że do tego strumienia dotrą kolejne pakiety, a to spowoduje wysłanie „RST” (reset).

Cały proces jest skomplikowanym stanem maszyny do wykonania uporządkowanego zamknięcia pomimo możliwości awarii sieci. Sieci ulegają awarii, łącza występują błędy, łącza stają się nasycone i muszą upuszczać pakiety, urządzenia ulegają awarii itp. W ramach ćwiczenia uruchom drzewo stanu dla aktywnego połączenia, gdy jeden z punktów końcowych po prostu zniknie (np. Awaria zasilania).

TL; DR To drzewo stanów jest zaprojektowane do obsługi każdego możliwego trybu awarii.

Ricky Beam
źródło
Dzięki, ale nadal jestem zdezorientowany co do pierwszej części. Miałem na myśli, skąd aktywny bliżej wie, że ACK nie został odebrany przez pasywną bliższą? Kiedy pasywne zbliżenie odbiera ACK, po prostu zrywa swoją stronę połączenia, a jeśli nie otrzymuje ACK, pozostaje w OSTATNIEJ ACK, więc skąd aktywny bliżej wie, czy ACK został odebrany?
czhao
ponieważ do każdego stanu są podłączone liczniki czasu.
Ricky Beam
Przepraszam, nie rozumiem. W jaki sposób te liczniki czasu informują aktywnego bliżej, że pasywny bliższy nie otrzymał ostatecznego potwierdzenia? tzn. skąd aktywny bliżej wie, czy musi ponownie wysłać końcowe potwierdzenie?
czhao
0

Celem TIME_WAIT jest umożliwienie sieci rozróżnienia pakietów, które przychodzą jako należące do „starego, istniejącego” połączenia od nowego. Zaleca się ustawienie timera TIME_WAIT na dwukrotność maksymalnego czasu życia segmentu (MSL), w moim systemie MSL wynosi 1 minutę, więc połączenia pozostają w stanie TIME_WAIT przez 2 minuty.

Po tym czasie przychodzące pakiety nie są już powiązane ze starym połączeniem.

TIME_WAIT nie jest bezpośrednio oczekiwany na wysyłanie pakietów ACK; sterowane stanami CLOSE_WAIT i FIN_WAIT. Po przejściu do stanu TIME_WAIT gniazdo jest już zamknięte.

Odnośniki: http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_segment_lifetime http://www.lognormal.com/blog/2012/09/27/ linux-tcpip-tuning /

Neil Katin
źródło