Qual è lo scopo di TIME WAIT nella connessione TCP abbattuto?


12

Ho scoperto che il motivo per cui il vicino attivo entra in TEMPO ATTESA è quello di assicurarsi che l'ACK finale non venga perso. Ma come fa a sapere se l'ACK finale viene perso? Il vicino passivo rinvia nuovamente al FIN e quindi il vicino attivo sa che l'ACK è stato perso? Ecco una foto di TCP FSM.

TCP FSM



1
Questo post sul blog ha un'ottima risposta: vincent.bernat.im/en/blog/…
Warlike Chimpanzee,

Risposte:


5

Il vicino passivo rinvia nuovamente al FIN e quindi il vicino attivo sa che l'ACK è stato perso?

Sì. Citando da TCP / IP Illustrated Volume 1 , nella sezione Gestione connessione TCP:

  1. Per completare la chiusura, il segmento finale contiene un ACK per l'ultimo FIN. Notare che se un FIN viene perso, viene ritrasmesso fino a quando non viene ricevuto un ACK.

C'è un timeout. Quando dentro LAST_ACK, il vicino passivo rinvia nuovamente FINquando c'è un timeout, supponendo che sia stato perso. Se è stato effettivamente perso, il vicino attivo alla fine riceverà il ritrasmesso FINed entrerà TIME_WAIT. Se il FINnon è stato perso ma il finale è ACKstato perso, allora l'attivo più vicino è dentro TIME_WAITe riceve di FINnuovo. Quando ciò accade, ricevendo un FINin TIME_WAIT, ACKviene ritrasmesso.

Il valore di timeout in NONTIME_WAIT viene utilizzato ai fini della ritrasmissione. Quando si verifica un timeout , si presume che la finale sia stata consegnata correttamente perché il dispositivo di chiusura passivo non ha ritrasmesso i pacchetti. Quindi, il timeout è solo una quantità di tempo dopo il quale possiamo tranquillamente presumere che se l'altra estremità non ha inviato nulla, è perché ha ricevuto la finale e chiuso la connessione.TIME_WAITACKFINTIME_WAITACK


1

Ma come fa a sapere se l'ACK finale viene perso?

Perché non lo ha ricevuto entro il periodo di timeout. So che è una risposta "duh", ma è esattamente per questo che esistono questi stati e questi timeout.

Il vicino passivo rinvia nuovamente alla FIN

No. A meno che non arrivino ulteriori pacchetti per quel flusso e ciò comporterebbe l'invio di "RST" (reset).

L'intero processo è una macchina a stati complicata per eseguire un arresto ordinato nonostante la possibilità di guasti alla rete. Le reti si interrompono, i collegamenti subiscono errori, i collegamenti diventano saturi e devono eliminare pacchetti, i dispositivi non funzionano, ecc. Come esercizio, eseguire l'albero degli stati per una connessione attiva quando uno degli endpoint scompare (ad es. Mancanza di corrente).

TL; DR Quell'albero di stato è progettato per gestire tutte le possibili modalità di errore.


Grazie, ma sono ancora confuso sulla prima parte. Intendevo come il vicino attivo sa che l'ACK non è stato ricevuto dal vicino passivo? Quando il vicino passivo riceve l'ACK, abbatte semplicemente il suo lato della connessione e, se non riceve l'ACK, rimane solo nell'ULTIMO ACK, quindi come fa il vicino attivo a sapere se l'ACK è stato ricevuto?
czhao,

perché ci sono timer collegati ad ogni stato.
Ricky Beam,

Scusa, non capisco. In che modo questi timer dicono al vicino attivo che il vicino passivo non ha ricevuto l'ACK finale? ovvero, come fa il vicino attivo a sapere se deve rinviare l'ACK finale?
czhao,

0

Lo scopo di TIME_WAIT è consentire alla rete di distinguere i pacchetti che arrivano come appartenenti alla connessione "vecchia, esistente" da una nuova. La raccomandazione è di impostare il timer TIME_WAIT sul doppio della durata massima del segmento (MSL), sul mio sistema l'MSL è di 1 minuto, quindi le connessioni rimangono nello stato TIME_WAIT per 2 minuti.

Dopo questo intervallo di tempo, tutti i pacchetti che arrivano non sono più associati alla vecchia connessione.

TIME_WAIT non è atteso direttamente per l'invio di pacchetti ACK; guidato dagli stati CLOSE_WAIT e FIN_WAIT. Quando si arriva allo stato TIME_WAIT il socket è già chiuso.

Riferimenti: 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 /

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.