¿Cómo sobrevive la conexión SSH al reinicio de la red?

63

Desde un shell SSH de Linux, escriba /etc/init.d/network restartpara reiniciar el servicio de red.

Espero que mi conexión SSH falle debido a que el servicio de red deja de funcionar. Pero no lo hace. Muy genial. Pero, ¿cómo logra Linux esto? ¿Cómo mantiene viva mi conexión SSH durante el reinicio del servicio?

Serge Wautier
fuente

Respuestas:

69

Hace esto al no hacer nada especial. La red se reinicia en menos tiempo que el tiempo de espera de la conexión TCP, por lo que la conexión TCP sobrevive a la "interrupción" de la misma manera que sobreviviría a cualquier interrupción transitoria de la red.

La única razón por la que Windows no hace lo mismo es porque Windows restablece específicamente las conexiones TCP cuando una interfaz de red deja de funcionar. Esto es, al menos posiblemente, algo bastante descabellado porque TCP fue diseñado específicamente para sobrevivir a las interrupciones de red transitorias.

David Schwartz
fuente
1
David, entonces significa que la pila TCP / IP no se reinicia, ¿verdad? Porque si lo fuera, el servidor habría perdido el rastro del socket SSH y el proceso secundario sshd (gracias Nils) terminaría. Lo que trae la siguiente pregunta: ¿Qué servicio gestiona los sockets? TIA
Serge Wautier
@David Schwartz: ¿qué parámetros puedo usar para cambiar el tiempo de espera? ¿Cómo puedo encontrar el valor de tiempo de espera actual? ¿Y está configurado en el lado del servidor o del lado del cliente?
Martin Vegter
@MartinVegter Realmente no desea cambiar los parámetros de tiempo de la conexión TCP ya que tienen que coordinarse en ambos lados y jugar con ellos podría afectar la capacidad de TCP para manejar la pérdida de paquetes. Es mejor diseñar el sistema en su conjunto para tolerar la pérdida de conexión TCP sin problemas recuperando la conexión.
David Schwartz
11

SSHD bifurca un proceso secundario en la conexión. Este proceso secundario no morirá si se reinicia SSHD o toda la red. Esta es la razón por la que puede actualizar ssh y / o su configuración, hacer service sshd restarty seguir conectado a su sesión ssh anterior con la configuración anterior. Aparte de eso, ssh se recupera bien de pequeños cortes de red.

Nils
fuente
2
SSH ni siquiera sabe acerca de los "cortes de red pequeños", por la razón dada por David Schwartz. No es una propiedad de SSH específicamente.
user207421
No estoy seguro de si no hay un poco de programación involucrada en el lado ssh. Básicamente, todos los servicios TCP deben ser tolerantes a fallas, muchos no lo son. Es necesario que haya un mecanismo de reintento adicional involucrado en la aplicación, entonces el servicio puede incluso sobrevivir a interrupciones "medianas" también.
Nils
3
Según lo explicado por EJP, su respuesta es verdadera pero irrelevante.
Gilles 'SO- deja de ser malvado'
3
Esta respuesta fue útil para mí porque agregó la idea de qué sshdhacer para evitar seguir adelante service sshd restart. Si actualiza sshd( actualización de seguridad, etc.), los procesos secundarios aún se estarían ejecutando en el código original (preactualización), pero continuarían brindando servicio, en lugar de ser interrumpidos. sshdSin embargo, supongo que la disponibilidad del socket de escucha para el proceso principal se interrumpe muy brevemente cuando finaliza el primer proceso secundario y la interfaz de red indica momentáneamente que el puerto está cerrado.
allquixotic
1
@Nils Sé que escribiste eso. Pero esto hace que el lector promedio piense que la bifurcación es relevante. Pero lo mismo también sucede con los programas que no se bifurcan. Su respuesta es algo así como: "Debido a que el acero es más fuerte que el hierro, las manzanas son rojas"
Daniel Alder