TIME WAIT狀態釋疑

2021-05-26 05:36:22 字數 2747 閱讀 6194

一、現象:

登陸伺服器的時候輸入netstat -natup

發現存在大量time_wait狀態的連線

tcp        0      0 127.0.0.1:3306              127.0.0.1:41378             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:41379             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:39352             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:39350             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:35763             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:39372             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:39373             time_wait

tcp        0      0 127.0.0.1:3306              127.0.0.1:41176             time_wait

二、原因

time_wait狀態也稱為2msl等待狀態

每個tcp報文在網路內的最長時間,就稱為msl(maximum segment lifetime),它的作用和ip資料報的ttl類似。

rfc793指出,msl的值是2分鐘,但是在實際的實現中,常用的值有以下三種:30秒,1分鐘,2分鐘。

注意乙個問題,進入time_wait狀態的一般情況下是客戶端,大多數伺服器端一般執行被動關閉,不會進入time_wait狀態,當在伺服器端關閉某個服務再重新啟動時,它是會進入time_wait狀態的。

舉例:1.客戶端連線伺服器的80服務,這時客戶端會啟用乙個本地的埠訪問伺服器的80,訪問完成後關閉此連線,立刻再次訪問伺服器的80,這時客戶端會啟用另乙個本地的埠,而不是剛才使用的那個本地埠。原因就是剛才的那個連線還處於time_wait狀態。

2.客戶端連線伺服器的80服務,這時伺服器關閉80埠,立即再次重啟80埠的服務,這時可能不會成功啟動,原因也是伺服器的連線還處於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

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時間

此值是time_wait狀態的最長時間。預設為240秒,最低為30秒,最高為300秒。建議為30秒。

然後執行/sbin/sysctl -p讓引數生效。

修改之後,再用命令檢視time_wait連線數

netstat -ae|grep 「time_wait」 |wc –l

發現大量的time_wait 已不存在,mysql程序的佔用率很快就降下來的,**訪問正常。

不過很多時候,出現大量的time_wait狀態的連線,往往是因為**程式**中沒有使用mysql.colse(),才導致大量的mysql  time_wait.

四、注釋:

tcp結束的過程如下:

server                             client

-------------- fin -------------->  server: fin_wait_1

<------------- ack --------------- client: close_wait  server:fin_wait_2

<------------- fin  --------------- client發出fin之後就關閉

-------------- ack ------------->  server發出ack後進入time_wait狀態

time_wait的預設時間是2倍的mls,就是240秒鐘。mls是tcp片在網上的最長存活時間。

time_wait的主要作用是保證關閉的tcp埠不立即被使用。因為當網路存在延遲時,可能當某個埠被關閉後,網路中還有一些重傳的tcp片在發向這個埠,如果這個埠立即建立新的tcp連線,則可能會有影響。所以使用2倍的msl時間來限制這個埠立即被使用。

TIME WAIT狀態的意義

客戶端與伺服器端建立tcp ip連線後關閉socket後,伺服器端連線的埠 狀態為time wait 是不是所有執行主動關閉的socket都會進入time wait狀態呢?有沒有什麼情況使主動關閉的socket直接進入closed狀態呢?主動關閉的一方在傳送最後乙個ack 後 就會進入time wa...

TIME WAIT和CLOSE WAIT狀態區別

在伺服器的日常維護過程中,會經常用到下面的命令 plain view plain copy print netstat n awk tcp end netstat n awk tcp end 它會顯示例如下面的資訊 time wait 814 close wait 1 fin wait1 1 est...

也說說TIME WAIT狀態

乙個朋友問到,自己用go寫了乙個簡單的http服務端程式,為什麼壓測的時候服務端會出現一段時間的time wait超高的情況,導致壓測的效果不好呢?記得老王有兩篇文章專門說這個,當時粗粗看了一遍,正好碰上這個問題,又翻出來細細摟了。第乙個要弄懂的,是time wait是怎麼產生的。要弄懂time w...