Как 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 хорошо восстанавливается после небольших перебоев в работе сети.

Nils
источник
2
SSH даже не знает о «небольших перебоях в сети» по причине, приведенной Дэвидом Шварцем. Это не является собственностью SSH.
user207421
Я не уверен, если на ssh-стороне не задействовано немного программирования. В основном все службы TCP должны быть отказоустойчивыми, а многие - нет. В приложении должен быть задействован дополнительный механизм повторных попыток - тогда служба может даже пережить "средние" сбои.
Нильс
3
Как объяснил EJP, ваш ответ верен, но не имеет значения.
«SO- перестать быть злым» Жиля
3
Этот ответ был полезен для меня, потому что он добавил понимание того, что sshdнужно делать, чтобы избежать падения service sshd restart. Если вы обновляете sshd( обновление безопасности и т. Д.), Дочерние процессы по-прежнему будут работать с исходным кодом (предварительное обновление), но будут продолжать предоставлять услуги, а не прерываться. Я предполагаю, что доступность сокета прослушивания для основного sshdпроцесса очень кратко прерывается, однако, когда заканчивается первый дочерний процесс и сетевой интерфейс на мгновение указывает, что порт закрыт.
allquixotic
1
@ Nils Я знаю, что ты это написал. Но это заставляет обычного читателя думать, что разветвление актуально. Но то же самое происходит и с программами, которые не работают. Ваш ответ примерно такой: «Поскольку сталь сильнее железа, яблоки красные»,
Даниэль Алдер,