什么是半连接队列和全连接队列?SYN Flood 怎样防御?
先自己想一想,再看参考要点
参考要点
- 服务器收到 SYN 后,连接进入半连接队列(SYN_RCVD),握手完成后移入全连接队列,等应用调用 accept() 取走
- listen() 的 backlog 指的是全连接队列的长度,超过 net.core.somaxconn(Linux 5.4 起默认 4096)时按它截断
- 全连接队列满时 Linux 默认丢弃新到的 SYN,客户端超时后重传,ss -lnt 中 LISTEN 一行的 Recv-Q 是全连接队列中的连接数,Send-Q 是 backlog
- SYN Flood 只发 SYN、不完成握手,用来占满半连接队列,Linux 默认开启 SYN Cookie:队列溢出时不保存半连接,把连接信息编码进 SYN+ACK 的序号,收到第三次握手时再还原