原始问题
我正在使用 telnet 连接到 node.js TCP 服务器(在 localhost 上),并且我正在尝试探索保持活动状态的探针。
作为第一个测试,我想用 telnet 连接到服务器并以不发送 FIN 数据包的方式终止 telnet 会话。(让服务器认为 TCP 套接字仍然“健康”。)不幸的是,我似乎找不到一个聪明的方法来测试它。
- 当我从 telnet 提示符退出 telnet 时,套接字的
end
事件在节点中触发。它显然得到了一个 FIN 数据包。 - 当我
kill
telnet 的进程时,它也会在进程终止之前用 FIN 数据包干净地退出连接。
您是否知道在不发送 FIN 数据包的情况下退出 telnet 的方法(最好不涉及断开/产生物理网络故障的网络电缆。)
改进的问题
我想仅使用 localhost / loopback 来模拟网络故障(实际上没有断开任何接口/网络电缆)。我想在本地主机上打开客户端和服务器之间的 TCP 连接。然后我希望客户端“死”而不让服务器知道它已经消失了。(即不发送 FIN 数据包。)这可能发生在真实网络中,例如,如果路由器出现故障。
感谢下面的评论,我了解到当进程死亡(或被强制终止)时,内核将收集进程拥有的任何打开的端口/套接字,就像我telnet
上面的一样,并通过发送 FIN 来关闭它们包。所以我需要欺骗内核不要关闭现有的连接。
那么我怎样才能创建一个客户端进程,让它保持活动状态,但让它表现得像一个完全死掉的 TCP 连接呢?
剧透
- (下面的答案1:使用原始套接字(scapy),让它忽略初始连接后服务器发送的任何数据包和一些测试数据。(例如,在一定时间后。)
- (答案2,同事的想法:配置
iptables
切断客户端和服务器之间的流量。实际iptables
规则在下面的评论中。)