客戶端的優化
當客戶端發起 SYN 包時,可以通過 tcp_syn_retries
控制其重傳的次數。
服務端的優化
當服務端 SYN 半連接隊列溢出後,會導致後續連接被丟棄,可以通過 netstat -s
觀察半連接隊列溢出的情況,如果 SYN 半連接隊列溢出情況比較嚴重,可以通過tcp_max_syn_backlog、somaxconn、backlog
參數來調整 SYN 半連接隊列的大小。
服務端回覆 SYN+ACK 的重傳次數由 tcp_synack_retries
參數控制。如果遭受 SYN 攻擊,應把 tcp_syncookies
參數設置爲 1,表示僅在 SYN 隊列滿後開啓 syncookie 功能,可以保證正常的連接成功建立。
服務端收到客戶端返回的 ACK,會把連接移入 accpet 隊列,等待進行調用 accpet() 函數取出連接。
可以通過 ss -lnt
查看服務端進程的 accept 隊列長度,如果 accept 隊列溢出,系統默認丟棄 ACK,如果可以把 tcp_abort_on_overflow
設置爲 1 ,表示用 RST 通知客戶端連接建立失敗。
如果 accpet 隊列溢出嚴重,可以通過 listen 函數的 backlog
參數和 somaxconn
系統參數提高隊列大小,accept 隊列長度取決於 min(backlog, somaxconn)。
繞過三次握手
TCP Fast Open 功能可以繞過三次握手,使得 HTTP 請求減少了 1 個 RTT 的時間,Linux 下可以通過 tcp_fastopen
開啓該功能,同時必須保證服務端和客戶端同時支持。