Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法
Posted cnsanshao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法相关的知识,希望对你有一定的参考价值。
近期遇到一个项目 需要在Linux上建立一个Socket 进行 HTTP_GET , 需要线程高并发的 使用TCP Socket 进行Send 发送HTTP_GET请求到 指定网站 . 而且不需要read数据返回 一旦Send完毕就直接close了, 但这样做却在本地产生了很多 TIME_WAIT 状态 导致端口堵塞无法高并发连接了 .
在网上找了很多资料, 都说到了这点 高并发短连接的close 需要双发达成 才能进入CLOSE状态, 如果只有一段 Close(sock) 只会带来另一端的 数据接收环节等待. 迟迟不会结束TIME_WAIT, 而他需要4分钟后 才会注销这个状态. 4分钟呐. 要人命啊
结果我找到的方法 却不是改写Socket程序 而是在系统设置上下载, 却解决了.
Console
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,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
完成后 使用netstat -an 神奇的发现... 这些链接都不见了
继续运行我的高并发Socket 持续查看netstat 效果明显呐~!~!~!
以上是关于Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法的主要内容,如果未能解决你的问题,请参考以下文章
Linux下解决高并发socket最大连接数限制,tcp默认1024个连接