/etc/init.d/networking restart
Permítanme que me explaye. El Protocolo de Control de Transmisión (TCP) está diseñado para ser un protocolo de transmisión de datos bidireccional, ordenado y fiable entre dos puntos finales (programas). En este contexto, el término fiable significa que retransmitirá los paquetes si se pierden en el medio. TCP garantiza la fiabilidad mediante el envío de paquetes de acuse de recibo (ACK) para un solo paquete o un rango de paquetes recibidos del compañero.
Lo mismo ocurre con las señales de control, como la solicitud/respuesta de terminación. RFC 793 define el estado TIME-WAIT de la siguiente manera:
TIME-WAIT - representa la espera de tiempo suficiente para estar seguro de que que el TCP remoto ha recibido el acuse de recibo de su conexión solicitud de finalización de la conexión.
Véase el siguiente diagrama de estado de 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 llamar a la salida, y ambos pares necesitan estar de acuerdo en el cierre para cerrar completamente una conexión TCP establecida.
Llamemos al primero que se retira como el cerrador activo, y al otro par el 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 de FIN y el estado pasa a TIME-WAIT. En caso de que el cerrador pasivo no haya recibido el ACK de la segunda FIN, retransmitirá el paquete FIN.
RFC 793 establece que el TIEMPO DE SALIDA sea el doble del Tiempo Máximo de Vida del Segmento, o 2MSL. Como el MSL, el tiempo máximo que un paquete puede vagar por Internet, está fijado en 2 minutos, 2MSL es 4 minutos. Como no hay ACK a un ACK, el cerrador activo no puede hacer otra cosa que esperar 4 minutos si se adhiere al protocolo TCP/IP correctamente, por si el emisor pasivo no ha recibido el ACK a su FIN (teóricamente).
En realidad, los paquetes perdidos son probablemente raros, y muy raros si todo ocurre dentro de la LAN o dentro de una sola máquina.
Para responder a la pregunta textualmente, ¿Cómo a la fuerza cerrar un socket en TIME_WAIT?, seguiré manteniendo mi respuesta original:
/etc/init.d/networking restart
En la práctica, yo lo programaría para que ignore el estado TIME-WAIT 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), siga adelante y reutilizarlo de todos modos. Si está ocupado, pero con otro estado, todavía obtendrá un error de dirección ya en uso. Es es útil si su servidor ha sido apagado y luego se reinicia de inmediato mientras los sockets están todavía activos en su puerto. Debe tener en cuenta que si datos inesperados, puede confundir a su servidor. confundir a su servidor, pero aunque esto es posible, no es probable.
1 votos
Si está aquí por "demasiados
TIME_WAIT
en el servidor" , sólo saltar a través de las tres primeras respuestas que evitan la pregunta en lugar de responderla.0 votos
Acepté lo que era la 4ª respuesta por lo que debería estar en la parte superior ahora
0 votos
Enlace cruzado: pregunta relacionada en Stack Overflow: c - Error: Address already in use while binding socket with address but the port number is shown free by
netstat
- Stack Overflow