架构师说比起404我们更怕200错误
作者:小姐姐味道 时间:2022-11-02 20:40:43
引言
少年,你在怀着非法的心态看一篇简短的硬核科普!
先抛问题:如何杀掉一个正在等待 TCP 连接的 Thread?
由于众所周知的原因,在国内使用 maven,会等待很长的时间来下载相应的 jar 包。
如果我们正在使用 IDEA,就经常容易卡住。当我们点击进度条的时候,无论是等待,还是取消,都需要等待比较长的时间来完成当前的网络请求。
除非我们立马把 IDEA 关掉,然后再重新打开它。
why?
因为你没法用代码杀掉一条处于连接状态的连接。操作系统没有有暴露这样的 API!
但你可以杀掉进程。当进程停止的时候,与之关联的所有连接都会被释放。但是你无法杀掉线程,因为线程正在 BLOCK 在某个连接之上,你需要先关掉这个连接才能让线程自动释放。
一般的连接工具包,都会提供 soTimeout 这个参数,用来配置超时。比如 MySQL 客户端:
jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=60000
通过设置超时时间可以防止出现网络错误时一直等待的情况并缩短故障时间,防止死连接的产生。但如果连接没有设置超时呢?
它就会永远 Block 在那里!
在 Linux 上,有 tcpkill、killcx 等工具,可以杀掉一条处于 established 状态的连接。
以tcpkill为例,我们需要安装相应的工具包。
yum install dsniff -y
然后,使用netstat 或者 ss, 或者 lsof 等命令,找到要杀掉的连接。然后杀掉它。
tcpkill -9 -i eth0 host 10.0.1.197 and port 2222
执行了这样的操作之后,Thread 就能够自动正常关闭了。
那它是怎么实现的呢?
这又和老生常谈的 TCP 四次挥手有关了。
想要关掉一条连接,需要经过 FIN 包和 ACK 包做四次挥手。这个过程很麻烦,但不要忘了,我们还有 RST 包,它可以直接引起连接的关闭。
可惜的是,如果你想要发送 RST 包,那必须首先要知道交互时所使用的 SEQ 序列号,因为乱序的数据包将会被 操作系统直接丢弃。
所以,工具需要首先监听这个连接,然后获取其中的序列号。再拿着这个序列号,发起模拟的 RST 数据包。你的连接就这样断掉了。
墙,也是这么干的。
来源:https://juejin.cn/post/7172373716390084644
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python进程间通信之共享内存详解
PHP join()函数用法与实例讲解
![](https://img.aspxhome.com/file/2023/8/55378_0s.png)
Go 高效截取字符串的一些思考
Java常用正则表达式验证类完整实例【邮箱、URL、IP、电话、身份证等】
python3.6环境下安装freetype库和基本使用方法(推荐)
![](https://img.aspxhome.com/file/2023/0/135050_0s.jpg)
JavaScript定时器实现的原理分析
![](https://img.aspxhome.com/file/2023/4/56094_0s.jpg)
Python实现在线批量美颜功能过程解析
![](https://img.aspxhome.com/file/2023/1/79731_0s.jpg)
漂亮的Django Markdown富文本app插件的实现
![](https://img.aspxhome.com/file/2023/3/80533_0s.jpg)
Mysql 数据库双机热备的配置方法
Python实现查询某个目录下修改时间最新的文件示例
python中ASCII码字符与int之间的转换方法
升级和卸载Oracle数据库软件的命令整理
selenium+python设置爬虫代理IP的方法
Python解决爬虫程序卡死问题
![](https://img.aspxhome.com/file/2023/2/78582_0s.webp)
常用原生js自定义函数总结
SQL JOIN 连接详细介绍及简单使用实例
python Pandas之DataFrame索引及选取数据
Python提高运行速度工具之Pandarallel的使用教程
![](https://img.aspxhome.com/file/2023/9/93699_0s.png)
浅谈python import引入不同路径下的模块
Python函数命名空间,作用域LEGB及Global详析
![](https://img.aspxhome.com/file/2023/3/99153_0s.png)