SSH连接在网络重启后如何生存?


63

在Linux SSH Shell中,键入/etc/init.d/network restart以重新启动网络服务。

由于网络服务中断,我希望我的SSH连接断开。但事实并非如此。很酷。但是Linux如何实现这一目标?如何在服务重新启动期间使我的SSH连接保持活动状态?

Answers:


69

它没有做任何特别的事情。网络重新启动的时间少于TCP连接超时所需的时间,因此TCP连接可以承受“中断”的方式与承受任何瞬时网络中断的方式相同。

Windows不做同样的事情的唯一原因是因为Windows专门在网络接口出现故障时重置TCP连接。至少可以说,这是一件相当愚蠢的事情,因为TCP是专门为承受瞬态网络中断而设计的。


1
大卫,那么这意味着TCP / IP堆栈没有重新启动,对吗?因为如果是这样,服务器将失去对SSH套接字的跟踪,而sshd子进程(感谢Nils)将终止。哪个带来了下一个问题:哪个服务管理套接字?TIA。
Serge Wautier

@David Schwartz-我可以使用哪些参数来更改超时时间?如何找出当前的超时值?并且是在服务器端还是在客户端配置的?
Martin Vegter '16

@MartinVegter您真的不想更改TCP连接的时序参数,因为它们必须在两侧进行协调,并且弄乱它们可能会影响TCP处理数据包丢失的能力。您最好将系统设计为整体,以通过恢复连接来无缝地承受TCP连接丢失。
David Schwartz

11

SSHD在连接上派生一个子进程。如果重新启动SSHD或整个网络,此子进程将不会消失。这就是为什么您可以更新ssh和/或其配置,执行a service sshd restart并仍然使用旧设置保持与旧ssh会话保持连接的原因。除此之外,ssh还可以从小型网络中断中恢复良好。


2
由于David Schwartz给出的原因,SSH甚至都不知道 “小型网络中断”。它不是SSH的特有属性。
user207421 2011年

我不确定ssh端是否也没有涉及任何编程。基本上所有的TCP服务都应该是容错的-许多不是。应用程序中需要包含其他重试机制-然后该服务甚至还可以在“中等”中断中幸免。
尼尔斯

3
正如EJP所解释的那样,您的回答是正确的,但却无关紧要。
吉尔斯

3
这个答案对我很有用,因为它增加了有关如何sshd避免失败的见解service sshd restart。如果您进行更新sshd(安全更新等),则子进程仍将在原始代码上运行(预更新),但将继续提供服务,而不是被中断。我猜主sshd进程的侦听套接字的可用性非常短暂地被中断,但是,当第一个子进程结束并且网络接口暂时指示该端口处于关闭状态时。
allquixotic

1
@Nils我知道你写的。但这使普通读者认为分叉是相关的。但是对于不分叉的程序也会发生同样的事情。您的答案是:“因为钢铁比铁强,所以苹果是红色的”
Daniel Alder 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.