在localhost上退出客户端,而不断开与localhost上的服务器的TCP连接(没有FIN数据包)

时间:2012-10-04 21:49:50

标签: node.js telnet

原始问题

我正在使用telnet连接到node.js TCP服务器(在localhost上),我正在尝试探索keep-alive探测器。

作为第一个测试,我想用telnet连接到服务器并以不发送FIN数据包的方式终止telnet会话。 (让服务器认为TCP套接字仍然“健康”。)不幸的是,我似乎无法找到一种巧妙的测试方法。

  • 当我从telnet提示符退出telnet时,套接字的end事件将在节点中触发。它显然有一个FIN数据包。
  • 当我kill telnet的进程时,它也会在进程终止之前干净地退出与FIN数据包的连接。

您是否知道在不发送FIN数据包的情况下退出telnet的方法(最好不要涉及断开/产生物理网络故障的网络电缆。)

改进了问题

我想使用localhost / loopback模拟网络故障(实际上没有断开任何接口/网络电缆)。我想在localhost上打开客户端和服务器之间的TCP连接。然后我希望客户端“死”而不让服务器知道它已经消失了。 (即没有发送FIN数据包。)例如,如果路由器出现故障,这可能发生在真实的网络中。

感谢下面的评论,我了解到,当进程死亡(或被强制杀死)时,内核将收集进程拥有的任何开放端口/套接字,如上面的telnet,并将关闭它们通过发送FIN数据包进行处理。所以我需要欺骗内核而不关闭现有的连接。

那么我怎样才能创建一个客户端进程,让它保持活动状态,但让它的行为就像一个完全死的TCP连接?

扰流板

  • (下面的答案1:使用原始套接字(scapy),让它忽略服务器在初始连接和某些测试数据之后发送的任何数据包。(例如,经过一段时间后)。)
  • (答案2,来自同事的意见:配置iptables以切断客户端和服务器之间的流量。下面的评论中的实际iptables规则。)

2 个答案:

答案 0 :(得分:1)

你必须杀死客户端进程吗?如果是这样,只需使用netcat并让进程在后台运行。在bash:

for i in $(seq 5) do nc localhost 5001 &; sleep 1; done

这将创建5个TCP客户端,其中SYN间隔1秒。如果您需要与其中一个会话进行交互,则可以使用

fg $PID

将netcat的一个返回到shell前台。

另一种选择是iptables规则:

iptables -A OUTPUT -p tcp --tcp-flags FIN -j DROP

另一种选择是使用带有原始套接字的低级网络工具,例如Scapy。这是Python Documentation for Scapy。您将执行类似于TCP SYN扫描的操作,除非您需要确认服务器为您提供的SYN-ACK。这将使服务器套接字处于“已连接”状态,您可以继续执行其他操作。服务器可能会偶尔向您发送确认,但您的测试程序无关紧要。它只会发送SYN并响应SYN-ACK

答案 1 :(得分:0)

您需要断开机器与网络的连接。 “断开”进程将始终使OS /机器正确关闭套接字。

在没有物理拔出电缆的情况下断开机器的最简单方法就是更改机器的IP地址。