Parâmetros TCP keep-alive não sendo honrados

4

Eu tenho um servidor em execução na minha caixa do Linux, também no qual os seguintes comandos foram executados:

$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

Meu servidor escuta na porta 58080, e eu crio uma conexão nele tendo definido o TCP keep-alive em meu código. Eu então configurei o Wireshark traçando essa conexão; uma captura de tela da saída é mostrada abaixo:

Você pode ver que o primeiro pacote keep-alive é enviado após 7200 segundos ou 2 horas como esperado (o valor de 'tcp_keepalive_time'). No entanto, eu também esperaria que cada teste fosse enviado em 75 segundos (o valor de 'tcp_keepalive_intvl'); o que eu vejo é que cada sonda é enviada em 2 horas.

Alguém pode me dizer por que minha opção de configuração para 'tcp_keepalive_intvl' não está sendo honrada?

UPDATE

Parece que especificar um intervalo de keep-alive maior que o tempo de keep-alive resulta no tempo de intervalo sendo respeitado ...

    
por Wad 11.03.2017 / 22:19

2 respostas

1

Após a discussão com um colega super inteligente, achamos que descobrimos o que está errado, mas ainda estamos para provar isso. O que provavelmente está acontecendo é que o intervalo keep-alive só é levado em conta quando nenhum ACK de keep-alive é recebido. Assim, após 2 horas, se nenhum ACK fosse recebido para este primeiro pacote de manutenção, um segundo pacote seria enviado após 75 segundos e repetidamente em intervalos de 75 segundos até que um ACK fosse recebido.

Acontece que a razão pela qual o intervalo é levado em conta somente quando é maior do que o tempo de manutenção é devido à maneira como o mecanismo keep-alive do Linux funciona, como descrito em meu outra pergunta .

    
por 15.03.2017 / 16:48
0

De fato, da documentação :

tcp_keepalive_time

the interval between the last data packet sent (simple ACKs are not considered data) and the first keepalive probe; after the connection is marked to need keepalive, this counter is not used any further

tcp_keepalive_intvl

the interval between subsequential keepalive probes, regardless of what the connection has exchanged in the meantime

tcp_keepalive_probes

the number of unacknowledged probes to send before considering the connection dead and notifying the application layer

    
por 04.12.2018 / 21:13

Tags