是否可以在不涉及任何一个进程的情况下关闭两个本地进程之间的 TCP 连接?
Can a TCP connection between two local processes be closed without either process being involved?
我有两个用两种不同编程语言编写的进程,它们通过本地 TCP 连接交换信息。一个进程正在启动另一个进程,但它们的生命周期必须共享,即如果一个进程死亡,另一个进程也会死亡,反之亦然。
我想使用 TCP 连接作为检测对方是否崩溃的机制,但我不确定它是否安全。我想知道在某些情况下,是否会因为进程崩溃或退出以外的其他原因关闭连接。
编辑:
- 理想情况下,系统需要跨 OS 可移植,这就是使用 TCP 连接而不是 Unix 域套接字的原因。
- 我知道可以使用管理工具终止连接。我想知道的是,如果在正常情况下(两个进程 运行 都正常)连接是否会关闭。
如果为您的进程提供服务的计算机距离很远,那么沿途的网络问题当然可能会导致问题,否则关闭连接并非易事。诸如“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+C
、Ctrl+\
或 kill
),另一方将获得 EOF(== 读取 0
字节) 尽快。
我有两个用两种不同编程语言编写的进程,它们通过本地 TCP 连接交换信息。一个进程正在启动另一个进程,但它们的生命周期必须共享,即如果一个进程死亡,另一个进程也会死亡,反之亦然。
我想使用 TCP 连接作为检测对方是否崩溃的机制,但我不确定它是否安全。我想知道在某些情况下,是否会因为进程崩溃或退出以外的其他原因关闭连接。
编辑:
- 理想情况下,系统需要跨 OS 可移植,这就是使用 TCP 连接而不是 Unix 域套接字的原因。
- 我知道可以使用管理工具终止连接。我想知道的是,如果在正常情况下(两个进程 运行 都正常)连接是否会关闭。
如果为您的进程提供服务的计算机距离很远,那么沿途的网络问题当然可能会导致问题,否则关闭连接并非易事。诸如“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+C
、Ctrl+\
或 kill
),另一方将获得 EOF(== 读取 0
字节) 尽快。