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