2009-04-22 12 views
27

En la programación de red en Unix, siempre configuré la opción SO_REUSEADDR en el socket que usa el servidor para escuchar las conexiones. Esto básicamente dice que se puede abrir otro socket en el mismo puerto de la máquina. Esto es útil cuando se recupera de un bloqueo y el socket no se cerró correctamente: la aplicación se puede reiniciar y simplemente abrirá otra toma en el mismo puerto y continuará escuchando.Usando SO_REUSEADDR - ¿Qué sucede con el socket abierto anteriormente?

Mi pregunta es, ¿qué pasa con el viejo socket? Sin duda, todos los datos/conexiones se recibirán en el antiguo socket. ¿Se cierra automáticamente por el sistema operativo?

+1

Para aclarar: después de un programa se bloquea, el sistema operativo, p. Linux Kernel, cerrará el socket automáticamente. Hay razones de protocolo (TCP) por las que no desea volver a abrir una conexión de inmediato. – unixman83

+2

A debe leer sobre este tema: http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html –

Respuesta

24

Sí, el sistema operativo cierra automáticamente el socket anterior cuando finaliza el proceso anterior. La razón por la que normalmente no puede escuchar en el mismo puerto de inmediato es porque el socket, aunque está cerrado, permanece en el estado 2MSL durante algún tiempo (generalmente unos minutos). El sistema operativo automáticamente transiciona el socket anterior de este estado cuando expira el tiempo de espera.

+0

Ahh. . por supuesto. El socket es solo un identificador de archivo y el sistema operativo lo limpiará. Muchas gracias :) – Naren

+4

Para ser precisos, el punto final TCP permanece en el estado 2MSL. El socket se ha ido. –

+1

El período de espera se agregó a la especificación por un motivo. El uso de SO_REUSEADDR hace que la pila TCP viole el período de espera. (Su estado 2MSL) – unixman83

29

Un socket se considera cerrado cuando el programa que lo estaba utilizando se muere. Eso es manejado por el sistema operativo, y el sistema operativo se negará a aceptar cualquier otra comunicación de la conversación muerta. Sin embargo, si el socket se cerró inesperadamente, la computadora en el otro extremo podría no saber que la conversación terminó, y aún puede estar intentando comunicarse.

Es por eso que hay, diseñado en la especificación TCP, un período de espera antes de que ese mismo número de puerto pueda reutilizarse. Porque, en teoría, aunque poco probable, es posible que un paquete de la conversación anterior llegue con la dirección IP, los números de puerto y los números de secuencia apropiados, de forma tal que el servidor receptor los inserte por equivocación en el flujo TCP incorrecto.

La opción SO_REUSEADDR anula ese comportamiento, lo que le permite reutilizar el puerto de inmediato. Efectivamente, usted está diciendo: "Entiendo los riesgos y me gustaría utilizar el puerto de todos modos".

Cuestiones relacionadas