TCPヘッダーを検証する
接続要求を管理する
SYN-ACKを生成して返す
ACKを待つ
必要に応じてSYN-ACKを再送する
タイムアウトまで状態を管理する
つまり、攻撃者が小さな負担で、防御側へより大きな処理を発生させます。
この構造を、状態保持の非対称性と表現できます。
TCPの待ち行列は、初心者向けには次の2段階で考えると理解しやすくなります。
SYN受信
│
▼
SYN backlog
未完了の接続要求
│ ACK受信
▼
accept queue
接続完了済みだがアプリが未受領
│ accept()
▼
アプリケーション
Linuxでは、ACKをまだ受け取っていない接続要求がSYN_RECV状態として管理されます。
net.ipv4.tcp_max_syn_backlogは、ACKを受け取っていない接続要求を、リスニングソケットごとにどれだけ記憶するかに関係する設定です。
Linuxカーネル資料では、SYN_RECVのrequest socketは約304バイトを消費すると説明されています。したがって、「SYNを1件受けるたびに完全なTCPソケットと同じ大きさのTCBを割り当てる」と説明するのは、現在のLinux実装としては単純化しすぎです。