根據(jù)TCP協(xié)議定義的3次握手?jǐn)嚅_(kāi)連接規(guī)定,發(fā)起socket主動(dòng)關(guān)閉的一方socket將進(jìn)入TIME_WAIT狀態(tài),TIME_WAIT狀態(tài)將持續(xù)2個(gè)MSL(Max Segment Lifetime),TIME_WAIT狀態(tài)下的socket不能被回收使用. 具體現(xiàn)象是對(duì)于一個(gè)處理大量短連接的服務(wù)器,如果是由服務(wù)器主動(dòng)關(guān)閉客戶(hù)端的連接,將導(dǎo)致服務(wù)器端存在大量的處于TIME_WAIT狀態(tài)的socket, 甚至比處于Established狀態(tài)下的socket多的多,嚴(yán)重影響服務(wù)器的處理能力,甚至耗盡可用的socket,停止服務(wù). TIME_WAIT是TCP協(xié)議用以保證被重新分配的socket不會(huì)受到之前殘留的延遲重發(fā)報(bào)文影響的機(jī)制,是必要的邏輯保證。

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
     16 CLOSING
    130 ESTABLISHED
    298 FIN_WAIT1
     13 FIN_WAIT2
      9 LAST_ACK
      7 LISTEN
    103 SYN_RECV
   5204 TIME_WAIT

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

狀態(tài):描述
CLOSED:無(wú)連接是活動(dòng)的或正在進(jìn)行的
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá),等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開(kāi)始,打開(kāi)一個(gè)連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說(shuō)它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時(shí)嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個(gè)釋放
LAST_ACK:等待所有分組死掉

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

原文和作者一起討論:http://www.cnblogs.com/intsmaze/p/7076624.html

微信:intsmaze

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

netstat -ae |grep mysql
tcp        0      0 aaaa:53045               192.168.12.13:mysql           TIME_WAIT   root       0
tcp        0      0 aaaa:53044               192.168.12.13:mysql           TIME_WAIT   root       0
tcp        0      0 aaaa:53051               192.168.12.13:mysql           TIME_WAIT   root       0
tcp        0      0 aaaa:53050               192.168.12.13:mysql           TIME_WAIT   root       0
tcp        0      0 aaaa:53049               192.168.12.13:mysql           TIME_WAIT   root       0

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

發(fā)現(xiàn)系統(tǒng)存在大量TIME_WAIT狀態(tài)的連接,通過(guò)調(diào)整內(nèi)核參數(shù)解決,

vi /etc/sysctl.conf

編輯文件,加入以下內(nèi)容:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

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_keepalive_time = 1200    
net.ipv4.ip_local_port_range = 1024    65000   ## 端口分配范圍
net.ipv4.tcp_max_tw_buckets = 5000   ## 設(shè)置"time_wait"的桶最多容納5000個(gè)

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

net.ipv4.tcp_syncookies = 1  表示開(kāi)啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1  表示開(kāi)啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1  表示開(kāi)啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_fin_timeout =30  表示如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了他在保持FIN-WAIT-2狀態(tài)的時(shí)間。
net.ipv4.tcp_keepalive_time = 1200  表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。
net.ipv4.ip_local_port_range = 1024  65000  表示用于向外連接的端口范圍。缺省情況下很?。?2768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192  表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets = 5000  表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為180000,改為5000。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

[阿里巴巴java開(kāi)發(fā)手冊(cè)推薦]高并發(fā)服務(wù)器建議調(diào)小 TCP 協(xié)議的 time_wait 超時(shí)時(shí)間。

說(shuō)明: 操作系統(tǒng)默認(rèn) 240 秒后,才會(huì)關(guān)閉處于 time_wait 狀態(tài)的連接,在高并發(fā)訪問(wèn)下,服務(wù)器端會(huì)因?yàn)樘幱?time_wait 的連接數(shù)太多,可能無(wú)法建立新的連接,所以需要在服務(wù)器上調(diào)小此等待值。

正例: 在 linux 服務(wù)器上請(qǐng)通過(guò)變更/etc/sysctl.conf 文件去修改該缺省值(秒) :

net.ipv4.tcp_fin_timeout = 30。 

 

搜人以魚(yú)不如授之以漁,讓我們來(lái)回顧計(jì)算機(jī)網(wǎng)絡(luò)中TCP協(xié)議的部分詳解,摘自-謝希仁 計(jì)算機(jī)網(wǎng)絡(luò)

