(轉(zhuǎn))
TIME_WAIT狀態(tài)
根據(jù)TCP協(xié)議定義的4次握手?jǐn)嚅_連接規(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),在Windows下默認(rèn)為4分鐘,即240秒,TIME_WAIT狀態(tài)下的socket不能被回收使用. 具體現(xiàn)象是對于一個(gè)處理大量短連接的服務(wù)器,如果是由服務(wù)器主動(dòng)關(guān)閉客戶端的連接,將導(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ī)制,是必要的邏輯保證.
可以用如下代碼嘗試關(guān)閉TIME_WAIT,但這樣作是很危險(xiǎn)的,違背TCP協(xié)議的,也不一定有效果.
linger InternalLinger = { 1, 0 };
::setsockopt(socket, SOL_SOCKET, SO_LINGER, (const char*)&InternalLinger, sizeof(linger));
中庸的做法是,可在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名為TcpTimedWaitDelay的
DWORD鍵,設(shè)置為30-240,以縮短TIME_WAIT的等待時(shí)間,這也是對IIS服務(wù)器的優(yōu)化手段之一.編程上,除非必要,應(yīng)盡量讓客戶端發(fā)起斷開操作.