創(chuàng):扣釘日記(微信公眾號ID:codelogs),歡迎分享,轉(zhuǎn)載請保留出處。
如果你的程序?qū)懙糜忻。蜷_了很多TCP連接,但一直沒有關閉,即常見的連接泄露場景,你可能想要在排查問題的過程中,先臨時kill一波泄露的連接。
又比如你要驗證程序在遇到網(wǎng)絡錯誤時的自愈能力,想手動kill掉一些正常TCP連接,看程序是否能自動重連并恢復運行。
這些場景,都需要手動kill一部分TCP連接,那在Linux下有哪些kill連接的方法呢?
使用ngrep或tcpkill命令可以殺死活躍狀態(tài)的TCP連接,用法如下:
# ngrep殺死連接
$ sudo ngrep -d any -K3 '' 'port 54690'
# 安裝tcpkill,及使用其殺死連接
$ sudo apt install dsniff
$ sudo tcpkill -i any 'port 45308'
如上所示,可以發(fā)現(xiàn)在殺死連接時,ngrep和tcpkill都向連接方發(fā)送了RST包。
學過《計算機網(wǎng)絡》的同學都知道,TCP協(xié)議是通過FIN包與ACK包來做四次揮手,從而斷開TCP連接的,這是正常的TCP斷連過程,但TCP協(xié)議中還有RST包,這種包用于異常情況下斷開連接,Linux在收到RST包后,會直接關閉本端的Socket連接,而不需要經(jīng)歷四次揮手過程。
而上面的ngrep與tcpkill命令,正是通過給對方發(fā)送RST包,從而實現(xiàn)殺死TCP連接的。但要發(fā)送一個正確的RST包,需要知道TCP連接交互時所使用的序列號(seq),因為亂序的包會被TCP直接丟棄,所以ngrep和tcpkill還會監(jiān)聽網(wǎng)卡上交互的包,以找到指定連接所使用的序列號seq。
所以,ngrep與tcpkill只能kill有流量的活躍TCP連接,對于空閑連接就無法處理了。
對于空閑狀態(tài)的TCP連接,可以用ss或hping3命令來處理,如下:
通過ss命令的-K選項可以用來kill連接,如下:
# 安裝ss命令
$ sudo apt install iproute2
# 使用ss殺死目標端口為65987的連接
$ sudo ss -K dport=65987
注意,使用這個功能需要你的內(nèi)核版本>=4.9,且打開了CONFIG_INET_DIAG_DESTROY選項,因此某些情況下可能無法使用。
如果無法使用ss命令,則可以考慮使用hping3命令來kill連接,hping3命令可以發(fā)任何類型的TCP包,因此只要模擬tcpkill的原理即可,如下:
上面提到了,TCP協(xié)議會直接丟棄亂序的數(shù)據(jù)包,但是對于SYN包卻區(qū)別對待了,如果你隨便發(fā)一個SYN包給已連接狀態(tài)的Socket,它會回復一個ACK,并攜帶有正確的seq序列號,如下:
# 第一個參數(shù),表示發(fā)送包的目標ip地址
# -a:設置包的源ip地址
# -s:設置包的源端口
# -p:設置包的目標端口
# --syn:表示發(fā)SYN包
# -V:verbose output,使hping3輸出序列號seq
# -c:設置發(fā)包數(shù)量
$ sudo hping3 172.26.79.103 -a 192.168.18.230 -s 8080 -p 45316 --syn -V -c 1
using eth0, addr: 172.26.79.103, MTU: 1500
HPING 172.26.79.103 (eth0 172.26.79.103): S set, 40 headers + 0 data bytes
len=40 ip=172.26.79.103 ttl=64 DF id=16518 tos=0 iplen=40
sport=45316 flags=A seq=0 win=502 rtt=13.4 ms
seq=1179666991 ack=1833836153 sum=2acf urp=0
可以在輸出中找到,ack=1833836153即是對方回復的序列號,我們用在后面的發(fā)RST包中。
# --rst:表示發(fā)RST包
# --win:設置TCP窗口大小
# --setseq:設置包的seq序列包
$ sudo hping3 172.26.79.103 -a 192.168.18.230 -s 8080 -p 45316 --rst --win 0 --setseq 1833836153 -c 1
HPING 172.26.79.103 (eth0 172.26.79.103): R set, 40 headers + 0 data bytes
--- 172.26.79.103 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max=0.0/0.0/0.0 ms
整個過程如下:
可以發(fā)現(xiàn)前面我們用lsof查到的連接,在發(fā)送RST包后就查不到了,說明連接已經(jīng)被kill了。整個操作看起來有點麻煩,可以自己寫個腳本封裝一下。
相信很多朋友都聽說過“殺手網(wǎng)卡”,它是高性能Wi-Fi方案的代名詞之一,多被高端游戲本武裝。那么,被冠以“Killer”之名的網(wǎng)卡到底有何特色?
Killer殺手網(wǎng)卡(包括有線和無線)是Rivet Networks為游戲用戶打造的專業(yè)網(wǎng)絡設備,其核心是自帶網(wǎng)絡調(diào)節(jié)功能,可在一定程度上對UDP封包優(yōu)化的網(wǎng)游進行加速,因此深受專業(yè)游戲玩家的信賴。殺手網(wǎng)卡早期主要使用高通芯片,隨后逐步轉(zhuǎn)用Realtek和英特爾芯片。
2020年5月,英特爾正式宣布收購Rivet Networks,后者旗下的Killer網(wǎng)卡也歸入其中,無線網(wǎng)卡全部以“英特爾Killer Wi-Fi xxxx”命名,比如英特爾Killer Wi-Fi 6 AX1650(下文簡稱AX1650)和英特爾Killer Wi-Fi 6E AX1675(下文簡稱AX1675),它們分別是英特爾AX200和AX210無線網(wǎng)卡的“馬甲版”。有線網(wǎng)卡型號為Killer E3100G,迭代速度沒有無線版那么快。
近期殺手網(wǎng)卡馬甲對照表
不是簡單的馬甲
和英特爾AX200和AX210這類標準的無線網(wǎng)卡相比,冠以殺手之名的AX1650和AX1675最大特色,就是支持配套的“Killer Control Center”網(wǎng)卡驅(qū)動管理中心。通過它用戶可以全面了解網(wǎng)絡使用的即時狀態(tài),可配合自己使用的習慣,直觀地透過圖像符號調(diào)整程序使用的頻寬。
Killer Control Center的功能豐富且強大,它提供了多媒體模式和創(chuàng)作模式兩種Dashboard模式,前者為深色風格界面,設置偏向游戲、多媒體娛樂等;后者為淺色風格界面,偏向網(wǎng)頁流量、創(chuàng)作軟件運作。Proritization Engine可以識別進行網(wǎng)絡通訊的應用程序,劃分不同優(yōu)先級并進行限制,通過合理劃分就能在高速下載的同時玩游戲不卡頓。
獨特的GameFast游戲優(yōu)先技術,在檢測到游戲運行時會自動終止一些系統(tǒng)服務,保證游戲程序獨占系統(tǒng)資源,Intelligence Engine智能引擎服務還能針對當前網(wǎng)絡給出優(yōu)化建議。此外還有能在有線網(wǎng)卡和無線網(wǎng)卡進行負載均衡分配的Doubleshot,以及可以開啟熱點功能的xTend等等。
雖然AX1650和AX1675在Windows 10/11系統(tǒng)中可以實現(xiàn)免驅(qū)使用,但在安裝Killer Control Center前后在體驗上就是兩款不同的無線網(wǎng)卡,其高穩(wěn)定、低延遲的特性,必須搭配管理軟件才能被真正的釋放出來。
需要注意的是,網(wǎng)絡上流傳著通過修改Killer驅(qū)動描述文件的網(wǎng)卡ID的方式,欺騙系統(tǒng)使用對應的Killer驅(qū)動和管理軟件使用當前AX200和AX210網(wǎng)卡的教程,但這種方法的操作難度很大,還存在較大風險,不建議大家嘗試。
自己也能請來殺手
目前,只有一些高端游戲本才會標配殺手網(wǎng)卡,如果你的預算沒那么多,或是希望家里的老款筆記本和臺式機也能享受到殺手網(wǎng)卡對游戲的增益效果,可以通過網(wǎng)絡單獨購買最新的英特爾Killer Wi-Fi 6E AX1650或AX1675系列網(wǎng)卡,價格多在200元和300元起,是它們馬甲的2倍左右。
購買殺手網(wǎng)卡后,筆記本用戶只需替換掉原先的無線網(wǎng)卡,從官網(wǎng)下載并安裝驅(qū)動后即可使用。對于主板上沒有M.2無線網(wǎng)卡插槽的臺式機用戶,可以通過購買PCIe轉(zhuǎn)接卡來實現(xiàn)殺手無線網(wǎng)卡的升級,從而享受到當前最優(yōu)的網(wǎng)絡游戲體驗。