Para las simulaciones de catástrofes de red de nuestro entorno de servidor, estamos buscando una manera de expirar intencionalmente un socket TCP. ¿Hay formas simples de enchufes existentes? Además, el pequeño programa de casos de prueba C sería una ventaja.
Ya hemos intentado desactivar las interfaces de red durante la lectura del búfer TCP y la lectura de recursos montados desconectados (samba).
Nuestro servidor de prueba es Ubuntu 12.04.4.
/proc/sys/net/ipv4/tcp_keepalive_time
a un número muy pequeñoncat -v
para ver quéncat
está haciendo exactamente . Me tomó 2m7.291s en una instalación vainilla de Ubuntu 12.04 a tiempo de esperaLa primera respuesta es correcta, pero he descubierto cómo funcionan estos tiempos de espera, para que pueda observarlos y probarlos (¡no olvide bloquear el puerto!).
Hay 4 parámetros de kernel más interesantes que tratan con los tiempos de espera de TCP:
Ahora hay 2 escenarios:
El socket se abre e intenta transmitir; luego (si no hay respuesta del otro lado), el sistema vuelve a intentarlo
tcp_retries2
. Con el valor predeterminado de retiros, se tarda más de 2 minutos y el socket agota el tiempo de espera.El zócalo está abierto e inactivo, entonces los límites de actividad son interesantes. Con un sistema de socket inactivo esperará
tcp_keepalive_time
segundos, y luego intentetcp_keepalive_probes
enviar un TCP KEEPALIVE en intervalos detcp_keepalive_intvl
segundos. Y solo después de eso, todo falla, el tiempo de espera se agota.fuente
netstat -o