我们有一个基于 apache mina 的 GPRS 网关(服务器)。有时,通常当连接从客户端被粗暴地终止时,即电源线被拔掉或任何其他异常关闭或网络问题,它不会在服务器端被移除或关闭。它保持在那里,处于空闲状态,因为我不知道多久(可能永远)。有时我们在关闭服务器时会遇到问题,MINA 会花费太多时间,有时我们最终必须将其杀死。我们怀疑这个问题与死连接问题有关。
实际上,这种死联系是有道理的。由于连接被粗暴地关闭并且 mina 没有办法检查它(这就是 tcp session 的工作方式)。作为一种解决方法,我们设计了一个解决方案,如果会话保持空闲(读取和写入)30 分钟(或任何可配置的时间),我们将关闭会话。我们不喜欢有两个原因:
1- 看起来不太好。
2-另外,我们有一条规则,客户端与服务器建立持久连接。因此,设置“空闲超时”有点困难,因为我们不能关闭任何已空闲 x 分钟/小时的会话,因为它可以是有效连接。
那么,有没有更好、更安全(在我们的例子中)的方法来检测和清除 MINA 中的这些死连接?
问问题
3327 次
1 回答
1
在这两种情况下,长时间不活动的连接和丢失的连接 - 在通道中没有活动应该导致在OSI 模型的每一层中配置的时间之后超时。例如,您的防火墙/路由器/服务器可能会在 10 分钟内使非活动连接条目超时,那么您的应用层连接也应该在 10 分钟后执行此操作 - 等待更多是没有意义的。
为了防止静默连接超时,应引入保持活动协议。它可能是 ping(不完全是 ICMP)或其他形式的周期性无操作通信。当对等点处于活动状态时,它应该响应并因此刷新所有网络层上的超时倒计时。由于超时或层信号中断连接导致尝试失败后,您可以假设您的应用程序层连接也中断。
于 2011-09-22T07:21:23.227 回答