近期遇到一个项目 须要在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 效果明显呐~!~!~!