計算機網絡 TCP time_wait 狀態 詳解

TCP 的 TIME_WAIT 狀態是 TCP 連接終止過程中 主動關閉連接的一方(通常是先調用 close() 或主動發送 FIN 的一端)進入的一個重要狀態。理解其原理、副作用和優化策略對高性能網絡編程和服務器調優至關重要。


🔍 一、TIME_WAIT 是什么?

  • 何時進入?
    當 TCP 連接經歷四次揮手正常關閉時:
    1. 主動關閉方發送 FIN → 進入 FIN_WAIT_1
    2. 收到對端 ACK → 進入 FIN_WAIT_2
    3. 收到對端 FIN → 發送 ACK → **進入 ****TIME_WAIT**
  • 停留時長:
    TIME_WAIT 狀態持續 2 * MSLMaximum Segment Lifetime,報文最大生存時間)。
    • Linux 默認 MSL = 60秒 ? TIME_WAIT 時長為 120秒(2分鐘)。
  • 本質作用:
    1. 可靠終止:
      確保主動關閉方最后發出的 ACK 能到達對端(重傳未收到的 ACK)。
      若對端沒收到 ACK,會重傳 FIN,此時處于 _TIME_WAIT_ 的主動方仍能響應。
    2. 清理舊數據:
      阻止網絡中 延遲到達的舊報文 被新連接接收(造成數據錯亂)。
      例如:相同五元組的新連接 vs 遲到的舊包(2MSL 時間足以讓網絡中滯留的包失效)。

? 簡單總結:TIME_WAIT 是 TCP 協議用于安全收尾的保障機制,防止網絡出現“幽靈包”破壞連接健壯性。


?? 二、副作用:為什么開發者/運維關注它?

高并發短連接服務(如 HTTP 服務器、API 網關)中,主動關閉方是服務器時會產生顯著影響:

