netstat -na 查看有大量TIME_WAIT解決辦法(修改內核參數)

# netstat -an|awk '/tcp/ {print $6}'|sort|uniq -chtml

     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:等待全部分組死掉
 
 
如發現系統存在大量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 讓參數生效。
 
查看更多內核參數/proc/sys/..
 
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 狀態
 
 
轉載自:https://www.cnblogs.com/sidesky/p/6844565.html
相關文章
相關標籤/搜索