日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

架構(gòu)師說比起404我們更怕200錯誤_相關(guān)技巧

作者:小姐姐味道 ? 更新時間: 2023-01-28 編程語言

引言

少年,你在懷著非法的心態(tài)看一篇簡短的硬核科普!

先拋問題:如何殺掉一個正在等待 TCP 連接的 Thread?

由于眾所周知的原因,在國內(nèi)使用 maven,會等待很長的時間來下載相應(yīng)的 jar 包。

如果我們正在使用 IDEA,就經(jīng)常容易卡住。當我們點擊進度條的時候,無論是等待,還是取消,都需要等待比較長的時間來完成當前的網(wǎng)絡(luò)請求。

除非我們立馬把 IDEA 關(guān)掉,然后再重新打開它。

why?

因為你沒法用代碼殺掉一條處于連接狀態(tài)的連接。操作系統(tǒng)沒有有暴露這樣的 API!

但你可以殺掉進程。當進程停止的時候,與之關(guān)聯(lián)的所有連接都會被釋放。但是你無法殺掉線程,因為線程正在 BLOCK 在某個連接之上,你需要先關(guān)掉這個連接才能讓線程自動釋放。

一般的連接工具包,都會提供 soTimeout 這個參數(shù),用來配置超時。比如 MySQL 客戶端:

jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=60000

通過設(shè)置超時時間可以防止出現(xiàn)網(wǎng)絡(luò)錯誤時一直等待的情況并縮短故障時間,防止死連接的產(chǎn)生。但如果連接沒有設(shè)置超時呢?

它就會永遠 Block 在那里!

在 Linux 上,有 tcpkill、killcx 等工具,可以殺掉一條處于 established 狀態(tài)的連接。

以tcpkill為例,我們需要安裝相應(yīng)的工具包。

yum install dsniff -y

然后,使用netstat 或者 ss, 或者 lsof 等命令,找到要殺掉的連接。然后殺掉它。

tcpkill -9 -i eth0 host 10.0.1.197 and port 2222

執(zhí)行了這樣的操作之后,Thread 就能夠自動正常關(guān)閉了。

那它是怎么實現(xiàn)的呢?

這又和老生常談的 TCP 四次揮手有關(guān)了。

想要關(guān)掉一條連接,需要經(jīng)過 FIN 包和 ACK 包做四次揮手。這個過程很麻煩,但不要忘了,我們還有 RST 包,它可以直接引起連接的關(guān)閉。

可惜的是,如果你想要發(fā)送 RST 包,那必須首先要知道交互時所使用的 SEQ 序列號,因為亂序的數(shù)據(jù)包將會被 操作系統(tǒng)直接丟棄。

所以,工具需要首先監(jiān)聽這個連接,然后獲取其中的序列號。再拿著這個序列號,發(fā)起模擬的 RST 數(shù)據(jù)包。你的連接就這樣斷掉了。

墻,也是這么干的。

原文鏈接:https://juejin.cn/post/7172373716390084644

欄目分類
最近更新