Comment la connexion SSH survit-elle au redémarrage du réseau?

63

À partir d'un shell Linux SSH, tapez /etc/init.d/network restartpour redémarrer le service réseau.

Je m'attends à ce que ma connexion SSH meure car le service réseau est en panne. Mais ce n'est pas le cas. Très cool. Mais comment Linux parvient-il à cela? Comment maintenir ma connexion SSH vivante lors du redémarrage du service?

Serge Wautier
la source

Réponses:

69

Il fait cela en ne faisant rien de spécial. Le réseau redémarre plus rapidement que le délai requis par la connexion TCP, de sorte que la connexion TCP survit à la "panne" de la même manière qu'elle survivrait à une panne réseau temporaire.

La seule raison pour laquelle Windows ne fait pas la même chose est parce que Windows réinitialise spécifiquement les connexions TCP quand une interface réseau tombe en panne. C’est, du moins sans doute, une tâche plutôt délicate à faire, car le protocole TCP a été spécialement conçu pour survivre aux pannes de réseau transitoires.

David Schwartz
la source
1
David, alors cela signifie que la pile TCP / IP n'est pas redémarrée, n'est-ce pas? Parce que si c'était le cas, le serveur aurait perdu la trace du socket SSH et le processus enfant sshd (merci Nils) se terminerait. Ce qui amène la question suivante: Quel service gère les sockets? TIA.
Serge Wautier
@ David Schwartz - quels paramètres puis-je utiliser pour changer le délai? Comment connaître la valeur de délai d'attente actuelle? Et est-il configuré côté serveur ou côté client?
Martin Vegter
@MartinVegter Vous ne voulez vraiment pas changer les paramètres de minutage de la connexion TCP, car ils doivent se coordonner des deux côtés et les modifier peut affecter la capacité de TCP à gérer la perte de paquets. Vous feriez mieux de concevoir le système dans son ensemble pour qu'il tolère la perte de connexion TCP de manière transparente en rétablissant la connexion.
David Schwartz
11

SSHD crée un processus enfant lors de la connexion. Ce processus enfant ne mourra pas si l'un ou l'autre de SSHD ou tout le réseau est redémarré. C’est la raison pour laquelle vous pouvez mettre à jour ssh et / ou sa configuration, faire une service sshd restartet toujours rester connectée à votre ancienne session ssh avec les anciens paramètres. En dehors de cela, SSH se remet bien des petites pannes de réseau.

Nils
la source
2
SSH n'est même pas au courant des "pannes de réseau", pour la raison donnée par David Schwartz. Ce n'est pas une propriété de SSH en particulier.
user207421
Je ne suis pas sûr qu'il n'y ait pas aussi un peu de programmation impliquée du côté ssh. Fondamentalement, tous les services TCP doivent être tolérants aux pannes, mais pas tous. Il doit exister un mécanisme de nouvelle tentative impliqué dans l'application - le service peut alors même survivre à des pannes "moyennes".
Nils
3
Comme expliqué par EJP, votre réponse est vraie mais non pertinente.
Gilles 'SO- arrête d'être méchant'
3
Cette réponse m’a été utile car elle a permis de mieux comprendre comment sshdéviter de tomber service sshd restart. Si vous mettez à jour sshd( mise à jour de sécurité, etc.), les processus enfants continueraient de s'exécuter sur le code d'origine (pré-mise à jour), mais continueraient à fournir le service plutôt que d'être interrompus. J'imagine que la disponibilité du socket d'écoute pour le sshdprocessus principal est très brièvement interrompue, toutefois, lorsque le premier processus enfant se termine et que l'interface réseau indique momentanément que le port est fermé.
Allquixotic
1
@Nils Je sais que tu as écrit ça. Mais cela fait penser au lecteur moyen que la contrefaçon est pertinente. Mais il en va de même pour les programmes qui ne se divisent pas en fourches. Votre réponse est quelque chose comme: "Parce que l'acier est plus fort que le fer, les pommes sont rouges"
Daniel Alder