/etc/init.d/networking restart
Déjame elaborar. El Protocolo de control de transmisión (TCP) está diseñado para ser un protocolo de transmisión de datos bidireccional, ordenado y confiable entre dos puntos finales (programas). En este contexto, el término confiable significa que retransmitirá los paquetes si se pierde en el medio. TCP garantiza la confiabilidad al devolver los paquetes de acuse de recibo (ACK) para un solo paquete o un rango de paquetes recibidos del par.
Esto es igual para las señales de control, como la solicitud / respuesta de terminación. RFC 793 define el estado de ESPERA DE TIEMPO como el siguiente:
TIME-WAIT: representa esperar el tiempo suficiente para asegurarse de que el TCP remoto recibió el acuse de recibo de su solicitud de finalización de la conexión.
Consulte el siguiente diagrama de estado TCP:
TCP es un protocolo de comunicación bidireccional, por lo que cuando se establece la conexión, no hay diferencia entre el cliente y el servidor. Además, cualquiera de los dos puede dejar de fumar y ambos pares deben acordar el cierre para cerrar completamente una conexión TCP establecida.
Llamemos al primero para llamar a los abandonos como el cerrador activo, y el otro mira al cerrador pasivo. Cuando el cerrador activo envía FIN, el estado pasa a FIN-WAIT-1. Luego recibe un ACK por el FIN enviado y el estado pasa a FIN-WAIT-2. Una vez que recibe FIN también del cerrador pasivo, el cerrador activo envía el ACK al FIN y el estado pasa a ESPERA DE TIEMPO. En caso de que el cerrador pasivo no haya recibido el ACK al segundo FIN, retransmitirá el paquete FIN.
RFC 793 establece que el TIEMPO DE ESPERA sea el doble de la vida útil máxima del segmento, o 2MSL. Dado que MSL, el tiempo máximo que un paquete puede deambular por Internet, se establece en 2 minutos, 2MSL es de 4 minutos. Como no hay ACK en un ACK, el cerrador activo no puede hacer nada más que esperar 4 minutos si se adhiere correctamente al protocolo TCP / IP, en caso de que el remitente pasivo no haya recibido el ACK en su FIN (en teoría) .
En realidad, los paquetes perdidos son probablemente raros, y muy raros si todo sucede dentro de la LAN o dentro de una sola máquina.
Para responder la pregunta al pie de la letra, ¿Cómo cerrar a la fuerza un socket en TIME_WAIT ?, aún me atendré a mi respuesta original:
/etc/init.d/networking restart
Hablando prácticamente, lo programaría para que ignore el estado de ESPERA DE TIEMPO usando la opción SO_REUSEADDR como mencionó WMR. ¿Qué hace exactamente SO_REUSEADDR?
Esta opción de socket le dice al kernel que incluso si este puerto está ocupado (en
el estado TIME_WAIT), continúe y reutilícelo de todos modos. Si está ocupado, pero con otro estado, aún obtendrá una dirección de error en uso. Es útil si su servidor se apagó y luego se reinició de inmediato mientras los sockets aún están activos en su puerto. Debe tener en cuenta que si ingresa información inesperada, puede confundir a su servidor, pero si bien es posible, no es probable.
TIME_WAIT
en el servidor" , omita las tres primeras respuestas que evitan la pregunta en lugar de responderla.