問題成因后果
1??** 占用端口資源**每個 TIME_WAIT
連接占用一個本地 (源IP, 源端口, 目標IP, 目標端口)
四元組。
客戶端端口耗盡(尤其客戶端用短連接訪問同一服務端),無法發起新連接
2??** 內存占用**內核需維護 TCP 控制塊(struct tcp_sock
),每個連接占用約 2-4KB
內存。
海量 TIME_WAIT
(如 10萬+)消耗數百 MB 內存,可能導致 OOM
3??** 增加延遲**若服務端因端口被占滿而拒絕連接,客戶端需重試或等待。用戶體驗下降(連接超時)。
4??** SYN 建連失敗(間接)**net.ipv4.tcp_tw_reuse/recycle
等優化參數若配置不當,可能導致 NAT 環境 SYN 被丟棄。
新連接握手失敗(典型表現:cannot assign requested address

📌 關鍵認知:

  • 客戶端主動關閉 → TIME_WAIT 出現在客戶端(對服務端影響小);
  • 服務端主動關閉 → TIME_WAIT 集中在服務端(高并發時成為瓶頸)。

🛠? 三、可以關閉嗎?優化策略是什么?

? 絕不能徹底關閉 TIME_WAIT!
它的設計解決了 TCP 可靠性和健壯性的核心問題。但可通過以下合理優化緩解其副作用:

? 推薦優化方案:
策略原理配置方法(Linux)適用場景
1??** 調整短連接為長連接**減少連接創建/銷毀次數,從源頭降低 TIME_WAIT
數量。
- HTTP 層:客戶端/服務端開啟 Keep-Alive

- RPC 層:配置連接池復用連接。
所有高并發短連接服務首選方案!
2??** 讓客戶端主動關閉連接**TIME_WAIT
分散到海量客戶端,避免服務端端口耗盡。
服務端設置 HTTP Header:Connection: close
(強制客戶端主動關閉)。
服務端壓力過大時的應急方案(但犧牲連接復用能力)。
3??** 開啟 ****tcp_tw_reuse**允許內核復用處于 TIME_WAIT
的端口,前提是新連接的序列號 > 舊連接最后序列號(防舊包)。
sysctl -w net.ipv4.tcp_tw_reuse=1

(僅對 出向連接 生效,客戶端角色最有用)
適合作為客戶端的程序(如 Nginx 反向代理的后端連接)
4??** 增加端口范圍 + 縮短 MSL**提升可用端口數上限;加快 TIME_WAIT
回收速度。
bash<br>sysctl -w net.ipv4.ip_local_port_range="1024 65000"<br>sysctl -w net.ipv4.tcp_fin_timeout=30 # ?? 風險選項<br>配合 tcp_tw_reuse
使用(修改 MSL 需編譯內核,一般不建議)
5??** 使用 **SO_LINGER**
選項**
強制用 RST
代替 FIN
關閉連接(跳過 TIME_WAIT
),極其危險!
代碼中設置 Socket 選項:
l_onoff = 1; l_linger = 0;
→ 發送 RST
暴力斷連
除非絕對可控(如內網中間件),生產環境禁用!破壞 TCP 可靠性。
? 被廢棄/高危參數:
  • net.ipv4.tcp_tw_recycle (Linux 4.1+ 已移除):
    • 曾經用于快速回收 TIME_WAIT 端口,但基于 per-host 的 PAWS 機制破壞了 NAT 網絡(多個客戶端共享公網IP)下的連接。
    • 結果: 造成 SYN 被丟棄(表現為隨機連接失敗)。
    • 結論:永遠不要再使用!

🔐 四、最佳實踐總結

場景優化建議
HTTP 服務端1. 開啟 Keep-Alive 長連接
2. 調整 tcp_tw_reuse=1
(若需作為客戶端代理)
3. 擴大端口范圍
數據庫/緩存客戶端1. 開啟連接池復用
2. 設置 tcp_tw_reuse=1
(客戶端角色)
高性能網關/代理服務器1. 增端口數
2. 長連接復用
3. 用 tcp_tw_reuse=1
(代理主動連接后端)
應急情況設置服務端 Connection: close
(客戶端主動關 → 分散 TIME_WAIT
到客戶端)

📜 終極原則:
優先長連接 → 其次端口復用(tcp_tw_reuse)→ 拒絕 tcp_tw_recycle 和暴力 SO_LINGER
理解協議設計,避免為性能犧牲穩定性!


💎 理解本質

TIME_WAIT 是 TCP 魯棒性設計的典范,看似消耗資源,實則是網絡可靠通信的基石。優化時需權衡:保持協議安全邊界的前提下,合理利用內核提供的能力,而非暴力破壞協議邏輯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93621.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《GuardHFL: Privacy Guardian for Heterogeneous Federated Learning》——論文閱讀

研究背景&#xff1a;異構聯邦中各客戶端模型結構&#xff0c;精度&#xff0c;算力都不同&#xff0c;無法像傳統聯邦那樣共享梯度&#xff0c;只能通過“查詢-響應”使用輔助數據來訓練模型。這種方法存在嚴重隱私問題&#xff1a;直接共享查詢樣本會泄露敏感信息&#xff0c…

Spring AI 進階之路01:三步將 AI 整合進 Spring Boot

引子 當 LLM 的浪潮以不可阻擋之勢席卷全球&#xff0c;從改變用戶交互到重塑商業模式&#xff0c;我們每一位開發者都身處這場技術變革的中心。作為龐大的 Java 生態中的一員&#xff0c;你是否也曾思考&#xff1a;當 Python 似乎成為 AI 的“官方語言”時&#xff0c;我們這…

pycharm2025導入anaconda創建的各個AI環境

目錄1.pycharm下載及安裝2.導入anaconda的環境到pycharm項目中1.pycharm下載及安裝 建議從官網下載&#xff0c;不要亂下載。 https://www.jetbrains.com.cn/en-us/pycharm/ 右上角可以切換中英文&#xff0c;在此切換為中文。 點擊下載&#xff0c;如下頁面: 點擊中間下載w…

獲取IPv6地址的三種方式

DHCPv6無狀態自動分配IP地址Server 配置&#xff1a;<Huawei>system-view[Huawei]ipv6[Huawei]dhcp enable[Huawei]dhcpv6 pool pool1[Huawei-dhcpv6-pool-pool1]dns-server 2002::2[Huawei-dhcpv6-pool-pool1]dns-domain-name example.com[Huawei-dhcpv6-pool-pool1]qui…

[Oracle數據庫] Oracle 復雜查詢

對于剛接觸 Oracle 數據庫的初學者來說&#xff0c;簡單查詢&#xff08;如SELECT * FROM 表名&#xff09;可能不難掌握&#xff0c;但面對復雜業務場景時&#xff0c;就需要更強大的查詢能力。本文將圍繞 Oracle 復雜查詢的核心知識點展開&#xff0c;包括條件邏輯、分組函數…

Redis-plus-plus API使用指南:通用操作與數據類型接口介紹

&#x1f351;個人主頁&#xff1a;Jupiter.&#x1f680; 所屬專欄&#xff1a;Redis 歡迎大家點贊收藏評論&#x1f60a;目錄通用 API連接 Redis1. get/set2. exists 方法3. del 方法4. keys 方法5. expire 方法6. ttl 方法7. type 方法8. flushall 方法String 類型 API1. ge…

基于遺傳編程的自動程序生成

這里寫目錄標題核心概念與工作原理1. 個體表示&#xff1a;樹結構2. 初始化種群3. 適應度評估4. 選擇5. 遺傳操作&#xff08;繁殖&#xff09;6. 新一代種群形成7. 終止條件基于遺傳編程的符號回歸示例問題示例GP實現符號回歸&#xff08;Deap&#xff09;GP實現符號回歸&…

flowable匯總查詢方式

背景&#xff1a;小程序開發申請流程。使用flowable流程框架。用戶需要在后臺統攬用戶申請的匯總表。 設計思路&#xff1a;通過查詢流程實例分頁查詢獲取數據&#xff0c; 其中可以通過查詢條件進行查詢&#xff0c;查詢條件是流程申請時添加到流程變量當中的&#xff0c;方便…

力扣438:找到字符串中所有的字母異位詞

力扣438:找到字符串中所有的字母異位詞題目思路代碼題目 給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 思路 我們先不看異位詞這個條件&#xff0c;如何在字符串s中找到字符串p。我們可以…

ruoyi-vue(十一)——代碼生成

大部分項目里其實有很多代碼都是重復的&#xff0c;幾乎每個基礎模塊的代碼都有增刪改查的功能&#xff0c;而這些功能都是大同小異&#xff0c; 如果這些功能都要自己去寫&#xff0c;將會大大浪費我們的精力降低效率。所以這種重復性的代碼可以使用代碼生成。一 代碼生成使用…

neo4j導入導出方法

在 Neo4j 中&#xff0c;如果需要將數據從 一個環境導出&#xff0c;再 導入到另一個環境&#xff08;如從開發環境遷移到生產環境&#xff09;&#xff0c;可以通過以下方法實現&#xff1a;方法 1&#xff1a;使用 neo4j-admin 導出和導入&#xff08;完整數據庫遷移&#xf…

Diamond基礎2:開發流程之LedDemo

文章目錄1.關聯VS Code2.Diamond工程目錄3.Led Demo開發流程4.燒寫bit文件5.傳送門1.關聯VS Code 和Vivado一樣&#xff0c;Diamond也可以使用第三方的編輯器&#xff0c;VS Code編輯器因為可以安裝各種插件&#xff0c;并且對verilog開發的支持也算完善&#xff0c;所以很受歡…

Golang 后臺技術面試套題 1

文章目錄1.網絡1.1 瀏覽器從輸入網址到展示頁面&#xff0c;描述下整個過程&#xff1f;1.2 HTTP 502&#xff0c;503 和 504 是什么含義&#xff1f;區別以及如何排查&#xff1f;1.3 HTTPS 通信過程為什么要約定加密密鑰 code&#xff0c;用非對稱加密不行嗎&#xff1f;1.4 …

【科研繪圖系列】R語言繪制蝶形條形圖蝶形柱狀堆積圖

文章目錄 介紹 加載R包 數據下載 導入數據 數據預處理 畫圖 系統信息 參考 介紹 【科研繪圖系列】R語言繪制蝶形條形圖&蝶形柱狀堆積圖 加載R包 library(tidyverse) library(ggsignif) library(RColorBrewer) library(dplyr) library(reshape2) library(grid

Jeecg后端經驗匯總

Jeecg是一個不錯的低代碼平臺&#xff0c;極大的降低了很多開發人員接私活的難度&#xff0c;也極大的降低了開發全套功能的難度。但是一碼歸一碼&#xff0c;開發人員的水平很一般&#xff0c;如下&#xff1a;&#xff08;1&#xff09;普通用戶可以修改管理員密碼&#xff0…

ethernet_input到應用層處理簡單分析

1、驅動層&#xff1a;從硬件讀取數據并構造pbuf中斷觸發后&#xff0c;驅動層的接收任務&#xff08;或輪詢函數&#xff09;會從網卡硬件讀取數據&#xff0c;并將其封裝為 LWIP 可識別的pbuf結構體&#xff08;LWIP 的數據緩沖區&#xff09;。關鍵函數&#xff1a;驅動自定…

C#WPF實戰出真汁05--左側導航

1、左側導航設計要點清晰的信息架構 確保導航結構層次分明&#xff0c;主分類與子分類邏輯清晰&#xff0c;避免過度嵌套。使用分組、縮進或分隔線區分不同層級&#xff0c;保持視覺可讀性。直觀的圖標與標簽 為每個導航項搭配簡潔的圖標&#xff0c;強化視覺識別。標簽文字需簡…

大模擬 Major

題目來源&#xff1a;2025 Wuhan University of Technology Programming Contest 比賽鏈接&#xff1a;Dashboard - 2025 Wuhan University of Technology Programming Contest - Codeforces 題目大意&#xff1a; 模擬 16 支隊伍的瑞士輪比賽結果&#xff0c;規則太多&…

【手撕JAVA多線程】1.從設計初衷去看JAVA的線程操作

目錄 前言 概述 主動阻塞/喚醒 代碼示例 實現 為什么必須在同步塊中使用 計時等待是如何實現的 被動阻塞/喚醒 為什么要有被動阻塞/喚醒 實現&#xff08;鎖升級&#xff09; 前言 JAVA多線程相關的內容很多很雜&#xff0c;但工作中用到的頻率不高&#xff0c;用到…

UE5多人MOBA+GAS 46、制作龍卷風技能

文章目錄創建龍卷風GA創建蒙太奇創捷一系列GE添加數據表添加到角色中創建龍卷風GA GA_Tornado 添加標簽 // 龍卷風冷卻CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Tornado_Cooldown)// 通用技能傷害CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Generic_Dama…