¿Por qué Windows 7 / PuTTY desconecta las conexiones TCP incluso en interrupciones muy breves?

15

Tengo una pequeña red local que se complementa con un WiFi cautivo, y lo uso sshen OS X con -oServerAliveInterval=240y PuTTY 0.62 en Windows 7 Professional para establecer conexiones a mi Linode, Hetzner y otros servidores.

Con PuTTY, selecciono ConnectionSending of null packets to keep session activea 240. El Enable TCP keepalives (SO_KEEPALIVE option)está apagado, según los valores predeterminados.

Cuando mi Internet está temporalmente fuera de servicio durante aproximadamente un minuto (tengo que volver a autenticarme en el portal cautivo), PuTTY casi siempre pierde todas las sesiones ssh abiertas que tengo, y especialmente aquellas en las que hubo algún tipo de actividad, pero OpenSSH en OS X nunca pierde ninguna sesión, siempre que mi Internet vuelva a funcionar en aproximadamente un minuto o dos, incluso si realmente intento escribir algo en ssh, y no veo respuesta durante los 60 segundos más o menos, hasta que mi conexión vuelva a estar activa. (Por lo tanto, estoy seguro de que los estados NAT siempre se conservan).

¿Puedo evitar que Windows / PuTTY descarte preventivamente buenas conexiones?

Me parece que SO_KEEPALIVE o algo así está activado de forma predeterminada en Windows, y el tiempo de espera para detectar conexiones obsoletas es demasiado pequeño. Me gustaría aumentarlo a algo más de un par de segundos, de manera similar a cómo OS X es inmune a estas breves interrupciones temporales, siempre que la interrupción sea de solo un par de cientos de segundos y esté por debajo del valor de -oServerAliveInterval(veces ServerAliveCountMax).

cnst
fuente
Solo escribo para decir que tengo el mismo problema y para votar ... estaré viendo esta pregunta. Supongo que tiene algo que ver con la implementación del controlador de red en Windows.
allquixotic
He estado usando masilla durante 10 años y no he estado buscando una solución para esto desde el principio. Este punto de dolor solo puede mitigarse, no resolverse. Putty requiere una conexión a Internet 100.00% confiable y 0.00% de paquetes descartados. En el nuevo mundo de Internet siempre irregular en todas partes, la masilla se está volviendo cada vez menos útil a medida que pasan los años, ya que solo puede funcionar durante unos minutos a la vez antes de que se interrumpa su trabajo y tenga que reiniciar la masilla, volver a conectar , luego retome donde lo dejó, corrompa los archivos corruptos e intente hacer su trabajo antes de la próxima interrupción.
Eric Leschinski
@EricLeschinski, eres incorrecto. Esta mitigación descrita en esta pregunta funciona bien, no he tenido mis conexiones IPv4 interrumpidas en mucho, mucho tiempo. (Aparte de los casos en los que cambia toda la dirección IPv4, o duermo, etc., para esos casos, moshes una mejor alternativa)
Cnst

Respuestas:

8

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


Parece que TcpMaxDataRetransmissions(REG_DWORD) afecta directamente esto. El valor se puede agregar HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameterscon regedit.exe(la clave falta por defecto, por lo que primero debe agregarla para cambiarla). Cuando está desarmado, es 5. Agréguelo, configúrelo al menos en f(15) y reinicie.


El valor predeterminado de 5 parece bastante inadecuado para mantener las conexiones durante interrupciones breves y temporales de la red; obtendrá un tiempo de espera en cuestión de unos segundos. Agregué esta TcpMaxDataRetransmissionsclave al registro y configuré su valor en f(15), reinicié la máquina y, después de hacerlo sysctl net.inet.ip.forwarding=0en el enrutador justo antes de escribir un carácter en PuTTY, me devolvió el carácter después de habilitar el reenvío. en mi enrutador después de esperar 5 minutos (lo probé para determinar que un valor de 0x0000000c (12) hace que la conexión se rompa exactamente 7 minutos después del primer intento de enviar un paquete durante una interrupción). Antes de reiniciar, PuTTY agotaría la conexión dentro de un par de segundos de inmediato. Tenga en cuenta que fue necesario reiniciar, al menos en Windows 7 Professional,¡simplemente cambiar el registro no tiene efecto en conexiones existentes ni nuevas ! ¡Nada cambia en Windows!

Mientras lo hace, también podría agregar y establecer KeepAliveIntervalen 60000decimal (60 segundos) desde el valor predeterminado no establecido de 1000(1 segundo), pero no se supone que tenga ningún efecto en mi caso específico como el anterior, ya que las funciones de mantenimiento TCP no estaban habilitadas.

cnst
fuente