Um soquete em TIME-WAIT
aceitará de bom grado uma nova conexão de um dispositivo usando a mesma tupla 5 (protocolo, IP de origem, porta de origem, destino, porta de destino), desde que o Número de Sequência Inicial (ISN) do novo a conexão é maior do que o último número de sequência visto na conexão anterior. De acordo com a RFC 1122 :
When a connection is closed actively, it MUST linger in TIME-WAIT state for a time 2xMSL (Maximum Segment Lifetime). However, it MAY accept a new SYN from the remote TCP to reopen the connection directly from TIME-WAIT state, if it:
(1) assigns its initial sequence number for the new connection to be larger than the largest sequence number it used on the previous connection incarnation, and
(2) returns to TIME-WAIT state if the SYN turns out to be an old duplicate.
Você pode testar isso em uma máquina Linux definindo seu intervalo de portas efêmeras para uma única porta echo 32769 32769 > /proc/sys/net/ipv4/ip_local_port_range
e, em seguida, fazendo várias solicitações consecutivas para um site com o conjunto de cabeçalhos Connection: Close
HTTP wget --no-http-keep-alive www.example.com
. Mesmo que a 5 tupla de todas as suas conexões seja a mesma, o servidor aceitará as novas conexões enquanto estiver no TIME-WAIT, porque o ISN de cada nova conexão deve ser maior que o número de sequência visto pela última vez no soquete. No Linux, o ISN de uma nova conexão deve estar aumentando constantemente - está um pouco preso ao clock do sistema.
Se tiver certeza de que TIME-WAIT está sempre terminando no lado do servidor e você não consegue se conectar quando suas portas efêmeras são reutilizadas, o ISN usado pelo seu cliente não deve aumentar para cada nova conexão (talvez está sendo escolhido aleatoriamente ou sempre usa o mesmo valor?). Se você puder garantir que cada nova conexão do seu cliente use um valor ISN mais alto que o anterior, será possível conectar-se sem problemas.