Por padrão, quando ambos tcp_tw_reuse
e tcp_tw_recycle
estão desabilitados, o kernel assegura que os soquetes no TIME_WAIT
estado permaneçam nesse estado por tempo suficiente - tempo suficiente para garantir que os pacotes pertencentes a conexões futuras não sejam confundidos com pacotes atrasados da conexão antiga.
Quando você habilita tcp_tw_reuse
, os soquetes em TIME_WAIT
estado podem ser usados antes que expirem, e o kernel tenta garantir que não haja colisão em relação aos números de sequência TCP. Se você habilitar tcp_timestamps
(também conhecido como PAWS, para Proteção contra números de sequência agrupados), garantirá que essas colisões não ocorram. No entanto, você precisa que os registros de data e hora do TCP estejam ativados nas duas extremidades (pelo menos, esse é o meu entendimento). Veja a definição de tcp_twsk_unique para os detalhes sangrentos.
Quando você ativa tcp_tw_recycle
, o kernel se torna muito mais agressivo e faz suposições sobre os carimbos de data / hora usados pelos hosts remotos. Ele rastreará o último registro de data e hora usado por cada host remoto com uma conexão no TIME_WAIT
estado) e permitirá reutilizar 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, voltar ao tempo), o SYN
pacote será descartado silenciosamente e a conexão não será estabelecida (você verá um erro semelhante ao "tempo limite da 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 carimbos de data e hora nunca devem voltar no tempo; a menos que:
- o host é reiniciado (mas, quando voltar a funcionar, o
TIME_WAIT
soquete provavelmente terá expirado, portanto, isso não será um problema);
- o endereço IP é rapidamente reutilizado por outra coisa (as
TIME_WAIT
conexões permanecem um pouco, mas outras conexões provavelmente serão atingidas TCP 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.
Neste último caso, você pode ter vários hosts atrás do mesmo endereço IP e, portanto, diferentes seqüências de carimbos de data / hora (ou, os referidos carimbos de hora são randomizados em cada conexão pelo firewall). Nesse caso, alguns hosts não poderão se conectar aleatoriamente, porque eles são mapeados para uma porta para a qual o TIME_WAIT
bucket do servidor possui um carimbo de data / hora mais recente. É por isso que os documentos informam que "dispositivos NAT ou balanceadores de carga podem começar a soltar quadros por causa da configuração".
Algumas pessoas recomendam deixar em tcp_tw_recycle
paz, mas ativar tcp_tw_reuse
e diminuirtcp_timewait_len
. Eu concordo :-)