在 Windows 上遇到非常多 TIME_WAIT 連線時應如何處理
以下是用 TCPView 查看連線狀況時的畫面,其中的 TIME_WAIT 狀態下的連線可能會很多:

熟悉 TCP/IP 的開發人員應該知道一台電腦可使用的 連接埠 (Ports) 是有限的,最多也只有 個連接埠可以使用,且不管 接收連線 (Inbound Connection) 或 發出連線 (Outbound Connections) 都需要用到連接埠,這些處於 TIME_WAIT 狀態下的連線都會各自佔用一個可分配給應用程式使用的連接埠。
注意:雖然系統總共可使用的 Ports 有 65536 個,但從本機連到外部網路(Outbound Connections)的連線埠最多只會使用到 5,000 個而已,如需增加數量可修改 MaxUserPorts 機碼值的數值。
由於 TCP 不是個三言兩語就能講清楚的傳輸協定,在這篇文章裡我只會專注在講解與 TIME_WAIT 狀態有關的狀態而已,如需深入瞭解請參考本文最後的相關連結自行研究,我們先來看以下這張經典的 TCP 連線狀態圖:
![]()
從這張圖可以看出 TCP 連線在各種狀態之間變動的狀況與順序,其中 TIME_WAIT 連線已經是 TCP 連線在 完全關閉連線狀態 (CLOSED) 之前的一個狀態 (註:完全關閉連線是指網路完整斷線的意思),而預設TIME_WAIT 的逾時時間為 MSL (Maximum Segment Lifetime) 時間的兩倍,在 RFC 793規格定義的MSL 為兩分鐘,也就是在預設的情況下,每一條連線從 打算關閉連線狀態 (Closing) 換到 完整關閉連線狀態 (Closed) 之間還會停留在 TIME_WAIT 狀態約 4 分鐘的時間,如果你 4 分鐘以內使用者建立的連線數超過 65536 條連線的話,那麼很這台伺服器就再也無法連接了。 ( 註:Windows 預設的 TIME_WAIT 時間為 4 分鐘,Linux 下則會依據不同 Distribution 版本而有不同的預設值,但都可以調整其時間長短 )
MSL 為一個 TCP Segment (某一塊 TCP 網路封包) 從來源送到目的之間可續存的時間 (也就是一個網路封包在網路上傳輸時能存活的時間),由於 RFC 793 TCP 傳輸協定是在 1981 年定義的,當時的網路速度不像現在的網際網路那樣發達,你可以想像你從瀏覽器輸入網址等到第一個 byte 出現要等 4 分鐘嗎?在現在的網路環境下幾乎不可能有這種事情發生,因此我們大可將 TIME_WAIT 狀態的續存時間大幅調低,好讓 連線埠 (Ports) 能更快空出來給其他連線使用。
注意:如果當系統所有可用的 連線埠 (Ports) 都用光的話,就會接收到以下錯誤訊息:WSAENOBUFS (10055) error: "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full."
因此在流量較大的網站或伺服器,應該是要調整 Windows 預設的 TIME_WAIT 存留時間才對,如果要縮短 Windows 預設的 TIME_WAIT 狀態的續存時間可以調整以下機碼值,微軟建議最低可設定續存時間為 30 秒,而且也提到設定 30 秒應該不會出問題,因此我幾乎都只設定 30 秒而已:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
或可透過 reg.exe 工具直接進行機碼值設定:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters" /v "TcpTimedWaitDelay" /t REG_DWORD /d 30 /f
調整完成後可能需要重新啟動伺服器才能讓設定生效 (註:我不知道有沒有不重開機的方法,如果有人知道麻煩留言告訴我,謝謝!),自從我設定完這個機碼後,伺服器的連線數就明顯少了許多,因此也不用怕連接埠在短期內被用光的情況了。
心得分享
之前曾聽某些 IT 界的朋友跟我說,在 IT 這個領域裡不就是有問題就解問題嗎,至於怎麼解決問題的方法真的有這麼重要麼?有些問題 Google 一下就能找到解決方案,而且也真的有效,為什麼你還要花三倍的時間釐清所有細節呢?
書到用時方恨少,平時多研究一些與工作相關的知識細節很難說在日後會不會用到,現在學起來以後若遇到就能更快速的找到問題的癥結點,並以最快的速度解決問題,這樣才能替客戶帶來最大的價值,而且專業的價值正是出現在問題出現的時候,分析問題與解決問題是 IT 人的基本條件而已,未知的問題遲早有解決問題的一天,但你用多少時間解決問題才是 IT 人之間最主要的競爭差異。
當你手邊維護一個重要的系統時,就有可能需要花費 80% 的時間去研究 20% 罕見但可能發生的狀況,研究的方向可能會跟你過往的經驗與手邊的工作有關,我知道我們不可能學的完所有 IT 知識且在 IT 的領域裡一樣學海無崖,不過若養成研究習慣後你會發現在研究技術細節的過程中經常會獲得有許多意料之外的知識,而且這些知識有時候還真的派的上用場,我已經遇過好幾次這樣的經驗了!套一句阿甘正傳的名句:“IT is like a box of chocolates, You never know what you're gonna get.” ^__^
在 Windows 上遇到非常多 TIME_WAIT 連線時應如何處理的更多相关文章
- 如何讓 iOS UIWebView 連線時傳送自訂 Cookie 的方法[转]
利用 NSHTTPCookieStorage 管理 Cookie 傳送 在 iOS 中如果自行建立 UIWebView 來開啟遠端站台資料,這時可以透過以下方法加入 Cookie.原理是透過 iOS ...
- [ Windows] [ OS ] [ Remote Desktop ] 開啟同一個帳號同時2的連線RDP的方式
感謝同事 Allen 的Support :) 執行>gpedit.msc 電腦設定>Windows元件>遠端桌面服務>遠端桌面工作階段主機>連線>限制遠端桌面服務的 ...
- [Xarmrin.IOS]使用Build Host 在Windows上建置IOS程式及DeBug (转帖)
使用Xamarin開發IOS程式時, 必須要在Mac上才可以編譯程式,若想在windows系統上編譯,則可透過Build host的方式, 但還是要有一台Mac的電腦就是了XD 首先你的Mac必須要已 ...
- [Xarmrin.IOS]使用Build Host 在Windows上建置IOS程式及DeBug
使用Xamarin開發IOS程式時, 必須要在Mac上才可以編譯程式,若想在windows系統上編譯,則可透過Build host的方式, 但還是要有一台Mac的電腦就是了XD 首先你的Mac必須要已 ...
- 如何解决Python脚本在Linux和Windows上的格式问题
python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...
- Iptables網路連線限制及攻擊防護和相關設定
[筆記整理]Iptables網路連線限制及攻擊防護和相關設定 1. 限制每個IP連接HTTP最大併發50個連接數 iptables -A INPUT -p tcp --dport 80 -m conn ...
- EJBCA 在windows上的安装
为了做EJBCA的封装測试,在我自己电脑上装了个,可是在国内的开发上面的介绍实在是太少.有的也仅仅是些傻瓜式的安装介绍,这是介绍在Windows上安装的过程,(后面介绍下 linux 红帽上的),有些 ...
- android windows 上JNI编程
昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁.java能够调用JNI来完毕调用C语言实现的方法. JNI的全称是(Java native interfac ...
- windows上通过secureCRT和putty创建密钥登录
前面介绍了linux的ssh远程登录协议和ssh无password登录方式.这里在windows下通过secureCRT和putty登录linux来看一下详细的密钥创建,配置和登录.也算做个备忘录吧. ...
随机推荐
- Java基本特征 - 多态
多态的实现方式: 1. 重载(overload):实现编译时的多态性,前绑定 同一个类中.方法名相同.参数类型或者参数数量不相同 重写(override):运行时的多态性,后绑定.运行时的多态,是面向 ...
- Liferay7 BPM门户开发之44: 集成Activiti展示流程列表
处理依赖关系 集成Activiti之前,必须搞清楚其中的依赖关系,才能在Gradle里进行配置. 依赖关系: 例如,其中activiti-engine依赖于activiti-bpmn-converte ...
- Microsoft Visual Studio正忙解决办法
问题描述 前段时间用vs2015进行开发.出现如下问题,关闭vs进程重启vs还是无法解决. 如何解决 进入本地项目.vs文件夹 这个文件夹下有个.suo文件,删除该文件,用任务管理器杀掉vs的进程,重 ...
- Design5:Sql server 文件组和文件
1,文件组和文件的作用 Sql Server的数据存储在文件中,文件是实际存储数据的物理实体,文件组是逻辑对象,Sql server通过文件组来管理文件. 一个DataBase有一个或多个FileGr ...
- SQLSERVER中的ALLOCATION SCAN和RANGE SCAN
SQLSERVER中的ALLOCATION SCAN和RANGE SCAN 写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜 求助了园子里的某位大侠,他看 ...
- 【WP 8.1开发】一键锁屏
在WP8的时候,关于如何关闭屏幕,国内外都有不少文章了,大家有兴趣地可以搜搜,很多,我就不给链接了,因为稍后我的例子中会有. 其实,关闭屏幕是调用了未开放的API,正因为这个API未开放的,不敢保证所 ...
- 【WPF】制作自定义的列表项面板
我们在使用像ListBox的列表控件时,我们都知道可以通过其ItemsPanel的依赖项属性来自定义一个面板来放置列表控件中的列表项.除了CLR库提供的几个面板外,我们完全可以把自己写的面板作为项列表 ...
- px 与 dp, sp换算公式?
PPI = Pixels per inch,每英寸上的像素数,即 "像素密度" xhdpi: 2.0 hdpi: 1.5 mdpi: 1.0 (baseline) ldpi: 0. ...
- JSP网站开发基础总结《十二》
前两篇已经简单为大家介绍了一下,有关Filter接口的知识,本篇就让我们以一个登录小功能,来具体实现一下过滤器的作用,便于大家掌握.具体为大家介绍一下如何使用Filter对访问进行过滤,及如何防止中文 ...
- Sort the Array
/* 思路: 找到单调下降串的起始位置[l, r] 如果左边 0...l-1中的最大值 > l...r中的最小值 或者 r+1...n中的最小值 < l...r中的最大值 都是不能实现排序 ...