您現在的位置: 365建站網 > 365學習 > windows/linux下TIME_WAIT狀態的TCP連接的回收時間

windows/linux下TIME_WAIT狀態的TCP連接的回收時間

文章來源:365jz.com     點擊數:884    更新時間:2020-04-30 09:23   參與評論

TIME_WAIT是什么?


TIME_WAIT是表示系統在等待客戶端響應,以便再次連接時候能快速響應。TCP協議的三次握手中規定發起socket主動關閉的一方 socket將進入TIME_WAIT狀態,TIME_WAIT狀態將持續2個MSL(Max Segment Lifetime)。我們看下tcp的三次握手機制:


image.png


從 上面的示意圖可以看得出來,TIME_WAIT是主動關閉連接的一方保持的狀態,從而進入TIME_WAIT的狀態,然后在保持這個狀態2MSL(max segment lifetime)時間之后,徹底關閉回收資源。為什么要這么做?明明就已經主動關閉連接了為啥還要保持資源一段時間呢?這個是TCP/IP的設計者規定 的,主要出于以下兩個方面的考慮:


1.防止上一次連接中的包,迷路后重新出現,影響新連接(經過2MSL,上一次連接中所有的重復包都會消失)

2. 可靠的關閉TCP連接。在主動關閉方發送的最后一個 ack(fin) ,有可能丟失,這時被動方會重新發fin, 如果這時主動方處于 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以主動方要處于 TIME_WAIT 狀態,而不能是 CLOSED 。另外這么設計TIME_WAIT 會定時的回收資源,并不會占用很大資源的,除非短時間內接受大量請求或者受到攻擊。

==============Windows操作系統==========

 

查看使用端口數量:cmd-- netsh interface ipv4 show dynamicportrange protocol=tcp

查看建立連接的數量:netsh interface ipv4 show tcpstats


大規模Windows環境下,采用Nginx反向代理服務后,操作系統會產生較多TIME_WAIT的TCP(Transmission Control Protocol)連接,操作系統默認TIME_WAIT的TCP連接回收時間是4分鐘,TCP默認動態端口范圍為開始端口49152,結束端口65535。這樣會使回收TCP過慢導致系統吞吐量下降,甚至出現502訪問失敗問題。如何修改操作系統內核參數來縮短TIME_WAIT狀態TCP連接回收時間和添加TCP動態端口范圍,保證在大并發場景下操作系統的端口資源可用?

以Administrator用戶登錄Windows操作系統。修改TCP回收時間。
在Windows開始菜單中,單擊“運行”輸入“regedit”后按“Enter”打開注冊表編輯器。
“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”路徑。
在“編輯”菜單中,選擇“新建 > DWORD (32-位)值”,輸入名稱“TcpTimedWaitDelay”。
右鍵單擊TcpTimedWaitDelay,選擇“修改”。在“編輯 DWORD(32位)值”對話框的“基數”區域中,選擇十進制值為“30”,并“確定”。關閉注冊表編輯器。

 

修改端口范圍
在Windows開始菜單中,單擊“運行”輸入“cmd”
執行命令:netsh int ipv4 set dynamicportrange tcp startport=5000 numberofports=60000
重啟操作系統。

 

實例:

最近線上遇到windows機器訪問其他機器的時候失敗的情況。實際就是本地的端口不夠用造成的。


D:\>netsh interface ipv4 show dynamicportrange protocol=tcp


Protocol tcp Dynamic Port Range

---------------------------------

Start Port : 49152

Number of Ports : 16384


D:\>netsh interface ipv4 show tcpstats


MIB-II TCP Statistics

------------------------------------------------------

Timeout Algorithm: Van Jacobson's Algorithm

Minimum Timeout: 10

Maximum Timeout: 4294967295

Maximum Connections: Dynamic

Active Opens: 402947

Passive Opens: 989620

Attempts Failed: 122047

Established Resets: 49384

Currently Established: 135

In Segments: 47651175

Out Segments: 45510477

Retransmitted Segments: 465369

In Errors: 0

Out Resets: 65865