TCP 的運(yùn)輸連接的三個(gè)階段
運(yùn)輸連接就有三個(gè)階段,即:連接建立、數(shù)據(jù)傳送和連接釋放。運(yùn)輸連接的管理就是使運(yùn)輸連接的建立和釋放都能正常地進(jìn)行。
連接建立過(guò)程中要解決以下三個(gè)問(wèn)題:
要使每一方能夠確知對(duì)方的存在。
要允許雙方協(xié)商一些參數(shù)(如最大報(bào)文段長(zhǎng)度,最大窗口大小,服務(wù)質(zhì)量等)。
能夠?qū)\(yùn)輸實(shí)體資源(如緩存大小,連接表中的項(xiàng)目等)進(jìn)行分配。
客戶(hù)-服務(wù)器方式
TCP 連接的建立都是采用客戶(hù)服務(wù)器方式。
主動(dòng)發(fā)起連接建立的應(yīng)用進(jìn)程叫做客戶(hù)(client)。
被動(dòng)等待連接建立的應(yīng)用進(jìn)程叫做服務(wù)器(server)。
TCP 的連接建立

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

A 的 TCP 向 B 發(fā)出連接請(qǐng)求報(bào)文段,其首部中的同步位 SYN = 1,并選擇序號(hào) seq = x,表明傳送數(shù)據(jù)時(shí)的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)是 x。
B 的 TCP 收到連接請(qǐng)求報(bào)文段后,如同意,則發(fā)回確認(rèn)。
B 在確認(rèn)報(bào)文段中應(yīng)使 SYN = 1,使 ACK = 1,其確認(rèn)號(hào)ack = x + 1,自己選擇的序號(hào) seq = y。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

A 收到此報(bào)文段后向 B 給出確認(rèn),其 ACK = 1,確認(rèn)號(hào) ack = y + 1。
A 的 TCP 通知上層應(yīng)用進(jìn)程,連接已經(jīng)建立。

B 的 TCP 收到主機(jī) A 的確認(rèn)后,也通知其上層應(yīng)用進(jìn)程:TCP 連接已經(jīng)建立。 

用三次握手建立 TCP 連接的各狀態(tài)

 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

TCP 的連接釋放

 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

數(shù)據(jù)傳輸結(jié)束后,通信的雙方都可釋放連接。
現(xiàn)在 A 的應(yīng)用進(jìn)程先向其 TCP 發(fā)出連接釋放報(bào)文段,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉 TCP 連接。A 把連接釋放報(bào)文段首部的 FIN = 1,其序號(hào) seq = u,等待 B 的確認(rèn)。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

B 發(fā)出確認(rèn),確認(rèn)號(hào) ack = u + 1,而這個(gè)報(bào)文段自己的序號(hào) seq = v。

TCP 服務(wù)器進(jìn)程通知高層應(yīng)用進(jìn)程。從 A 到 B 這個(gè)方向的連接就釋放了,TCP 連接處于半關(guān)閉狀態(tài)。B 若發(fā)送數(shù)據(jù),A 仍要接收。
若 B 已經(jīng)沒(méi)有要向 A 發(fā)送的數(shù)據(jù),其應(yīng)用進(jìn)程就通知 TCP 釋放連接。A 收到連接釋放報(bào)文段后,必須發(fā)出確認(rèn)。在確認(rèn)報(bào)文段中 ACK = 1,確認(rèn)號(hào) ack = w + 1,自己的序號(hào) seq = u + 1。

TCP 連接必須經(jīng)過(guò)時(shí)間 2MSL 后才真正釋放掉。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

第一,為了保證 A 發(fā)送的最后一個(gè) ACK 報(bào)文段能夠到達(dá) B。
第二,防止 “已失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中。A 在發(fā)送完最后一個(gè) ACK 報(bào)文段后,再經(jīng)過(guò)時(shí)間 2MSL,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段,都從網(wǎng)絡(luò)中消失。這樣就可以使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段。
            老鐵快->關(guān)注,點(diǎn)贊,轉(zhuǎn)發(fā)

 

老鐵,你的--->推薦,--->關(guān)注,--->評(píng)論--->是我繼續(xù)寫(xiě)作的動(dòng)力。 作者:劉洋 合作微信號(hào):intsmaze 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

http://www.cnblogs.com/intsmaze/p/7076624.html