Pregunta

¿Por qué las conexiones TCP a una interfaz loopback terminan en TIME_WAIT (socket cerrado con SO_DONTLINGER establecido), pero las conexiones idénticas a un host diferente no terminan en TIME_WAIT (se restablecen / destruyen inmediatamente)

Aquí hay escenarios para ilustrar:

(A) Dos aplicaciones, un cliente y un servidor, se ejecutan en la misma máquina con Windows. El cliente se conecta al servidor a través de la interfaz de bucle invertido del servidor (127.0.0.1, puerto xxxx), envía datos, recibe datos y cierra el socket (se establece SO_DONTLINGER ).

Digamos que las conexiones son muy de corta duración, por lo que la aplicación cliente está estableciendo y destruyendo una gran cantidad de conexiones cada segundo. El resultado final es que los sockets terminan en TIME_WAIT , y el cliente finalmente agota su número máximo de sockets (en Windows, esto es ~ 3900 por defecto, y estamos asumiendo que este valor no será cambiado en el registro).

(B) Las mismas dos aplicaciones que el escenario (A), pero el servidor está en un host diferente (el cliente todavía se está ejecutando en Windows). Las conexiones son idénticas en todos los sentidos, excepto que no están destinadas a 127.0.0.1, sino a alguna otra IP. Aquí las conexiones en la máquina cliente NO entran en TIME_WAIT , y la aplicación cliente puede continuar haciendo conexiones indefinidamente.

¿Por qué la discrepancia?

¿Fue útil?

Solución

El estado TIME_WAIT solo ocurre en un extremo de la conexión, el final que se cierra primero. Para la interfaz de bucle invertido, ambos extremos están en la misma máquina, por lo que siempre verá TIME_WAIT.

En su otro caso, intente mirar la otra máquina. Creo que verá los sockets TIME_WAIT allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top