如何重现静默断开的 TCP/IP 连接?

2022-09-01 14:36:34

我有一个情况,一个Java程序与服务器建立了长时间运行的TCP / IP连接,并且该连接完全按照文档所述运行,除了我无法控制的环境中的一件事。

每个星期六,该服务器都会重新启动,但由于某种原因,这没有正确传达给我的客户端,因此连接只是挂起,等待永远的响应。这与陈旧的 JDBC 连接的行为完全相同,其中服务器和客户端之间的某些路由器发现连接处于空闲状态,并在没有通知的情况下将其丢弃。

我需要能够重现此方案才能创建正确的修复程序。

因此,我需要知道是否有一种好方法来模拟路由器静默地丢弃我控制下的连接?

我可以在我的开发环境和服务器之间放置一个Linux盒子或Mac。如果我可以在虚拟机(vmware播放器)中运行JVM,如果我可以在那里进行删除。

非常欢迎提出建议。


EDIT 2012-12-18:对我有用的解决方案是在本地使用基于Java的SOCKS5代理,该代理可以随意使用Ctrl-Z挂起,并告诉我的应用程序通过它。


答案 1

您应该能够使用 iptables 临时应用规则,以丢弃来自远程服务器 (a.b.c.d) 的所有数据包。类似的东西:

iptables -A INPUT -s a.b.c.d -j DROP

当您想要关闭过滤器时

iptables -D INPUT -s a.b.c.d -j DROP

您也可以使用这些规则来丢弃其他特定数据包,但我认为这将准确地模拟如果服务器消失,您的客户端软件将看到的内容。

但请注意,当您重新打开连接时,远程服务器可能仍然处于活动状态的旧连接,因此这不会完美地模拟重新启动。


答案 2

如果需要,甚至可以在同一台计算机上使用 Socat 转发连接(设置为 TCP 转发器/代理非常容易)(通过引入代理操作的新端口并将其指向“官方”端点)

查看简单的 TCP 转发器示例

然后,当您想要测试中断时,您可以杀死它(套接字将关闭)或尝试停止进程(CTRL Z linux)以查看目标如何处理停止的连接。

有问题吗?我会试着回答...祝你好运!


推荐