1. 程式人生 > >TCP埠狀態說明ESTABLISHED、TIME_WAIT

TCP埠狀態說明ESTABLISHED、TIME_WAIT

TCP狀態轉移要點

TCP協議規定,對於已經建立的連線,網路雙方要進行四次握手才能成功斷開連線,如果缺少了其中某個步驟,將會使連線處於假死狀態,連線本身佔用的資源不

會被釋放。網路伺服器程式要同時管理大量連線,所以很有必要保證無用連線完全斷開,否則大量僵死的連線會浪費許多伺服器資源。在眾多TCP狀態中,最值得 注意的狀態有兩個:CLOSE_WAIT和TIME_WAIT。   1、LISTENING狀態 FTP服務啟動後首先處於偵聽(LISTENING)狀態。

2、ESTABLISHED狀態 ESTABLISHED的意思是建立連線。表示兩臺機器正在通訊 3、CLOSE_WAIT
    對方主動關閉連線或者網路異常導致連線中斷,這時我方的狀態會變成CLOSE_WAIT 此時我方要呼叫close()來使得連線正確關閉 4、TIME_WAIT     我方主動呼叫close()斷開連線,收到對方確認後狀態變為TIME_WAIT。TCP協議規定TIME_WAIT狀態會一直持續2MSL(即兩倍的分

段最大生存期),以此來確保舊的連線狀態不會對新連線產生影響。處於TIME_WAIT狀態的連線佔用的資源不會被核心釋放,所以作為伺服器,在可能的情 況下,儘量不要主動斷開連線,以減少TIME_WAIT狀態造成的資源浪費。

    目前有一種避免TIME_WAIT資源浪費的方法,就是關閉socket的LINGER選項。但這種做法是TCP協議不推薦使用的,在某些情況下這個操作可能會帶來錯誤。 5、SYN_SENT狀態

   SYN_SENT狀態表示請求連線,當你要訪問其它的計算機的服務時首先要發個同步訊號給該埠,此時狀態為SYN_SENT,如果連線成功了就變為

ESTABLISHED,此時SYN_SENT狀態非常短暫。但如果發現SYN_SENT非常多且在向不同的機器發出,那你的機器可能中了衝擊波或震盪波 之類的病毒了。這類病毒為了感染別的計算機,它就要掃描別的計算機,在掃描的過程中對每個要掃描的計算機都要發出了同步請求,這也是出現許多 SYN_SENT的原因。 根據TCP協議定義的3次握手斷開連線規定,發起socket主動關閉的一方 socket將進入TIME_WAIT狀態,TIME_WAIT狀態將持續2個MSL(Max Segment Lifetime),在Windows下預設為4分鐘,即240秒,TIME_WAIT狀態下的socket不能被回收使用. 具體現象是對於一個處理大量短連線的伺服器,如果是由伺服器主動關閉客戶端的連線,將導致伺服器端存在大量的處於TIME_WAIT狀態的socket, 甚至比處於Established狀態下的socket多的多,嚴重影響伺服器的處理能力,甚至耗盡可用的socket,停止服務. TIME_WAIT是TCP協議用以保證被重新分配的socket不會受到之前殘留的延遲重發報文影響的機制,是必要的邏輯保證. windows 機器設定 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,右鍵新增名為TcpTimedWaitDelay的 DWORD鍵,設定為60,以縮短TIME_WAIT的等待時間 ubuntu機器設定

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 時間 檢視系統TCP連線資源命令 netstat  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

一般情況下,系統的socket資源預設5000個。(非官方) TCP協議中有TIME_WAIT這個狀態 主要有兩個原因 1。防止上一次連線中的包,迷路後重新出現,影響新連線(經過2MSL,上一次連線中所有的重複包都會消失) 2。可靠的關閉TCP連線。在主動關閉方傳送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發 fin, 如果這時主動方處於 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。