我最近和一个人讨论过,他违反了他们公司的防火墙设置。防火墙会清除状态表中任何闲置超过10分钟的连接。不幸的是,当它收到一个不在其状态表中的连接段时,它的行为是默默地丢弃该段。这意味着STCP应用程序可能需要8分钟以上的时间才能意识到它不能再与其端点通信并重新建立连接。这让他的用户很恼火。
这时我建议修改应用,加入一个可配置的应用层keep-alive消息。不幸的是,修改应用程序不是一个选项。应用程序也没有设置SO_KEEPALIVE套接字选项,所以即使将系统范围内的keep-alive定时器从2小时的默认值改为9分钟也不能解决问题。
解决方案是第三方的TCP层keep-alive段。这是一个看似来自应用程序的TCP层keep-alive段(使用模块的IP地址作为源地址,应用程序的TCP端口作为源端口),发送到远程主机的IP地址和端口。防火墙将此作为活动记录下来,并在其状态表中保留该连接。
我的3rd_party_keep_alive工具的解释和例子太长了,不适合写这篇博文,所以你可以在这里找到细节。