Por padrão, quando ambos tcp_tw_reuse
e tcp_tw_recycle
estão desabilitados, o kernel se certificará de que os sockets em TIME_WAIT
state permanecerão nesse estado por tempo suficiente - tempo suficiente para garantir que os pacotes pertencentes a futuras conexões não será confundido com pacotes atrasados da conexão antiga.
Quando você ativa tcp_tw_reuse
, os sockets em TIME_WAIT
state podem ser usados antes de expirarem, e o kernel tentará certificar-se de que não haja colisão em relação aos números de seqüência do TCP. Se você habilitar tcp_timestamps
(a.k.a. PAWS, para Proteção Contra Números de Seqüência Envolvidos), ele fará com que essas colisões não aconteçam. No entanto, você precisa que os timestamps TCP sejam ativados em ambos (pelo menos, esse é o meu entendimento). Veja a definição de tcp_twsk_unique para detalhes sangrentos.
Quando você ativa tcp_tw_recycle
, o kernel se torna muito mais agressivo e faz suposições sobre os timestamps usados pelos hosts remotos. Ele rastreará o último registro de data e hora usado por cada host remoto com uma conexão em TIME_WAIT
state) e permitirá a reutilização de um soquete se o registro de data e hora tiver aumentado corretamente. No entanto, se o registro de data e hora usado pelo host for alterado (ou seja, de volta no tempo), o pacote SYN
será silenciosamente descartado e a conexão não será estabelecida (você verá um erro semelhante a "tempo limite de conexão"). Se você quiser mergulhar no código do kernel, a definição de tcp_timewait_state_process pode ser um bom ponto de partida.
Agora, os timestamps nunca devem voltar no tempo; a menos que:
- o host é reinicializado (mas, quando ele voltar,
TIME_WAIT
socket provavelmente terá expirado, portanto, não será um problema); - o endereço IP é reutilizado rapidamente por outra coisa (
TIME_WAIT
conexões ficarão um pouco, mas outras conexões provavelmente serão atingidas porTCP RST
e isso liberará algum espaço); - A tradução de endereços de rede (ou um firewall inteligente) está envolvida no meio da conexão.
No último caso, você pode ter vários hosts atrás do mesmo endereço IP e, portanto, sequências diferentes de registros de data e hora (ou, esses registros de tempo são randomizados em cada conexão pelo firewall). Nesse caso, alguns hosts serão aleatoriamente incapazes de se conectar, porque eles são mapeados para uma porta para a qual o intervalo TIME_WAIT
do servidor possui um registro de data e hora mais recente. É por isso que os documentos informam que "os dispositivos NAT ou os balanceadores de carga podem começar a eliminar quadros devido à configuração".
Algumas pessoas recomendam a deixar apenas tcp_tw_recycle
, mas ativar tcp_tw_reuse
e diminuir tcp_timewait_len
. Eu concordo: -)