新聞中心
教程:如何在Linux上統(tǒng)計(jì)TCP連接時(shí)長(zhǎng)

作為一名Linux系統(tǒng)管理員,網(wǎng)絡(luò)連接是我們經(jīng)常需要關(guān)注的一個(gè)數(shù)據(jù)和指標(biāo)。在處理網(wǎng)絡(luò)故障、優(yōu)化網(wǎng)絡(luò)性能等方面,了解TCP連接時(shí)長(zhǎng)的情況是非常有幫助的。本篇文章將介紹如何在Linux上統(tǒng)計(jì)TCP連接時(shí)長(zhǎng),讓你快速掌握各種TCP連接的情況。
1. 準(zhǔn)備工作
在開始統(tǒng)計(jì)TCP連接時(shí)長(zhǎng)之前,我們需要確保系統(tǒng)中已經(jīng)安裝了必要工具。這些工具主要包括:
– netstat:用于顯示網(wǎng)絡(luò)連接、路由表等信息。
– awk:用于數(shù)據(jù)處理和分析。
– sort:用于排序。
– uniq:用于去重。
大多數(shù)基于Linux的操作系統(tǒng)都默認(rèn)安裝了這些工具。你可以通過(guò)執(zhí)行以下命令來(lái)驗(yàn)證這些工具是否可用:
“`
$ which netstat awk sort uniq
“`
如果這些命令有任何輸出,則說(shuō)明這些工具已經(jīng)安裝并且可用。
2. 統(tǒng)計(jì)TCP連接時(shí)長(zhǎng)
2.1 使用netstat命令統(tǒng)計(jì)時(shí)長(zhǎng)
最簡(jiǎn)單的方法是使用netstat命令顯示當(dāng)前的TCP連接,并使用awk命令提取連接時(shí)長(zhǎng)。具體命令如下:
“`
$ netstat -npt | awk ‘/^tcp/ {print $4,$7}’ | awk -F: ‘{print $1,$2}’ | awk ‘{print $1,$2,$3,$4,$5,int($6/60)”:”int($6%60)}’
“`
這個(gè)命令會(huì)輸出一個(gè)連接列表,其中包含本地IP地址、本地端口、遠(yuǎn)程IP地址、遠(yuǎn)程端口和連接時(shí)長(zhǎng)。連接時(shí)長(zhǎng)以分鐘:秒的形式呈現(xiàn)。
2.2 使用腳本自動(dòng)統(tǒng)計(jì)時(shí)長(zhǎng)
如果需要定期獲取TCP連接時(shí)長(zhǎng)的情況,可以編寫一個(gè)腳本來(lái)自動(dòng)完成這個(gè)任務(wù)。以下是一個(gè)簡(jiǎn)單的bash腳本,可以在Linux上自動(dòng)統(tǒng)計(jì)TCP連接時(shí)長(zhǎng):
“`
#!/bin/bash
# 獲取當(dāng)前日期和時(shí)間
now=$(date +”%Y-%m-%d_%H:%M:%S”)
# 定義輸出文件
output_file=”/tmp/tcp_conn_$now.txt”
# 使用netstat命令查詢TCP連接,提取連接時(shí)長(zhǎng)
netstat -npt | awk ‘/^tcp/ {print $4,$7}’ | awk -F: ‘{print $1,$2}’ | awk ‘{print $1,$2,$3,$4,$5,int($6/60)”:”int($6%60)}’ > $output_file
echo “TCP連接時(shí)長(zhǎng)統(tǒng)計(jì)結(jié)果已經(jīng)保存到: $output_file”
“`
該腳本會(huì)將TCP連接時(shí)長(zhǎng)記錄在/tmp/tcp_conn_日期時(shí)間.txt中。
3. 統(tǒng)計(jì)連接數(shù)
如果需要統(tǒng)計(jì)TCP連接數(shù),我們可以使用以下命令來(lái)查看當(dāng)前的TCP連接數(shù):
“`
$ netstat -nat | awk ‘$1~/^tcp/ {print $NF}’ | sort | uniq -c | sort -rn
“`
該命令將輸出所有的TCP狀態(tài)和連接數(shù)。你可以使用uniq指令來(lái)去重并計(jì)數(shù),再利用sort命令的-rn選項(xiàng)按照連接數(shù)從大到小排序。
4.
通過(guò)以上介紹,我們已經(jīng)了解到如何在Linux上統(tǒng)計(jì)TCP連接時(shí)長(zhǎng)和連接數(shù)。這些信息對(duì)于管理網(wǎng)絡(luò)的系統(tǒng)管理員來(lái)說(shuō)是非常有用的。希望這篇文章可以幫助你輕松地獲取TCP連接的時(shí)長(zhǎng)以及其他網(wǎng)絡(luò)連接的信息。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220Linux – CentOS 7 – 查看TCP/IP連接狀態(tài)
查看TCP/IP連接的狀態(tài)命令如下:
暢談linux下TCP(上)
tcp 協(xié)議 是互聯(lián)網(wǎng)中最常用的協(xié)議 , 開發(fā)人員基本上天天和它打交道,對(duì)它進(jìn)行深入了解。 可以幫助我們排查定位bug和進(jìn)行程序優(yōu)化。下面我將就TCP幾個(gè)點(diǎn)做深入的探討
客戶端:收到 ack 后 分配連接資源。 發(fā)送數(shù)據(jù)
服務(wù)器 : 收到 syn 后立即 分配連接資源
客戶端:收到ACK, 立即分配資源
服務(wù)器:收到ACK, 立即分配資源
既然三次握手也液銀顫不是100%可靠, 那四次,五次,六次。。。呢? 其實(shí)都一樣,不管多少次都有丟包問(wèn)題。
client 只發(fā)送一個(gè) SYN, server 分配一個(gè)tcb, 放入syn隊(duì)列中。 這時(shí)候連接叫
半連接
狀態(tài);如果server 收不到 client 的ACK, 會(huì)不停重試 發(fā)送 ACK-SYN 給client 。重試間隔 為 2 的 N 次方 疊加(2^0 , 2^1, 2^2 ….);直至超時(shí)才釋放syn隊(duì)列中的這個(gè) TCB;
在半連接狀態(tài)下, 一方面會(huì)占用隊(duì)列配額資源,另一方面占用內(nèi)存資源。我們應(yīng)該讓半連接狀態(tài)存在時(shí)間盡可能的小
當(dāng)client 向一個(gè)未打開的端口發(fā)起連接請(qǐng)求時(shí),會(huì)收到一個(gè)RST回復(fù)包
當(dāng)listen 的 backlog 和 somaxconn 都設(shè)置了得時(shí)候, 取兩者min值
Recv-Q 是accept 隊(duì)列當(dāng)前個(gè)數(shù), Send-Q 設(shè)置更大值
這種SYN洪水攻擊是一種常見(jiàn)攻擊方式,就是利用半連接隊(duì)列特性,占滿syn 隊(duì)列的 資源,導(dǎo)致 client無(wú)法連接上。
解決方案:
為什么不像握手那樣合并成三次揮手? 因?yàn)楹蛣傞_始連接情況,連接是大家都從0開始, 關(guān)閉時(shí)有歷史包袱的。server(被動(dòng)關(guān)閉方) 收到 client(主動(dòng)關(guān)閉方) 的關(guān)閉請(qǐng)求FIN包。 這時(shí)候可能還有未發(fā)送完的數(shù)據(jù),不能丟棄。 所以需要分開。事實(shí)可能是這樣
當(dāng)然,在沒(méi)有待發(fā)數(shù)據(jù),并且允許 Delay ACK 情況下, FIN-ACK合并還是非常常見(jiàn)的事情,這是三次揮手是可以的。
同上
CLOSE_WAIT 是被動(dòng)關(guān)閉方才有的狀態(tài)
。
被動(dòng)關(guān)閉方 到 期間的狀態(tài)為 CLOSE_WAIT, 這個(gè)狀態(tài)仍然能發(fā)鬧敗送數(shù)據(jù)。 我們叫做
半關(guān)閉
, 下面用個(gè)例子來(lái)分析:
這個(gè)是我實(shí)際生產(chǎn)環(huán)境碰到的一個(gè)問(wèn)題,長(zhǎng)連接會(huì)話場(chǎng)景,server端收到client的rpc call 請(qǐng)求1,處理發(fā)現(xiàn)請(qǐng)求包有問(wèn)題,就強(qiáng)制關(guān)閉結(jié)束這次會(huì)話, 但是 因?yàn)閏lient 發(fā)送 第二次請(qǐng)求之前,并沒(méi)有去調(diào)用recv,所以并不知道 這個(gè)連接被server關(guān)閉, 繼續(xù)發(fā)送 請(qǐng)求2 , 此時(shí)是半連接,能夠成功發(fā)送到對(duì)端機(jī)器,但是recv結(jié)果后,搏兆遇到連接已經(jīng)關(guān)閉錯(cuò)誤。
如果 client 和 server 恰好同時(shí)發(fā)起關(guān)閉連接。這種情況下,兩邊都是主動(dòng)連接,都會(huì)進(jìn)入 TIME_WAIT狀態(tài)
1、
被動(dòng)關(guān)閉方在LAST_ACK狀態(tài)(已經(jīng)發(fā)送FIN),等待主動(dòng)關(guān)閉方的ACK應(yīng)答,但是 ACK丟掉, 主動(dòng)方并不知道,以為成功關(guān)閉。因?yàn)闆](méi)有TIME_WAIT等待時(shí)間,可以立即創(chuàng)建新的連接, 新的連接發(fā)送SYN到前面那個(gè)未關(guān)閉的被動(dòng)方,被動(dòng)方認(rèn)為是收到錯(cuò)誤指令,會(huì)發(fā)送RST。導(dǎo)致創(chuàng)建連接失敗。
2、
主動(dòng)關(guān)閉方斷開連接,如果沒(méi)有TIME_WAIT等待時(shí)間,可以馬上建立一個(gè)新的連接,但是前一個(gè)已經(jīng)斷開連接的,延遲到達(dá)的數(shù)據(jù)包。 被新建的連接接收,如果剛好seq 和 ack字段 都正確, seq在滑動(dòng)窗口范圍內(nèi)(只能說(shuō)機(jī)率非常小,但是還是有可能會(huì)發(fā)生),會(huì)被當(dāng)成正確數(shù)據(jù)包接收,導(dǎo)致數(shù)據(jù)串包。 如果不在window范圍內(nèi),則沒(méi)有影響( 發(fā)送一個(gè)確認(rèn)報(bào)文(ack 字段為期望ack的序列號(hào),seq為當(dāng)前發(fā)送序列號(hào)),狀態(tài)變保持原樣)
TIME_WAIT 問(wèn)題比較比較常見(jiàn),特別是CGI機(jī)器,并發(fā)量高,大量連接后段服務(wù)的tcp短連接。因此也衍生出了多種手段解決。雖然每種方法解決不是那么完美,但是帶來(lái)的好處一般多于壞處。還是在日常工作中會(huì)使用。
1、改短TIME_WAIT 等待時(shí)間
這個(gè)是之一個(gè)想到的解決辦法,既然等待時(shí)間太長(zhǎng),就改成時(shí)間短,快速回收端口。但是實(shí)際情況往往不樂(lè)觀,對(duì)于并發(fā)的機(jī)器,你改多短才能保證回收速度呢,有時(shí)候幾秒鐘就幾萬(wàn)個(gè)連接。太短的話,就會(huì)有前面兩種問(wèn)題小概率發(fā)生。
2、禁止Socket lingering
這種情況下關(guān)閉連接,會(huì)直接拋棄緩沖區(qū)中待發(fā)送的數(shù)據(jù),會(huì)發(fā)送一個(gè)RST給對(duì)端,相當(dāng)于直接拋棄TIME_WAIT, 進(jìn)入CLOSE狀態(tài)。同樣因?yàn)槿∠?TIME_WAIT 狀態(tài),會(huì)有前面兩種問(wèn)題小概率發(fā)生。
3、tcp_tw_reuse
net.ipv4.tcp_tw_reuse選項(xiàng)是 從 TIME_WAIT 狀態(tài)的隊(duì)列中,選取條件:1、remote 的 ip 和端口相同, 2、選取一個(gè)時(shí)間戳小于當(dāng)前時(shí)間戳; 用來(lái)解決端口不足的尷尬。
現(xiàn)在端口可以復(fù)用了,看看如何面對(duì)前面TIME_WAIT 那兩種問(wèn)題。 我們仔細(xì)回顧用一下前面兩種問(wèn)題。
都是在新建連接中收到老連接的包導(dǎo)致的問(wèn)題
, 那么如果我能在新連接中識(shí)別出此包為非法包,是不是就可以丟掉這些無(wú)用包,解決問(wèn)題呢。
需要實(shí)現(xiàn)這些功能,需要擴(kuò)展一下tcp 包頭。 增加 時(shí)間戳字段。 發(fā)送者 在每次發(fā)送的時(shí)候。 在tcp包頭里面帶上發(fā)送時(shí)候的時(shí)間戳。 當(dāng)接收者接收的時(shí)候,在ACK應(yīng)答中除了TCP包頭中帶自己此時(shí)發(fā)送的時(shí)間戳,并且把收到的時(shí)間戳附加在后面。也就是說(shuō)ACK包中有兩個(gè)時(shí)間戳字段。結(jié)構(gòu)如下:
那我們接下來(lái)一個(gè)個(gè)分析tcp_tw_reuse是如何解決TIME_WAIT的兩個(gè)問(wèn)題的
4、tcp_tw_recycle
tcp_tw_recycle 也是借助 timestamp機(jī)制。顧名思義, tcp_tw_reuse 是復(fù)用 端口,并不會(huì)減少 TIME-WAIT 數(shù)量。你去查詢機(jī)器上TIME-WAIT 數(shù)量,還是 幾千幾萬(wàn)個(gè),這點(diǎn)對(duì)有強(qiáng)迫癥的同學(xué)感覺(jué)很不舒服。tcp_tw_recycle 是 提前 回收 TIME-WAIT資源。會(huì)減少 機(jī)器上 TIME-WAIT 數(shù)量。
linux 統(tǒng)計(jì)TCP連接時(shí)長(zhǎng)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 統(tǒng)計(jì)TCP連接時(shí)長(zhǎng),「教程」如何在Linux上統(tǒng)計(jì)TCP連接時(shí)長(zhǎng),Linux – CentOS 7 – 查看TCP/IP連接狀態(tài),暢談linux下TCP(上)的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站建設(shè)選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設(shè)計(jì),高端小程序APP定制開發(fā),成都網(wǎng)絡(luò)營(yíng)銷推廣等一站式服務(wù)。
網(wǎng)站欄目:「教程」如何在Linux上統(tǒng)計(jì)TCP連接時(shí)長(zhǎng)(linux統(tǒng)計(jì)TCP連接時(shí)長(zhǎng))
標(biāo)題鏈接:http://www.dlmjj.cn/article/ccecooo.html


咨詢
建站咨詢
