/etc/init.d/networking restart
Lasciami elaborare. Il protocollo TCP (Transmission Control Protocol) è progettato per essere un protocollo di trasmissione dati bidirezionale, ordinato e affidabile tra due punti finali (programmi). In questo contesto, il termine affidabile significa che ritrasmetterà i pacchetti se si perde nel mezzo. TCP garantisce l'affidabilità inviando indietro i pacchetti di riconoscimento (ACK) per un singolo o un intervallo di pacchetti ricevuti dal peer.
Lo stesso vale per i segnali di controllo come richiesta / risposta di terminazione. RFC 793 definisce lo stato TIME-WAIT come segue:
TIME-WAIT: rappresenta l'attesa del tempo sufficiente per assicurarsi che il TCP remoto abbia ricevuto il riconoscimento della sua richiesta di terminazione della connessione.
Vedi il seguente diagramma di stato TCP:
TCP è un protocollo di comunicazione bidirezionale, quindi quando viene stabilita la connessione, non c'è differenza tra client e server. Inoltre, uno può chiamare quits ed entrambi i peer devono concordare la chiusura per chiudere completamente una connessione TCP stabilita.
Chiamiamo il primo a chiamare le uscite come il più vicino attivo, e l'altro scruta il più vicino passivo. Quando il vicino attivo invia FIN, lo stato passa a FIN-WAIT-1. Quindi riceve un ACK per il FIN inviato e lo stato passa a FIN-WAIT-2. Una volta che riceve FIN anche dal più vicino passivo, il più vicino attivo invia l'ACK al FIN e lo stato passa a TIME-WAIT. Nel caso in cui il vicino passivo non abbia ricevuto l'ACK al secondo FIN, ritrasmetterà il pacchetto FIN.
RFC 793 imposta il TIME-OUT su due volte la durata massima del segmento o 2MSL. Poiché MSL, il tempo massimo che un pacchetto può spostarsi su Internet, è impostato su 2 minuti, 2MSL è 4 minuti. Poiché non esiste alcun ACK per un ACK, il dispositivo di chiusura attivo non può fare altro che attendere 4 minuti se aderisce correttamente al protocollo TCP / IP, nel caso in cui il mittente passivo non abbia ricevuto l'ACK nel proprio FIN (teoricamente) .
In realtà, i pacchetti mancanti sono probabilmente rari e molto rari se tutto accade all'interno della LAN o all'interno di una singola macchina.
Per rispondere alla domanda alla lettera, Come chiudere forzatamente un socket in TIME_WAIT ?, mi atterrò comunque alla mia risposta originale:
/etc/init.d/networking restart
In pratica, lo programmerei in modo che ignori lo stato TIME-WAIT usando l'opzione SO_REUSEADDR come menzionato WMR. Cosa fa esattamente SO_REUSEADDR?
Questa opzione socket dice al kernel che anche se questa porta è occupata (nello
stato TIME_WAIT), andare avanti e riutilizzarla comunque. Se è occupato, ma con un altro stato, otterrai comunque un indirizzo già in uso. È utile se il server è stato spento e quindi riavviato immediatamente mentre i socket sono ancora attivi sulla sua porta. Dovresti essere consapevole che se arrivano dati imprevisti, potrebbero confondere il tuo server, ma mentre ciò è possibile, è improbabile.
TIME_WAIT
sul server" , salta semplicemente le prime tre risposte che evitano la domanda invece di rispondere.