LINUX下解決TIME_WAIT過多問題
# netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
16 CLOSING
130 ESTABLISHED
298 FIN_WAIT1
13 FIN_WAIT2
9 LAST_ACK
7 LISTEN
103 SYN_RECV
5204 TIME_WAIT
狀態:描述
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 狀態
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16978544/viewspace-697543/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux下php-fpm程式過多導致記憶體耗盡問題解決LinuxPHP記憶體
- 【Linux】解決tomcat出現Toomanyopenfiles(開啟的檔案過多)問題LinuxTomcatOOM
- 解決Tengine健康檢查引起的TIME_WAIT堆積問題AI
- sql多參問題解決SQL
- 過多if - else 的問題, 以及策略模式 + 反射解決方法模式反射
- 解決linux下redis資料庫overcommit_memory問題LinuxRedis資料庫MIT
- TCP之再談解決伺服器TIMEWAIT過多的問題TCP伺服器AI
- Linux 和 Windows 下編碼問題處理 codestyle 解決方法LinuxWindows
- [20230317]關於TIME_WAIT問題.txtAI
- 解決Kali Linux 2020.1亂碼問題Linux
- LINUX 解決時間同步問題(NTP)Linux
- 用linux man命令,自己解決問題Linux
- 雲伺服器:解決linux下zip檔案解壓亂碼問題伺服器Linux
- 解決Linux系統下MYSQL資料表大小寫敏感問題LinuxMySql
- OH解決linux下redis資料庫overcommit_memory問題vlrLinuxRedis資料庫MIT
- 過濾器解決檔案上傳下載跨域問題過濾器跨域
- TongWeb下亂碼問題解決思路Web
- linux mint 19解決 輸入法問題Linux
- 在Linux中,ansible可以解決哪些問題?Linux
- linux sed 命令引起的^M問題解決Linux
- 通過Observable解決搜尋框問題
- Cocoapods pod search 版本過低問題解決
- munium學習過程中問題解決
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 解決ajax跨域問題的多種方法跨域
- [linux]解決wayland協議下 google-chrome 無法輸入中文問題Linux協議GoChrome
- 解決C3P0在Linux下Failed to get local InetAddress for VMID問題LinuxAI
- archlinux下wps顯示問題解決方法Linux
- Laradock 網路問題不能下載解決
- Composer 下載較慢的問題解決
- ubuntu下解決埠被佔用問題Ubuntu
- 解決steam下載走代理的問題
- Hadoop org.apache.hadoop.util.DiskChecker$DiskErrorException問題等價解決linux磁碟不足解決問題排查HadoopApacheErrorExceptionLinux
- Xshell連線Linux慢問題解決辦法Linux
- 新手linux系統常見問題解決方案Linux
- linux配置靜態路由解決網路問題Linux路由
- 透過Treeset解決隨機數排序問題隨機排序
- SpringBoot中通過CORS解決跨域問題Spring BootCORS跨域
- 解決ajax請求引數過多導致引數被截斷的問題