Я перезагрузил WiFi-роутер офиса, и, как и ожидалось, мой ноутбук отключился. После повторного подключения я заметил, что мой сеанс SSH так и не был прерван.
Что в протоколе SSH делает это возможным? Или это больше связано с TCP/IP?
решение1
По умолчанию SSH имеет довольно большие тайм-ауты, по умолчанию установлено время ожидания TCP, а по умолчанию время ожидания TCP также велико.
Любая форма keepalive фактически заставит его разорвать соединение раньше, поскольку, когда клиент/сервер увидит, что keepalive не доходят до цели, он разорвет соединение.
Таким образом, пока ваш IP-адрес остается прежним, SSH-соединение может сохраняться очень долго, если не происходит ничего, что могло бы заполнить буферы отправки/приема.
решение2
Я бы сказал, что это TCP. Пока адрес тот же самый, все, что было отправлено, пока сеть была недоступна, будет рассматриваться как потерянный пакет и отправлено повторно. Пока сеть не была недоступна слишком долго, клиент и сервер наверстают упущенное. Если бы вообще ничего не было отправлено с любого конца, пока сеть была недоступна, то ни клиент, ни сервер даже не узнали бы о наличии проблемы.
Однако в последнем случае любой протокол в сети с коммутацией пакетов вел бы себя точно так же, поэтому утверждение, что это из-за SSH или из-за TCP, не является полным ответом.