這個能用的端口實際就16384個,可以直接 netstat -atn查看一下每個狀態的數量。如果對外做大量的請求會造成本地端口不夠用。


可以修改一下起始端口:

netsh int ipv4 set dynamicport tcp start=2000 num=63000

netsh int ipv4 set dynamicport udp start=2000 num=63000

netsh int ipv6 set dynamicport tcp start=2000 num=63000

netsh int ipv6 set dynamicport udp start=2000 num=63000


然后修改一下注冊表縮短time-wait的時間。

regedit打開注冊表,添加

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

“MaxUserPort”=dword:0000fffe

“TcpTimeWaitDelay”=dword:0000005 (縮短為5秒)

 

=============linux系統====================

查看使用數量:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  

 

/etc/sysctl.conf文件的修改:

#對于一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄,不應該大于255,默認值是5,對應于180秒左右時間  
net.ipv4.tcp_syn_retries=2 
#net.ipv4.tcp_synack_retries=2 
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為300秒 
net.ipv4.tcp_keepalive_time=1200 
net.ipv4.tcp_orphan_retries=3 
#表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間 
net.ipv4.tcp_fin_timeout=30   
#表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。 
net.ipv4.tcp_max_syn_backlog = 4096 
#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉 
net.ipv4.tcp_syncookies = 1 
 
#表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉 
net.ipv4.tcp_tw_reuse = 1 
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉 
net.ipv4.tcp_tw_recycle = 1 
 
##減少超時前的探測次數  
net.ipv4.tcp_keepalive_probes=5  
##優化網絡設備接收隊列  
net.core.netdev_max_backlog=3000  

 

修改完之后執行/sbin/sysctl -p讓參數生效。


這里頭主要注意到的是

net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_keepalive_*

這幾個參數。


net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle的開啟都是為了回收處于TIME_WAIT狀態的資源。

net.ipv4.tcp_fin_timeout這個時間可以減少在異常情況下服務器從FIN-WAIT-2轉到TIME_WAIT的時間。

net.ipv4.tcp_keepalive_*一系列參數,是用來設置服務器檢測連接存活的相關配置。


實例:

一天業務開發反饋說最近總是出現時不時連接數據庫失敗,PHP現在有時會報 連接數過多。返回too much connections....


排查

登錄數據庫服務器,第一時間直接查看tcp連接數:


[root@s0001-gz ~]# netstat -nalpt | grep 3306 |wc -l

9093

一看9000多個連接了,有點恐怖。

登錄數據庫服務查看實際連接數:


mySQL>show processlist;


....


468 rows


連接數才468個,而設置的max_connection=1000;


一半都達不到,那問題就肯定出在系統的連接數上了。


查看實際的連接用戶:


90%全部是TIME_WAIT。



快速恢復方法:

vi /etc/sysctl.conf


編輯文件,加入以下內容:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

 

然后執行 /sbin/sysctl -p 讓參數生效

解釋:


net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;


net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉;


net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。


net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間


查看結果:

image.png

如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (884人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 老汉玩儿熄| 亚va中文字幕无码毛片| 欧美 在线 成 人| 久热久热免费视频中文字幕| 国产在视频线在精品视频2020| 重囗味sm在线观看无码| 一本无码中文字幕在线观| 波多野结衣中文字幕免费视频| 快穿寻找粗跟h| 国产婷婷综合在线视频| 特别黄的视频免费播放| 国产一卡二卡三卡新区在线| 免费人成黄页在线观看国产| 暖暖日本中文免费下载| 日本另类潮喷video| 日本熟妇无码免费视频色播| 6一12泑女www| 芳芳好紧好滑好湿好爽| z0z大狗| 成年性色生活视频免费| 被窝网| 男人胯间的硕大公车上| 又黄又潮娇喘的免费视频| 久久人人超97人妻免费| aa久久久久免费是国产| 亚洲成在人线av| 国产精品国产三级国产专区| 337p日本大胆欧美人视频| 女人与公拘交200部| chinesevideo猛攻打桩大学生| 俄罗斯13 14处| http://www.dxalmukr.com