Por padrão, quando ambos tcp_tw_reusee tcp_tw_recycleestão desabilitados, o kernel assegura que os soquetes no TIME_WAITestado 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_WAITestado 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_WAITestado) 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 SYNpacote 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_WAITsoquete provavelmente terá expirado, portanto, isso não será um problema);
- o endereço IP é rapidamente reutilizado por outra coisa (as
TIME_WAITconexões permanecem um pouco, mas outras conexões provavelmente serão atingidas TCP RSTe 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_WAITbucket 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_recyclepaz, mas ativar tcp_tw_reusee diminuirtcp_timewait_len . Eu concordo :-)