Как SSH-соединение переживает перезагрузку сети?


63

В командной строке Linux SSH введите /etc/init.d/network restartдля перезапуска сетевой службы.

Я ожидаю, что мое SSH-соединение прекратится, так как сетевая служба перестает работать. Но это не так. Очень круто. Но как Linux достигает этого? Как оно поддерживает мое SSH-соединение при перезапуске службы?

Ответы:


69

Это делает это, не делая ничего особенного. Сеть перезагружается за меньшее время, чем TCP-соединение требует времени, поэтому TCP-соединение переживает «сбой» так же, как и любое временное отключение сети.

Единственная причина, по которой Windows не делает то же самое, заключается в том, что Windows специально сбрасывает TCP-соединения, когда сетевой интерфейс отключается. Это, по крайней мере, возможно, довольно глупая вещь, потому что TCP был специально разработан, чтобы выдерживать кратковременные перебои в работе сети.


1
Дэвид, тогда это означает, что стек TCP / IP не перезапускается, верно? Потому что если бы это было так, сервер потерял бы отслеживание сокета SSH, и дочерний процесс sshd (спасибо Nils) завершился бы. Что вызывает следующий вопрос: какой сервис управляет сокетами? ТИА.
— Серж Вотье

@ Дэвид Шварц - какие параметры я могу использовать, чтобы изменить время ожидания? Как узнать текущее значение тайм-аута? И настроен ли он на стороне сервера или на стороне клиента?
— Мартин Вегтер

@MartinVegter Вы действительно не хотите изменять параметры синхронизации TCP-соединения, так как они должны координироваться с обеих сторон, и взаимодействие с ними может повлиять на способность TCP обрабатывать потерю пакетов. Вам лучше спроектировать систему в целом так, чтобы она легко переносила потерю TCP-соединения, восстанавливая соединение.
— Дэвид Шварц

11

SSHD разветвляет дочерний процесс на соединение. Этот дочерний процесс не умрет, если перезапустится либо SSHD, либо вся сеть. Это причина, по которой вы можете обновить ssh и / или его конфигурацию, сделать service sshd restartи по-прежнему оставаться подключенным к старому ssh-сеансу со старыми настройками. Кроме того, SSH хорошо восстанавливается после небольших перебоев в работе сети.


2
SSH даже не знает о «небольших перебоях в сети» по причине, приведенной Дэвидом Шварцем. Это не является собственностью SSH.
— user207421

Я не уверен, если на ssh-стороне не задействовано немного программирования. В основном все службы TCP должны быть отказоустойчивыми, а многие - нет. В приложении должен быть задействован дополнительный механизм повторных попыток - тогда служба может даже пережить "средние" сбои.
— Нильс

3
Как объяснил EJP, ваш ответ верен, но не имеет значения.
— «SO- перестать быть злым» Жиля

3
Этот ответ был полезен для меня, потому что он добавил понимание того, что sshdнужно делать, чтобы избежать падения service sshd restart. Если вы обновляете sshd( обновление безопасности и т. Д.), Дочерние процессы по-прежнему будут работать с исходным кодом (предварительное обновление), но будут продолжать предоставлять услуги, а не прерываться. Я предполагаю, что доступность сокета прослушивания для основного sshdпроцесса очень кратко прерывается, однако, когда заканчивается первый дочерний процесс и сетевой интерфейс на мгновение указывает, что порт закрыт.
— allquixotic

1
@ Nils Я знаю, что ты это написал. Но это заставляет обычного читателя думать, что разветвление актуально. Но то же самое происходит и с программами, которые не работают. Ваш ответ примерно такой: «Поскольку сталь сильнее железа, яблоки красные»,
— Даниэль Алдер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.