架构师说比起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
猜你喜欢
- 您也可以提供几个连接字符串修饰符来控制连接池行为,请参见本主题内下文中“使用连接字符串关键字控制连接池”这一节。池的创建和分配当连接打开时,
- 1 数据准备1.1 新建数据表CREATE TABLE `player` ( `id` bigint(20) NOT NULL
- 画之前肯定要知道规格图,我找了一个大致的图。参考图片:绘制大星的方法很简单,五角星的补角是144度。绘制小五角星有点麻烦,因为我国国旗上的小
- PHP有效的时间戳典型范围是格林威治时间 1901 年 12 月 13 日 20:45:54 到 203
- 绘制动图FuncAnimation,它的使用要求简洁且定制化程度较高。如果想将很多图片合并为一个动图,那么ArtistAnimation是最
- 本文实例讲述了python实现的简单抽奖系统。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env python#codin
- 用Matplotlib画三维图最基本的三维图是由(x, y, z)三维坐标点构成的线图与散点图,可以用ax.plot3D和ax.scatte
- 方法一:使用列表推导式>>> vec = [[1,2,3],[4,5,6],[7,8,9]]>>> ge
- 由于marquee标签现在用得是越来越少了,所以滚动效果的做法大多也都改用javascript来实现了,至于不明白为什么不直接用marque
- 只要不是HTTP_REFERER来源于(google.com google.cn *.google.com *.google.cn baid
- MySQL注入的意图是接管网站数据库并窃取信息。常见的开源数据库,如MySQL,已经被许多网站开发人员用来储存重要信息,如密码,个人信息和管
- vuex状态刷新网页时数据被清空问题vuex状态管理,在网页刷新数据被清空的解决方法。在main.js中写入下面的代码段(亲测有效)//刷新
- 一、batch与shell中目录及文件:C:\TESTFOLDER\TEST├─Test2└─Test3
- 在开发一些需要网络通信的应用中,经常会用到各种网络协议进行通信,博主在开发实验室的机器人的时候就遇到了需要把机器人上采集到的图片传回服务器进
- map()是python的一个内建函数, 他能够通过函数来处理序列,比如,我们相关一个数组[0,1,2,3,4,5]所有的数字都+2 , 当
- 我不知道有多少人在使用浏览器的书签,这东东有时候实在是很有用的,比如现在说到的jQuerify书签。jQuerify书签的功能很简单,那就是
- 早就想用一个系列的文章来写AJAX,让自己头到尾理一遍,更好的掌握基础知识(昨天的面试受打击了,基础知识很重要).要是写的好,也许也可以帮助
- Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。 还要创建另外一个表[Audit]
- 决策树分类与上一篇博客k近邻分类的最大的区别就在于,k近邻是没有训练过程的,而决策树是通过对训练数据进行分析,从而构造决策树,通过决策树来对
- 1. raw,mhd 格式医学图像数据转换raw+mhd格式是常见的一种医学图像格式,每一个病人的数据包含一个mhd文件和一个同名的raw文