参考链接
半连接队列
服务器接收到第一个SYN之后,处于SYN_RCVD状态,此时双方还没有建立连接,
这种状态下的请求连接会被放到一个队列里,也叫半连接队列
长度为 max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog) ,在机器的tcp_max_syn_backlog值在/proc/sys/net/ipv4/tcp_max_syn_backlog下配置。
Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s,TCP才会把断开这个连接。
全连接队列
当server接收到ACK 之后, 会进入一个新的叫 accept 的队列
min(backlog(处于完全连接的socket的数量上限), somaxconn) (somaxconn默认是128吧)
SYN攻击的防范
linux提供了几个TCP参数来避免syn攻击
tcp_syncookies
tcp_synack_retries 内核放弃连接之前syn + ack包的数量
tcp_max_syn_backlog 内核放弃连接前接受的syn包的数量
tcp syn_cookie的计算方法
-
令m为服务器会在 SYN 队列条目中存储的最大分段大小(Maximum segment size);
-
令s为一个加密散列函数对服务器和客户端各自的 IP 地址和端口号以及t进行运算的结果。返回得到的数值s必须是一个24位值。
初始 TCP 序号,也就是所谓的SYN cookie,按照如下算法得到:
-
头五位:tmod32;
-
中三位:m编码后的数值;
-
末24位:s本身;