Estou executando um servidor TCP em um Debian Jessie Kernel 3.16.43 na porta TCP / 12000.
Os clientes são dispositivos embarcados com uma porta de origem TCP fixa, digamos TCP / 4444. Esses clientes podem reiniciar espontaneamente.
Quando isso acontece, o cliente tenta se reconectar usando a mesma porta de origem, então o servidor vê um SYN de um TCP 5-tuple (protocolo, sPort, sIP, dPort, dIP) que já possui um estado ESTABLISHED, então silenciosamente deixa cair o SYN e o cliente não pode nunca reconectar desde que não tenha uma resposta SYN / ACK.
O traço é como este:
CLIENT:4444 > SERVER:12000: Flags [S], seq 1370945135, win 65535, length 0
SERVER:12000 > CLIENT:4444: Flags [S.], seq 4061049304, ack 1370945136, win 28960, length 0
CLIENT:4444 > SERVER:12000: Flags [.], ack 1, win 4117, length 0
[DATA EXCHANGE]
[CLIENT SUDDENLY REBOOT]
CLIENT:4444 > SERVER:12000: Flags [S], seq 3951772541, win 65535, length 0
CLIENT:4444 > SERVER:12000: Flags [S], seq 3951772541, win 65535, length 0
CLIENT:4444 > SERVER:12000: Flags [S], seq 3951772541, win 65535, length 0
CLIENT:4444 > SERVER:12000: Flags [S], seq 3951772541, win 65535, length 0
CLIENT:4444 > SERVER:12000: Flags [S], seq 3951772541, win 65535, length 0
CLIENT:4444 > SERVER:12000: Flags [S], seq 3951772541, win 65535, length 0
[CLIENT KEEPS TRYING THE HANDSHAKE AND SERVER KEEPS DROPING THE SYN]
Eu acho que esse comportamento deve ser assim, porque se não, um SYN forjado pode fechar uma conexão TCP existente. Mas eu não tenho certeza sobre isso ...
Qualquer solução razoável para este cenário? Alguma idéia sobre se isso pode ser resolvido modificando as configurações TCP do Linux?