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

15

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

Com PuTTY, seleciono ConnectionSending of null packets to keep session activea 240. O Enable TCP keepalives (SO_KEEPALIVE option)está desativado, conforme os padrões.

Quando minha internet fica temporariamente inativa por cerca de um minuto (é necessário se autenticar novamente no portal cativo), o PuTTY quase sempre perde todas as sessões abertas de ssh que eu tenho, e especialmente aquelas onde havia algum tipo de atividade, mas o OpenSSH no OS X nunca perde nenhuma sessão desde que minha internet volte a funcionar em cerca de um minuto ou dois, mesmo que eu tente digitar algo no ssh e não veja resposta por 60 segundos inteiros, até que minha conexão esteja ativa novamente. (Portanto, tenho certeza de que os estados NAT sempre são preservados.)

Posso parar o Windows / PuTTY de descartar preventivamente boas conexões?

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

cnst
fonte
Basta escrever para dizer que tenho o mesmo problema e para votar ... estará assistindo a essa pergunta. Suponho que tenha algo a ver com a implementação do driver de rede no Windows.
allquixotic
Eu uso massa de vidraceiro há 10 anos e tenho procurado uma solução para isso desde o início. Esse ponto de dor só pode ser mitigado, não resolvido. O Putty requer uma conexão à Internet 100,00% confiável e pacotes descartados de 0,00%. No novo mundo da Internet sempre irregular, em todos os lugares, a massa está se tornando cada vez menos útil com o passar dos anos, porque só pode funcionar por alguns minutos de cada vez antes que você interrompa seu trabalho e precise reiniciar a massa, reconectar , retire o local de onde parou, corrompa os arquivos corrompidos e tente concluir seu trabalho antes da próxima interrupção.
Eric Leschinski 26/10
@EricLeschinski, você está incorreto. Essa atenuação descrita nesta pergunta funciona muito bem, não tenho minhas conexões IPv4 interrompidas há muito, muito tempo. (Além de casos em todo o mudanças de endereços IPv4, ou eu faço um sono etc - para aqueles casos, moshé uma alternativa melhor.)
CNST

Respostas:

8

http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-timeout


Parece que TcpMaxDataRetransmissions(REG_DWORD) afeta diretamente isso. O valor pode ser adicionado a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameterswith regedit.exe(a chave está ausente por padrão, você deve primeiro adicioná-lo para alterá-lo). Quando desativado - é 5. Adicione-o e configure-o pelo menos para f(15) e reinicie.


O valor padrão 5 parece bastante inadequado para manter as conexões durante interrupções breves e temporárias da rede; você receberá um tempo limite em questão de segundos. Adicionei essa TcpMaxDataRetransmissionschave ao registro e defina seu valor como f(15), reiniciei a máquina e, depois de fazer sysctl net.inet.ip.forwarding=0o roteador antes de digitar um caractere no PuTTY, o eco retornou para mim depois de ativar o encaminhamento no meu roteador após aguardar 5 minutos (testei para determinar que um valor 0x0000000c (12) faz com que a conexão seja interrompida exatamente 7 minutos após a primeira tentativa de enviar um pacote durante uma interrupção). Antes da reinicialização, o PuTTY atingia o tempo limite da conexão em alguns segundos imediatamente. Observe que a reinicialização foi necessária - pelo menos no Windows 7 Professional,simplesmente alterar o registro não afeta as conexões existentes nem as novas ! Nada muda no Windows!

Enquanto isso, também pode adicionar e definir KeepAliveIntervalcomo 60000decimal (60 s) o valor padrão não definido de 1000(1 s), mas não deve ter nenhum efeito no meu caso específico, como acima, pois as keepalives do TCP não foram ativadas.

cnst
fonte