tcp 随手记1

来源:互联网 发布:java在cmd中运行 编辑:程序博客网 时间:2024/06/05 09:46

sys flood 原理:

服务器 收到 客户端发送的 syn 请求,会分配 tcb (Transmission Control Block)块,通常至少280 字节,响应 syn+ ack ,如果客户端不响应 ack ,也就是tcp 半连接挂起状态,

最终导致 服务器资源耗尽,无法服务正常请求。




常用攻击手段 ,固定ip 形式,直接拉黑名单,变化ip 形式,可考虑 syn cache ,或者sys cookie 阻挡。


软件层面如何优化:

/proc/sys/net/ipv4/tcp_max_syn_backlog 修改最大syn 队列长度

/proc/sys/net/ipv4/tcp_synack_retries 修改未收到客户端ack 回应 重试次数



顺带讲一下 tcp 保活 keepalive, 也即是心跳,可以应用层去做,也可以使用tcp 自带心跳机制

 /proc/sys/net/ipv4/tcp_keepalive_time  默认7200 代表tcp 链路2小时 无数据,开启保活检测
 /proc/sys/net/ipv4/tcp_keepalive_intvl  重试间隔 ,默认75 s
 /proc/sys/net/ipv4/tcp_keepalive_probes 重试次数 , 默认 9


即默认情况下 7200 + 75 *9 之后 tcp 才会断掉

 

针对单个socket 如何设置保活参数:

int keepAlive = 1;   // 开启keepalive属性. 缺省值: 0(关闭)  
int keepIdle = 60;   // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)  
int keepInterval = 5;   // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)  
int keepCount = 2;   // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)  
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));  
setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));  
setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));  
setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount)); 






原创粉丝点击