在 Linux 中关闭孤立的 TCP 连接非常困难。这个问题已经提出这里,这里,这里, 和这里;然而,这两种方法对我来说都不起作用。
调用close()
不起作用,因为没有关联进程。安装CurrPorts
不起作用,因为我不是在 Windows 上。设置tcp_max_orphans
为零的方法没有成功(我认为即使成功,也不会立即终止连接)。运行tcpkill
不起作用,因为没有活动流量。运行killcx
失败no response from child, operation may have failed
。Google 的tcp_killer失败Socket not found for connection
。设置短超时并等待它不是一个选项,因为我必须立即重用 IP 和端口。
在整个过程中,netstat -tp
始终表明连接处于活动状态:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 156 localhost:54494 localhost:xmpp-client FIN_WAIT1 -
有什么方法可以立即终止此TCP连接?
答案1
我遇到的最好的解决方案(尽管有点蛮力)是这个很好的内核模块,称为丢弃 TCP 套接字由他人制作用户StackExchange 社区。它使用inet_twsk_deschedule_put()
Linux 内核,尽管此功能旨在强制终止该状态下的 TCP 连接,但它也TIME_WAIT
可用于终止。FIN_WAIT1
该模块可以加载:
git clone https://github.com/milabs/drop-tcp-sock.git
cd drop-tcp-sock && make
insmod ./drop-tcp-sock.ko
然后(在我的场景中)使用:
echo "127.0.0.1:54494 127.0.0.1:5222" >/proc/net/tcpdropsock