2010-09-17 14 views
8

Estoy escribiendo un servidor HTTP simple y aprendiendo sobre TIME_WAIT. ¿Cómo manejan los servidores web reales en ambientes pesados ​​las solicitudes de miles de usuarios sin que todos los sockets se bloqueen en TIME_WAIT después de que se maneja una solicitud? (No preguntar sobre keep-alive - eso ayudaría a un solo cliente, pero no a miles de clientes diferentes).¿Cómo evitan los servidores web TIME_WAIT?

He leído que intenta hacer que el cliente cierre primero, para que todos los TIME_WAIT se distribuyan entre todos los clientes, en lugar de concentrarse en el servidor.

¿Cómo se hace esto? En algún momento, el servidor tiene que llamar close/closesocket.

Respuesta

9

El par que inicia el cierre activo es el que entra en TIME_WAIT. Entonces, mientras el cliente cierre la conexión, el cliente obtiene el TIME_WAIT y no el servidor. Voy a todo esto en un poco más de detalle in this blog posting.

+0

Entonces, ¿el servidor simplemente espera y espera a que el cliente cierre? Creo que en algún momento querría desconectar y cerrar la conexión. – DougN

+0

Lo que me hace pensar en otra pregunta :) ¿Crees que un servidor web real (IIS/Apache?) Simplemente llama a seleccionar en el socket con un tiempo de espera de 5 (?) Segundos, suponiendo que debe haber suficiente tiempo para que el cliente desconectar (y dejar de seleccionar devolver con un socket de error)? – DougN

+3

Si restablece la conexión en lugar de cerrarla, tampoco terminará en TIME_WAIT. Por lo tanto, si desea agregar un tiempo de espera para las conexiones inactivas, las cerraría primero apagando el retardo y luego emitiendo el cierre. Esto enviaría un RST y no terminarías en TIME_WAIT. –

Cuestiones relacionadas