Linux C++ Socket 高併發短鏈接 TIME_WAIT 揮之不去解決方法

近期遇到一個項目 須要在Linux上創建一個Socket 進行 HTTP_GET , 須要線程高併發的 使用TCP Socket 進行Send 發送HTTP_GET請求到 指定網站 . 並且不須要read數據返回 一旦Send完畢就直接close了,  但這樣作卻在本地產生了不少 TIME_WAIT 狀態 致使端口堵塞沒法高併發鏈接了 . cookie

在網上找了不少資料, 都說到了這點  高併發短鏈接的close 須要雙發達成 才能進入CLOSE狀態, 若是隻有一段 Close(sock) 只會帶來另外一端的 數據接收環節等待. 遲遲不會結束TIME_WAIT, 而他須要4分鐘後 纔會註銷這個狀態.  4分鐘吶. 要人命啊 併發

結果我找到的方法 卻不是改寫Socket程序 而是在系統設置上下載, 卻解決了.socket

Consoletcp

sysctl -w net.ipv4.tcp_syncookie=1
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_fin_timeout=30

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,表示關閉。code

net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間隊列

 

完成後 使用netstat -an 神奇的發現... 這些連接都不見了  ip

繼續運行個人高併發Socket  持續查看netstat 效果明顯吶~!~!~!

相關文章
相關標籤/搜索