是否可以在不涉及任何一个进程的情况下关闭两个本地进程之间的 TCP 连接?

Can a TCP connection between two local processes be closed without either process being involved?

我有两个用两种不同编程语言编写的进程,它们通过本地 TCP 连接交换信息。一个进程正在启动另一个进程,但它们的生命周期必须共享,即如果一个进程死亡,另一个进程也会死亡,反之亦然。

我想使用 TCP 连接作为检测对方是否崩溃的机制,但我不确定它是否安全。我想知道在某些情况下,是否会因为进程崩溃或退出以外的其他原因关闭连接。

编辑:

如果为您的进程提供服务的计算机距离很远,那么沿途的网络问题当然可能会导致问题,否则关闭连接并非易事。诸如“tcpkill”之类的工具可以关闭在本地计算机上发起或终止的连接,如果您穿过防火墙,那么防火墙管理员当然可以关闭通过的连接。

我认为你的方案会很有效;如果某些原因导致网络连接中断,那么您的两个进程都将终止,因此最坏的情况是停机时间过长——我不希望通过正常网络连接。


tcpkill: https://linux.die.net/man/8/tcpkill

当连接 运行 时,您可以使用 iptables 对端口设置防火墙。通过忽略包或发送 RST,您可以模拟不同的场景:远程主机死亡,远程主机关闭连接。

示例:

# drop packages
iptables -p tcp --dport PORT_NUM -j DROP

# send RST
iptables -p tcp --dport PORT_NUM -j REJECT --reject-with tcp-reset

我已经使用上面的目标端口,根据源端口使用进行过滤 --sport

如果一侧崩溃(或 closes/shuts-down 其套接字通过任何其他方式崩溃),另一侧将认为套接字可读并在尝试读取时获得 EOF。

您可以通过观察 client-server nc 对轻松检查此行为,可能使用 strace.

服务器:

strace nc -l localhost 3333

客户:

strace nc localhost 3333

每当一方被终止时(例如,使用 Ctrl+CCtrl+\kill),另一方将获得 EOF(== 读取 0 字节) 尽快。