網站首頁 編程語言 正文
引言
少年,你在懷著非法的心態看一篇簡短的硬核科普!
先拋問題:如何殺掉一個正在等待 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
相關推薦
- 2023-07-08 echarts多個series進行自定義tooltip的數據顯示
- 2023-07-13 css對盒模型的理解
- 2022-11-15 TypeScript數組實現棧與對象實現棧的區別詳解_其它
- 2022-06-18 使用matplotlib創建Gif動圖的實現_python
- 2022-04-02 .Net使用SuperSocket框架實現WebSocket前端_實用技巧
- 2022-07-12 mongoDB替換replace某個字段的部分內容
- 2022-08-23 Shell?腳本自動輸入密碼的三種方式小結_linux shell
- 2022-10-20 利用Python的tkinter模塊實現界面化的批量修改文件名_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支