Por que o Windows 7 / PuTTY descarta conexões TCP mesmo em interrupções muito breves?

13

Eu tenho uma pequena rede local que usa um WiFi cativo e uso ssh no OS X com -oServerAliveInterval=240 e PuTTY 0.62 no Windows 7 Professional para estabelecer conexões com meu Linode, Hetzner e outros servidores.

Com o PuTTY, seleciono ConnectionSending of null packets to keep session active para 240. O Enable TCP keepalives (SO_KEEPALIVE option) está desativado, de acordo com os padrões.

Quando minha internet está temporariamente inativa por cerca de um minuto (tenho que autenticar novamente no portal cativo), o PuTTY quase sempre perde todas as sessões ssh abertas que eu tenho, e especialmente aquelas onde havia qualquer tipo de atividade, mas OpenSSH no OS X nunca perde nenhuma sessão, desde que a minha rede esteja de volta dentro de um minuto ou dois, mesmo que eu tente digitar algo no ssh, e não veja resposta durante os 60 segundos ou mais, até que minha conexão esteja ativa novamente. (Então eu sei com certeza que os estados NAT estão sempre preservados.)

Posso impedir que o Windows / PuTTY descarte preventivamente boas conexões?

Parece-me que SO_KEEPALIVE ou algo assim está realmente ativado no Windows, e o tempo limite para detectar conexões obsoletas é muito pequeno. Eu gostaria de aumentá-lo para algo mais do que alguns segundos, da mesma forma como o OS X é imune a essas breves interrupções temporárias, desde que a interrupção seja de apenas alguns segundos e esteja abaixo do valor de -oServerAliveInterval (vezes ServerAliveCountMax ).

    
por cnst 07.01.2013 / 21:02

1 resposta

7

link

Parece que TcpMaxDataRetransmissions (REG_DWORD) afeta diretamente isso. O valor pode ser adicionado a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters com regedit.exe (a chave está ausente por padrão, portanto, primeiro é necessário adicioná-lo para alterá-lo). Quando não definido - é 5. Adicione-o e defina-o pelo menos para f (15) e reinicie.

O valor padrão de 5 parece bastante inadequado para manter conexões durante interrupções de rede breves e temporárias; você teria um tempo limite em questão de alguns segundos. Eu adicionei essa chave TcpMaxDataRetransmissions ao registro e defini seu valor como f (15), reinicializei a máquina e depois de fazer sysctl net.inet.ip.forwarding=0 no roteador antes de digitar um personagem em PuTTY, tenho o personagem ecoou de volta para mim depois de ativar o encaminhamento no meu roteador depois de esperar 5 minutos (eu testei para determinar que um valor de 0x0000000c (12) faz a conexão quebrar exatamente 7 minutos após a primeira tentativa de enviando um pacote durante uma interrupção). Antes da reinicialização, o PuTTY encerraria a conexão dentro de alguns segundos imediatamente. Note que a reinicialização foi necessária - pelo menos no Windows 7 Professional, o simplesmente alterando o registro não afeta nem as conexões existentes nem as novas ! Nada nunca muda no Windows!

Ainda nele, também pode adicionar e definir KeepAliveInterval a 60000 decimal (60 seg.) do valor padrão não definido de 1000 (1 seg.), mas não deve ter nenhum efeito no meu caso específico como acima, uma vez que os keepalives TCP não estavam habilitados.

    
por 08.01.2013 / 22:45