W jaki sposób połączenie SSH przetrwa restart sieci?

63

W powłoce SSH systemu Linux wpisz, /etc/init.d/network restartaby zrestartować usługę sieciową.

Oczekuję, że moje połączenie SSH umrze, ponieważ usługa sieciowa przestaje działać. Ale tak nie jest. Bardzo fajny. Ale w jaki sposób Linux to osiąga? Jak utrzymuje moje połączenie SSH przy ponownym uruchomieniu usługi?

Serge Wautier
źródło

Odpowiedzi:

69

Robi to, nie robiąc nic specjalnego. Sieć uruchamia się ponownie w krótszym czasie niż czas oczekiwania połączenia TCP, więc połączenie TCP przetrwa „awarię” w taki sam sposób, jak przetrwałby każdą przejściową awarię sieci.

Jedynym powodem, dla którego system Windows nie robi tego samego, jest to, że system Windows resetuje połączenia TCP po awarii interfejsu sieciowego. Jest to, co najmniej prawdopodobne, dość kośćcowa rzecz, ponieważ TCP został specjalnie zaprojektowany, aby przetrwać przejściowe awarie sieci.

David Schwartz
źródło
1
David, oznacza to, że stos TCP / IP nie został zrestartowany, prawda? Ponieważ gdyby tak było, serwer utraciłby śledzenie gniazda SSH, a proces potomny sshd (dzięki Nils) zostałby zakończony. Co nasuwa kolejne pytanie: Która usługa zarządza gniazdami? TIA
Serge Wautier,
@David Schwartz - jakich parametrów mogę użyć, aby zmienić limit czasu? Jak znaleźć aktualną wartość limitu czasu? I czy jest skonfigurowany po stronie serwera, czy po stronie klienta?
Martin Vegter,
@MartinVegter Naprawdę nie chcesz zmieniać parametrów taktowania połączenia TCP, ponieważ muszą one koordynować po obu stronach, a bałagan z nimi może mieć wpływ na zdolność TCP do obsługi utraty pakietów. Lepiej jest zaprojektować system jako całość, aby bezproblemowo tolerować utratę połączenia TCP poprzez odzyskanie połączenia.
David Schwartz,
11

SSHD wyświetla proces potomny przy połączeniu. Ten proces potomny nie umrze, jeśli SSHD lub cała sieć zostanie zrestartowana. To jest powód, dla którego możesz zaktualizować ssh i / lub jego konfigurację, zrobić service sshd restarti nadal mieć połączenie ze starą sesją ssh ze starymi ustawieniami. Poza tym ssh dobrze odzyskuje z małych awarii sieci.

Nils
źródło
2
SSH nawet nie wie o „małych awariach sieci” z powodu podanego przez Davida Schwartza. Nie jest to właściwość SSH.
user207421,
Nie jestem pewien, czy po stronie ssh nie ma jeszcze trochę programowania. Zasadniczo wszystkie usługi TCP powinny być odporne na uszkodzenia - wiele z nich nie. Aplikacja wymaga dodatkowego mechanizmu ponownej próby - wtedy usługa może przetrwać nawet „średnie” przerwy.
Nils,
3
Jak wyjaśnił EJP, twoja odpowiedź jest prawdziwa, ale nieistotna.
Gilles
3
Ta odpowiedź była dla mnie przydatna, ponieważ dodała wgląd w to, co należy sshdrobić, aby uniknąć dalszego postępowania service sshd restart. Jeśli przeprowadzisz aktualizację sshd( aktualizacja zabezpieczeń itp.), Procesy potomne nadal będą działały na oryginalnym kodzie (przed aktualizacją), ale nadal będą świadczyć usługi, a nie będą przerywane. Wydaje mi się, że dostępność gniazda nasłuchującego dla głównego sshdprocesu jest bardzo krótko przerywana, jednak gdy kończy się pierwszy proces potomny, a interfejs sieciowy chwilowo wskazuje port jako zamknięty.
allquixotic
1
@Nils Wiem, że to napisałeś. Ale to sprawia, że ​​przeciętny czytelnik uważa, że ​​rozwidlenie jest istotne. To samo dzieje się również w przypadku programów, które nie rozwidlają się. Twoja odpowiedź brzmi: „Ponieważ stal jest mocniejsza niż żelazo, jabłka są czerwone”
Daniel Alder