
主動方的優化
主動發起 FIN 封包斷開連接配接的一方,如果遲遲沒收到對方的 ACK 回複,則會重傳 FIN 封包,重傳的次數由
tcp_orphan_retries
參數決定。
當主動方收到 ACK 封包後,連接配接就進入 FIN_WAIT2 狀态,根據關閉的方式不同,優化的方式也不同:
- 如果這是 close 函數關閉的連接配接,那麼它就是孤兒連接配接。如果
秒内沒有收到對方的 FIN 封包,連接配接就直接關閉。同時,為了應對孤兒連接配接占用太多的資源,tcp_fin_timeout
定義了最大孤兒連接配接的數量,超過時連接配接就會直接釋放。tcp_max_orphans
- 反之是 shutdown 函數關閉的連接配接,則不受此參數限制;
當主動方接收到 FIN 封包,并傳回 ACK 後,主動方的連接配接進入 TIME_WAIT 狀态。這一狀态會持續 1 分鐘,為了防止 TIME_WAIT 狀态占用太多的資源,
tcp_max_tw_buckets
定義了最大數量,超過時連接配接也會直接釋放。
當 TIME_WAIT 狀态過多時,還可以通過設定
tcp_tw_reuse
和
tcp_timestamps
為 1 ,将 TIME_WAIT 狀态的端口複用于作為用戶端的新連接配接,注意該參數隻适用于用戶端。
被動方的優化
被動關閉的連接配接方應對非常簡單,它在回複 ACK 後就進入了 CLOSE_WAIT 狀态,等待程序調用 close 函數關閉連接配接。是以,出現大量 CLOSE_WAIT 狀态的連接配接時,應當從應用程式中找問題。
當被動方發送 FIN 封包後,連接配接就進入 LAST_ACK 狀态,在未等到 ACK 時,會在
tcp_orphan_retries
參數的控制下重發 FIN 封包。