Node.js 退出本地主机上的客户端,而不断开与本地主机上服务器的TCP连接(不带FIN数据包) 原始问题

Node.js 退出本地主机上的客户端,而不断开与本地主机上服务器的TCP连接(不带FIN数据包) 原始问题,node.js,telnet,Node.js,Telnet,我正在使用telnet连接到node.js TCP服务器(在本地主机上),并尝试探索保持活动的探测 作为第一个测试,我希望使用telnet连接到服务器,并以不发送FIN数据包的方式终止telnet会话。(让服务器认为TCP套接字仍然是“健康的”。)不幸的是,我似乎找不到一个聪明的方法来测试它 当我从telnet提示符退出telnet时,套接字的end事件在节点中激发。很明显,它有一个FIN包 当Ikilltelnet的进程时,它也会在进程死亡之前,用FIN包干净地退出连接 您知道一种不发送F

我正在使用telnet连接到node.js TCP服务器(在本地主机上),并尝试探索保持活动的探测

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

  • 当我从telnet提示符退出telnet时,套接字的
    end
    事件在节点中激发。很明显,它有一个FIN包
  • 当I
    kill
    telnet的进程时,它也会在进程死亡之前,用FIN包干净地退出连接
您知道一种不发送FIN数据包就退出telnet的方法吗(最好不涉及断开连接/产生物理网络故障的网络电缆。)

改进问题 我想只使用localhost/loopback(不实际断开任何接口/网络电缆)来模拟网络故障。我想在本地主机上打开客户端和服务器之间的TCP连接。然后,我希望客户端“死亡”,而不让服务器知道它已经死了。(即,不发送FIN数据包。)例如,在实际网络中,如果路由器发生故障,这种情况可能会发生

多亏了下面的注释,我了解到当进程死亡(或被强制终止)时,内核将收集进程拥有的所有打开的端口/套接字,如上面我的
telnet
,并将通过发送FIN数据包为进程关闭这些端口/套接字。因此,我需要欺骗内核,使其不关闭现有连接

那么,我如何创建一个客户端进程,让它保持活动状态,但让它像一个完全死掉的TCP连接一样工作呢

破坏者
  • (下面的答案1:使用原始套接字(scapy),让它忽略初始连接后服务器发送的任何数据包和一些测试数据。(例如,在一定时间后。)
  • (回答2,同事的想法:配置
    iptables
    以切断客户端和服务器之间的通信。下面评论中的实际
    iptables
    规则。)

是否必须终止客户端进程?如果是这样,只需使用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。这是我的建议。您将执行类似于TCP SYN扫描的操作,只是需要确认服务器提供给您的SYN-ACK。这将使服务器套接字处于“已连接”状态,您可以继续执行其他操作。服务器可能会偶尔确认您,但您的测试程序不会在意。它将只发送SYN并响应SYN确认

您需要断开机器与网络的连接。“断开”进程将始终导致操作系统/计算机正确关闭套接字


在不拔下电缆的情况下,断开机器连接的最简单方法就是更改机器的IP地址。

我不明白。根据定义,telnet会话与TCP连接是同延的。”不发送FIN退出Telnet“因此没有确定的意义。我正在尝试创建与Telnet的“断开的TCP连接”。因此,您希望在不产生物理网络故障的情况下产生物理网络故障。你只要把它说清楚,就可以看出这是一个术语上的矛盾。@EJP不,他在找别的东西。不幸的是,网络堆栈存在于内核中,并且作为进程退出和清理的一部分(在Windows和Linux中),内核将运行它认为已打开的所有套接字,作为CloseHandle()或close()的一部分或其他任何内容的一部分。。。因此,您必须保持进程的活动状态,否则将由内核接管。如果不执行下面我的回答,您将不得不修改网络堆栈并重新编译,或者自己钩住网络功能。我下面的解决方案要简单得多。@Mattypper我知道所有这些,尽管我看不出它们的相关性。我不明白的是关于在没有FIN的情况下退出telnet会话的部分。在telnet会话获得FIN或通过RST得知网络故障之前,它将保持活动状态。他是想在这里挑起一个FIN吗?我喜欢让客户端保持活动的想法,但我正在尝试测试服务器端的保持活动探测功能,因此服务器将发送SYN,我希望客户端“装死”并且根本不响应。这可能吗,Matt?嗯,内核可能会代表客户端进程接管并发送SYN的确认(是的,这些进程已连接并正在运行,套接字打开),可能没有简单的方法让它“保持安静”。我已经阅读了keep alive Probe,在我的评论中用确认替换所有提到的SYN,求你了。嗯,然后你会想在一个工具的帮助下使用一个原始的套接字,比如。这是我的建议。您将执行类似于TCP SYN扫描的操作,只是需要确认服务器提供给您的SYN-ACK。这将使服务器套接字处于“已连接”状态,您可以继续执行其他操作。服务器可能会偶尔确认您,但您的测试程序不会在意。它将只发送SYN并响应SYN-ACKs。谢谢,Scapy看起来很酷。我希望Unix能有一个很好的原始套接字工具来创建断开的TCP连接,但我将使用Scapy,自己制造一个客户端“死套接字/假网络问题”。添加一个IP表/防火墙规则来立即切断本地主机上某个端口(客户端正在侦听该端口)的所有通信量,怎么样?这也行。任何简单地停止协议/本地数据包流的操作-