tcp_max_syn_backlog、SOMAXCOON
socket维护了两个队列,一个是半连接队列一个是完成连接队列
队列长度由以下内核参数来确定:
半连接队列:tcp_max_syn_backlog 这个值设置过小在syn半连接攻击中导致正常用户的请求被拒绝,设置过大会导致比较消耗内存资源,若要设置很大建议和syncookies机制一起使用可以避免使用掉大量的内存。
完成连接队列:min(backlog, somaxconn) 由两个参数最小值决定,backlog是在套接字里指定参数属于userspace里的参数,过大时会被内核参数somaxconn覆盖
解决syn flood的方法有多种,例如,缩小listen()维护的两个队列的最大长度,减少重发syn+ack的次数,增大重发的时间间隔,减少收到ack的等待超时时间,使用syncookie等,但直接修改tcp选项的任何一种方法都不能很好兼顾性能和效率。所以在连接到达监听者线程之前对数据包进行过滤是极其重要的手段。
reference:socket与tcp连接过程