大家讲道理2017-02-21 09:17:28
原因
这个事情比较繁琐,但不复杂:
第一:ssh使用tcp长连接进行通信,这个长连接是没有保活心跳的,所以当连接建立但是双方都没什么事的时候(你不敲命令,服务器也不向你发什么更新数据),中间是没有数据包的。
第二:从你的PC机,到你的公网出口,到互联网上,到阿里云防火墙,到你的阿里云主机,这一长过程可能会经过非常多个NAT设备和防火墙设备。以SNAT设备为例(常见的是家用路由器、公司路由器或防火墙,运营商CGN),这些设备会为你的这次TCP连接维持一个NAT会话(关于NAT的相关资料建议自学),如果这个会话在一定时间内有通信的话,就会刷新生存时间。如果这次会话双方确认断开连接,就会释放这个会话(这条TCP连接也不再通了)。然而这就有一个特殊情况,如果两个建立连接的双方都断网/死机了怎么办?这个会话应该也没用了,所以很多NAT设备会在这里设置一个最长生存时间,这个时间之内如果没有数据包通信,那就断开这个NAT会话。这就是你说的一段时间不操作就失去响应
第三:除了NAT设备,链路上很多防火墙设备都会有类似限制。很多公司的公司防火墙都有这种设置,无数据的NAT会话存活时间也都是自行设定的。
解决办法
一个最简单的解决办法,就是保持有数据就行了。
在闲着没事的时候打个top -c监控系统。
小提示
如果使用SecureCRT等工具,可以克隆当前会话,这个克隆的会话使用的是与被克隆会话相同的TCP连接,在克隆会话中top -c