1. 程式人生 > >CentOS下存在大量的TCP TIME_WAIT解決方法

CentOS下存在大量的TCP TIME_WAIT解決方法

檢視TIME_WAIT的數量:

netstat  -anp | grep TIME_WAIT |wc -l

檢視TCP狀態:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT狀態的socket一般需要等到2分鐘時間後,socket才會被回收。

修改/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 時間

引數生效以後,再用 netstat -n -p -t發現大量的TIME_WAIT 已不存在

-----------------------------------------------------------------------------------------------------------------------------------

關於TIME WAIT

--------------客戶端主動關閉連線-----------------------
注意一個問題,進入TIME_WAIT狀態的一般情況下是客戶端。
大多數伺服器端一般執行被動關閉,伺服器不會進入TIME_WAIT狀態。
當在伺服器端關閉某個服務再重新啟動時,伺服器是會進入TIME_WAIT狀態的。
舉例:
1.客戶端連線伺服器的80服務,這時客戶端會啟用一個本地的埠訪問伺服器的80,訪問完成後關閉此連線,立刻再次訪問伺服器的
80,這時客戶端會啟用另一個本地的埠,而不是剛才使用的那個本地埠。原因就是剛才的那個連線還處於TIME_WAIT狀態。
2.客戶端連線伺服器的80服務,這時伺服器關閉80埠,立即再次重啟80埠的服務,這時可能不會成功啟動,原因也是伺服器的連
接還處於TIME_WAIT狀態。

如果time wait過多,則會佔用機器的很多埠,如果超過系統的最大埠數,則系統將不會處理新的連線