解决TIME_WAIT过多造成的问题
生活随笔
收集整理的這篇文章主要介紹了
解决TIME_WAIT过多造成的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#netstat -n | awk '/^tcp/ {++S[$NF]} END { for(a in S) print(a,S[a])}'
LAST_ACK?14
SYN_RECV?348
ESTABLISHED?70
FIN_WAIT1?229
FIN_WAIT2?30
CLOSING?33
TIME_WAIT?18122?
狀態:描述
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
也就是說,這條命令可以把當前系統的網絡連接狀態分類匯總。
下面解釋一下為啥要這樣寫:
一個簡單的管道符連接了netstat和awk命令。
——————————————————————
先來看看netstat:
netstat?-n
Active?Internet?connections?(w/o?servers)
Proto?Recv-Q?Send-Q?Local?Address?Foreign?Address?State
tcp?0?0?123.123.123.123:80?234.234.234.234:12345?TIME_WAIT
你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。
——————————————————————
再來看看awk:
/^tcp/
濾出tcp開頭的記錄,屏蔽udp,?socket等無關記錄。
state[]相當于定義了一個名叫state的數組
NF
表示記錄的字段數,如上所示的記錄,NF等于6
$NF
表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT
state[$NF]表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數
++state[$NF]表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一
END
表示在最后階段要執行的命令
for(key?in?state)
遍歷數組
print?key,”\t”,state[key]打印數組的鍵和值,中間用\t制表符分割,美化一下。
如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,
vim?/etc/sysctl.conf
編輯文件,加入以下內容:
net.ipv4.tcp_syncookies?=?1
net.ipv4.tcp_tw_reuse?=?1
net.ipv4.tcp_tw_recycle?=?1
net.ipv4.tcp_fin_timeout?=?30
然后執行?/sbin/sysctl?-p?讓參數生效。
net.ipv4.tcp_syncookies?=?1?表示開啟SYN?cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse?=?1?表示開啟重用。允許將TIME-WAIT?sockets重新用于新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle?=?1?表示開啟TCP連接中TIME-WAIT?sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout?修改系統默認的?TIMEOUT?時間
下面附上TIME_WAIT狀態的意義:
客戶端與服務器端建立TCP/IP連接后關閉SOCKET后,服務器端連接的端口
狀態為TIME_WAIT
是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
有沒有什么情況使主動關閉的socket直接進入CLOSED狀態呢?
主動關閉的一方在發送最后一個?ack?后
就會進入?TIME_WAIT?狀態?停留2MSL(max?segment?lifetime)時間
這個是TCP/IP必不可少的,也就是“解決”不了的。
也就是TCP/IP設計者本來是這么設計的
主要有兩個原因
1。防止上一次連接中的包,迷路后重新出現,影響新連接
(經過2MSL,上一次連接中所有的重復包都會消失)
2。可靠的關閉TCP連接
在主動關閉方發送的最后一個?ack(fin)?,有可能丟失,這時被動方會重新發
fin,?如果這時主動方處于?CLOSED?狀態?,就會響應?rst?而不是?ack。所以
主動方要處于?TIME_WAIT?狀態,而不能是?CLOSED?。
TIME_WAIT?并不會占用很大資源的,除非受到攻擊。
還有,如果一方?send?或?recv?超時,就會直接進入?CLOSED?狀態
LAST_ACK?14
SYN_RECV?348
ESTABLISHED?70
FIN_WAIT1?229
FIN_WAIT2?30
CLOSING?33
TIME_WAIT?18122?
狀態:描述
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
也就是說,這條命令可以把當前系統的網絡連接狀態分類匯總。
下面解釋一下為啥要這樣寫:
一個簡單的管道符連接了netstat和awk命令。
——————————————————————
先來看看netstat:
netstat?-n
Active?Internet?connections?(w/o?servers)
Proto?Recv-Q?Send-Q?Local?Address?Foreign?Address?State
tcp?0?0?123.123.123.123:80?234.234.234.234:12345?TIME_WAIT
你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。
——————————————————————
再來看看awk:
/^tcp/
濾出tcp開頭的記錄,屏蔽udp,?socket等無關記錄。
state[]相當于定義了一個名叫state的數組
NF
表示記錄的字段數,如上所示的記錄,NF等于6
$NF
表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT
state[$NF]表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數
++state[$NF]表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一
END
表示在最后階段要執行的命令
for(key?in?state)
遍歷數組
print?key,”\t”,state[key]打印數組的鍵和值,中間用\t制表符分割,美化一下。
如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,
vim?/etc/sysctl.conf
編輯文件,加入以下內容:
net.ipv4.tcp_syncookies?=?1
net.ipv4.tcp_tw_reuse?=?1
net.ipv4.tcp_tw_recycle?=?1
net.ipv4.tcp_fin_timeout?=?30
然后執行?/sbin/sysctl?-p?讓參數生效。
net.ipv4.tcp_syncookies?=?1?表示開啟SYN?cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse?=?1?表示開啟重用。允許將TIME-WAIT?sockets重新用于新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle?=?1?表示開啟TCP連接中TIME-WAIT?sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout?修改系統默認的?TIMEOUT?時間
下面附上TIME_WAIT狀態的意義:
客戶端與服務器端建立TCP/IP連接后關閉SOCKET后,服務器端連接的端口
狀態為TIME_WAIT
是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
有沒有什么情況使主動關閉的socket直接進入CLOSED狀態呢?
主動關閉的一方在發送最后一個?ack?后
就會進入?TIME_WAIT?狀態?停留2MSL(max?segment?lifetime)時間
這個是TCP/IP必不可少的,也就是“解決”不了的。
也就是TCP/IP設計者本來是這么設計的
主要有兩個原因
1。防止上一次連接中的包,迷路后重新出現,影響新連接
(經過2MSL,上一次連接中所有的重復包都會消失)
2。可靠的關閉TCP連接
在主動關閉方發送的最后一個?ack(fin)?,有可能丟失,這時被動方會重新發
fin,?如果這時主動方處于?CLOSED?狀態?,就會響應?rst?而不是?ack。所以
主動方要處于?TIME_WAIT?狀態,而不能是?CLOSED?。
TIME_WAIT?并不會占用很大資源的,除非受到攻擊。
還有,如果一方?send?或?recv?超時,就會直接進入?CLOSED?狀態
總結
以上是生活随笔為你收集整理的解决TIME_WAIT过多造成的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Git】认识各种开源协议及其关系
- 下一篇: Anaconda建立新的环境,出现Con