Por defecto, cuando ambos tcp_tw_reuse
y tcp_tw_recycle
están desactivadas, el núcleo se asegurará de que las tomas en TIME_WAIT
estado permanecerán en ese estado el tiempo suficiente - el tiempo suficiente para asegurarse de que los paquetes que pertenecen a las conexiones futuras no ser confundido con fines de paquetes de la conexión antigua.
Cuando habilita tcp_tw_reuse
, los sockets en TIME_WAIT
estado se pueden usar antes de que caduquen, y el núcleo intentará asegurarse de que no haya colisión con respecto a los números de secuencia TCP. Si habilita tcp_timestamps
(también conocido como PAWS, para Protección contra números de secuencia envueltos), se asegurará de que esas colisiones no puedan ocurrir. Sin embargo, necesita que las marcas de tiempo TCP estén habilitadas en ambos extremos (al menos, eso entiendo). Vea la definición de tcp_twsk_unique para los detalles sangrientos.
Cuando habilita tcp_tw_recycle
, el núcleo se vuelve mucho más agresivo y hará suposiciones sobre las marcas de tiempo utilizadas por los hosts remotos. Rastreará la última marca de tiempo utilizada por cada host remoto que tenga una conexión en TIME_WAIT
estado) y permitirá reutilizar un socket si la marca de tiempo ha aumentado correctamente. Sin embargo, si la marca de tiempo utilizada por el host cambia (es decir, se deforma en el tiempo), el SYN
paquete se descartará silenciosamente y la conexión no se establecerá (verá un error similar al "tiempo de espera de conexión"). Si desea sumergirse en el código del kernel, la definición de tcp_timewait_state_process podría ser un buen punto de partida.
Ahora, las marcas de tiempo nunca deben retroceder en el tiempo; a no ser que:
- el host se reinicia (pero luego, cuando vuelva a funcionar, el
TIME_WAIT
socket probablemente haya expirado, por lo que no será un problema);
- la dirección IP se reutiliza rápidamente por otra cosa (las
TIME_WAIT
conexiones se mantendrán un poco, pero otras conexiones probablemente se activarán TCP RST
y eso liberará algo de espacio);
- la traducción de la dirección de red (o un firewall de smarty-pants) está involucrada en el medio de la conexión.
En el último caso, puede tener varios hosts detrás de la misma dirección IP y, por lo tanto, diferentes secuencias de marcas de tiempo (o dichas marcas de tiempo se asignan al azar en cada conexión por el firewall). En ese caso, algunos hosts no podrán conectarse aleatoriamente, porque están asignados a un puerto para el cual el TIME_WAIT
depósito del servidor tiene una marca de tiempo más nueva. Es por eso que los documentos le dicen que "los dispositivos NAT o los equilibradores de carga pueden comenzar a soltar cuadros debido a la configuración".
Algunas personas recomiendan dejarlo tcp_tw_recycle
solo, pero habilitan tcp_tw_reuse
y bajantcp_timewait_len
. Estoy de acuerdo :-)