Wie überlebt die SSH-Verbindung einen Neustart des Netzwerks?

63

Geben Sie in einer Linux-SSH-Shell Folgendes ein /etc/init.d/network restart, um den Netzwerkdienst neu zu starten.

Ich erwarte, dass meine SSH-Verbindung unterbrochen wird, da der Netzwerkdienst ausfällt. Aber das tut es nicht. Sehr cool. Aber wie schafft Linux das? Wie bleibt meine SSH-Verbindung während des Neustarts des Dienstes am Leben?

Serge Wautier
quelle

Antworten:

69

Es tut dies, indem es nichts Besonderes tut. Das Netzwerk wird in kürzerer Zeit neu gestartet, als es für die TCP-Verbindung erforderlich ist, sodass die TCP-Verbindung den "Ausfall" auf die gleiche Weise übersteht wie ein vorübergehender Netzwerkausfall.

Der einzige Grund, warum Windows nicht dasselbe tut, ist, dass Windows TCP-Verbindungen speziell zurücksetzt, wenn eine Netzwerkschnittstelle ausfällt. Zumindest ist dies eine ziemlich knochige Sache, da TCP speziell entwickelt wurde, um vorübergehende Netzwerkausfälle zu überstehen.

David Schwartz
quelle
1
David, dann heißt das, dass der TCP / IP-Stack nicht neu gestartet wird, oder? Denn wenn es so wäre, hätte der Server den Überblick über den SSH-Socket verloren und der untergeordnete sshd-Prozess (danke Nils) würde beendet. Was bringt die nächste Frage: Welcher Dienst verwaltet die Sockets? TIA.
Serge Wautier
@David Schwartz - Mit welchen Parametern kann ich das Timeout ändern? Wie finde ich den aktuellen Timeout-Wert heraus? Und ist es serverseitig oder clientseitig konfiguriert?
Martin Vegter
@MartinVegter Sie möchten die Timing-Parameter der TCP-Verbindung wirklich nicht ändern, da sie auf beiden Seiten koordiniert werden müssen und das Durcheinander mit ihnen die Fähigkeit von TCP beeinträchtigen kann, mit Paketverlust umzugehen. Es ist besser, das System als Ganzes so zu gestalten, dass ein nahtloser Verlust der TCP-Verbindung durch Wiederherstellung der Verbindung toleriert wird.
David Schwartz
11

SSHD gibt bei der Verbindung einen untergeordneten Prozess aus. Dieser untergeordnete Prozess stirbt nicht, wenn entweder SSHD oder das gesamte Netzwerk neu gestartet wird. Dies ist der Grund, warum Sie ssh und / oder seine Konfiguration aktualisieren können, eine service sshd restartVerbindung zu Ihrer alten ssh-Sitzung mit den alten Einstellungen herstellen und diese beibehalten können. Abgesehen davon erholt sich ssh gut von kleinen Netzwerkausfällen.

Nils
quelle
2
SSH weiß aus dem von David Schwartz angegebenen Grund nicht einmal über "kleine Netzwerkausfälle" Bescheid . Es ist nicht speziell eine Eigenschaft von SSH.
user207421
Ich bin mir nicht sicher, ob es nicht auch ein bisschen Programmierung auf der SSH-Seite gibt. Grundsätzlich sollten alle TCP-Dienste fehlertolerant sein - viele nicht. Es muss einen zusätzlichen Wiederholungsmechanismus für die Anwendung geben - dann kann der Service auch "mittlere" Ausfälle überstehen.
Nils
3
Wie von EJP erklärt, ist Ihre Antwort wahr, aber irrelevant.
Gilles 'SO- hör auf böse zu sein'
3
Diese Antwort war nützlich für mich, weil sie mir die Einsicht vermittelte, was zu sshdtun ist, um ein Absinken zu vermeiden service sshd restart. Wenn Sie aktualisieren sshd(Sicherheitsupdate usw.), werden die untergeordneten Prozesse weiterhin mit dem ursprünglichen Code ausgeführt (Vorupdate), bieten jedoch weiterhin Dienste an, anstatt unterbrochen zu werden. Ich vermute, die Verfügbarkeit des Listening-Sockets für den Hauptprozess sshdwird jedoch sehr kurz unterbrochen, wenn der erste untergeordnete Prozess endet und die Netzwerkschnittstelle den Port vorübergehend als geschlossen anzeigt.
allquixotic
1
@Nils Ich weiß, dass du das geschrieben hast. Dies lässt den durchschnittlichen Leser jedoch denken, dass das Gabeln relevant ist. Das Gleiche gilt jedoch auch für Programme, die sich nicht teilen. Ihre Antwort lautet etwa: "Weil Stahl stärker ist als Eisen, sind Äpfel rot"
Daniel Alder