Domanda

Perché le connessioni TCP a un'interfaccia di loopback finiscono in TIME_WAIT (socket chiuso con SO_DONTLINGER impostato), ma connessioni identiche a un host diverso non finiscono in TIME_WAIT (vengono ripristinati / distrutti immediatamente)? ??

Ecco alcuni scenari da illustrare:

(A) Due applicazioni, un client e un server, sono entrambe in esecuzione sullo stesso computer Windows. Il client si connette al server tramite l'interfaccia di loopback del server (127.0.0.1, porta xxxx), invia dati, riceve dati e chiude il socket ( SO_DONTLINGER è impostato).

Diciamo che le connessioni hanno molto di breve durata, quindi l'app client sta stabilendo e distruggendo un gran numero di connessioni ogni secondo. Il risultato finale è che i socket finiscono in TIME_WAIT , e il client alla fine esaurisce il suo numero massimo di socket (su Windows, questo è ~ 3900 per impostazione predefinita, e stiamo assumendo che questo valore non sarà modificato nel registro).

(B) Stesse due applicazioni dello scenario (A), ma il server si trova su un host diverso (il client è ancora in esecuzione su Windows). Le connessioni sono identiche in ogni modo, tranne per il fatto che non sono destinate a 127.0.0.1, ma invece ad altri IP. Qui le connessioni sul computer client NON vanno in TIME_WAIT e l'app client può continuare a stabilire connessioni indefinitamente.

Perché la discrepanza?

È stato utile?

Soluzione

Lo stato TIME_WAIT si verifica solo a un'estremità della connessione, che si chiude per prima. Per l'interfaccia di loopback entrambe le estremità sono sullo stesso computer, quindi vedrai sempre TIME_WAIT.

Nell'altro caso, prova a guardare l'altro computer. Penso che vedrai lì le prese TIME_WAIT.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top