我们有一个基于apache mina的GPRS网关(服务器)。有时,通常在客户端粗暴地终止连接,即电源线拔出或任何其他异常关闭或网络出现问题时,不会在服务器端移除或关闭连接。它处于空闲状态,因为我不知道多长时间(可能永远)。
有时我们在关闭服务器时遇到问题,MINA需要花费太多时间,有时我们最终还是要杀掉它。我们怀疑这个问题与死连接问题有关。
实际上,这种死亡的联系是有道理的。由于连接是残酷关闭的,而mina没有办法检查它(这就是tcp会话的工作原理)。
我们作为一种解决方法,设计了一个解决方案,如果它保持空闲(读取和写入),我们将关闭会话,比如30分钟(或任何可配置的时间)。我们不喜欢有两个原因:
1-看起来不太好看。
2- Plus我们有一条规则,即客户端与服务器建立持久连接。因此,设置'空闲超时'有点困难,因为我们不能只关闭任何空闲x min / hrs的会话,因为它可以是有效的连接。
那么,在MINA中检测和清除这些死连接是否有更好,更安全(在我们的情况下)的方式?
答案 0 :(得分:1)
在两种情况下,长时间未激活的连接和丢失的连接 - 在通道中没有活动应该在OSI model的每一层中配置的时间后导致超时。 例如。你的防火墙/路由器/服务器可能会在10分钟内超时非活动连接进入,那么你应用层连接也应该在10分钟后做到 - 等待更多没有意义。
为防止静默连接超时,应引入keep-alive协议。 它可以是ping(不完全是ICMP)或其他形式的周期性非操作通信。 当对等体处于活动状态时,它应该响应并因此刷新所有网络层上的超时倒计时。在超时或层信令断开连接导致尝试失败后,您可以假设您的应用层连接也已损坏。