如何重现静默删除的TCP/IP连接?

Tho*_*sen 26 java linux networking tcp

我有一种情况,即Java程序与服务器建立长时间运行的TCP/IP连接,并且所述连接的功能与文档完全一致,除了我控制之外的环境中的一件事.

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

我需要能够重现这个场景才能创建一个正确的修复程序.

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

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

建议非常欢迎.


编辑2012-12-18:对我有用的解决方案是在本地使用基于Java的SOCKS5代理,可以随意使用Ctrl-Z暂停,并告诉我的应用程序完成它.

Hav*_*ess 9

使用Socat转发您的连接(很容易设置为TCP转发器/代理),如果您愿意,也可以在同一台机器上(通过引入代理的新端口进行操作并将其指向'官方'端点)

查看简单的TCP转发器示例

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

任何问题?我会试着回答......祝你好运!


小智 9

您应该能够使用iptables临时应用规则来丢弃来自远程服务器(abcd)的所有数据包.有点像:

iptables -A INPUT -s a.b.c.d -j DROP
Run Code Online (Sandbox Code Playgroud)

当您想关闭过滤器时

iptables -D INPUT -s a.b.c.d -j DROP
Run Code Online (Sandbox Code Playgroud)

您可以使用这些规则来删除其他特定数据包,但我认为这将准确地模拟客户端软件在服务器消失后会看到的内容.

但请注意,当您重新打开连接时,远程服务器可能仍然保持旧连接,因此这不能完美地模拟重新启动.

  • 这对于已经建立的连接不起作用。 (2认同)

Mal*_*alt 5

基于本机 Linux 的解决方案是将tcnetem一起使用。Netem 是一个特殊的队列,可以附加到各种网络接口上,造成延迟、重新排序和丢失(详见网页)。netem 使用的一些示例包括:

tc qdisc change dev eth0 root netem loss 0.1%
Run Code Online (Sandbox Code Playgroud)

使 eth0 丢弃 0.1% 的所有传出数据包,以及

tc qdisc change dev eth0 root netem loss 0.3% 25%
Run Code Online (Sandbox Code Playgroud)

要创建数据包丢失突发:

这将导致 0.3% 的数据包丢失,并且每个连续概率取决于最后一个的四分之一。

如果您还需要丢弃传入的数据包,您可以使用ifb(中间功能块设备)。您设置它,将 eth0 收到的所有数据包转发到 ifb,并将 netem 附加到 ifb 以创建丢失或延迟。有关更多详细信息,请参阅 ifb 的文档。