<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[TCP TIME_WAIT状态（2MSL)]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 11 Jan 2010 09:03:47 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	------Finger<br/><br/>一般来说，tcp正常关闭需要四个包。比如a和b关闭连接，a先 给b发一个fin，b会进行确认ack，然后b也会发出fin，当a接受到这个fin，并发出最后一个ack后，就会处于time_wait状态。这个时 间长短跟操作系统有关，一般会在1-4分钟，也就是两倍的数据包(2msl)最大生存时间。TCP主动关闭方采用TIME_WAIT主要是为了实现终止 TCP全双工连接的可靠性及允许老的重复分节在网络中消逝，等过了2msl(大约1~4分钟)后TIME_WAIT就会消失。&nbsp;&nbsp;&nbsp;&nbsp;<br/>TIME_WAIT状态的目的是为了防止最后a发出的ack丢失，让b处于LAST_ACK超时重发FIN<br/><br/><br/><br/><a href="https://jackxiang.com/attachment.php?fid=41" target="_blank"><img src="https://jackxiang.com/attachment.php?fid=41" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>所以说，主动发起关闭连接的一方会进入time_wait状态，这个时候，进程所占用的端口号不能被释放。除非在你的程序中用setsockopt设置端口可重用(SOCK_REUSE)的选项，但这不是所有操作系统都支持的<br/><br/><br/>&nbsp;&nbsp; 解决TIME_WAIT的办法主要有以下几种：&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/><br/>&nbsp;&nbsp; 1、修改LINGER值，缩短关闭时间 <br/>&nbsp;&nbsp; LINGER&nbsp;&nbsp;&nbsp;&nbsp;lingerStruct; <br/>&nbsp;&nbsp; lingerStruct.l_onoff&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;1; <br/>&nbsp;&nbsp; lingerStruct.l_linger&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;0; <br/>&nbsp;&nbsp; setsockopt(m_socket,SOL_SOCKET,SO_LINGER,(char *)&amp;lingerStruct,sizeof(lingerStruct)); <br/>&nbsp;&nbsp; 不过这种办法不是很安全的，不过现在网络都很好啦，不会有问题的。 <br/><br/>&nbsp;&nbsp; 2、修改注册表 <br/>&nbsp;&nbsp; [HKEY_LOCAL_MACHINE&#92;SYSTEM&#92;ControlSet001&#92;Services&#92;Tcpip&#92;Parameters] <br/>&nbsp;&nbsp; &quot;TcpTimedWaitDelay&quot;=dword:00000005 <br/>&nbsp;&nbsp; 这个值好像是300秒到30秒之间，改成30秒后你会发现TIME＿WAIT很快就会消失了。 <br/><br/><br/>&nbsp;&nbsp; 3、禁用LINGER <br/>&nbsp;&nbsp; //如果你使用的是Socket API，可以这样 <br/>&nbsp;&nbsp; BOOL bDontLinger=FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp; setsockopt(m_socket,SOL_SOCKET,SO_DONTLINGER,(LPCTSTR)&amp;bDontLinger,sizeof(BOOL)); <br/>&nbsp;&nbsp; closesocket(s); <br/><br/>&nbsp;&nbsp; //如果你使用的是CAsyncSocket，需要响应的修改，例如禁用LINGER可以这样 <br/>&nbsp;&nbsp; BOOL bDontLinger=FALSE;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; m_socket-&gt;SetSockOpt(SO_DONTLINGER,(const char *)&amp;bDontLinger,sizeof(bDontLinger),SOL_SOCKET); <br/>&nbsp;&nbsp; m_socket-&gt;Close(); <br/><br/>&nbsp;&nbsp; 4、客户端可以不BIND()，这样，即使断开连接后再次连接，SOCKET将使用不同的端口(1025-5000)， <br/>&nbsp;&nbsp; 等几分钟后，原有的端口就会自动关闭。<br/><br/>关闭BITCOMET后系统出现的几个TCP状态<br/><a href="https://jackxiang.com/attachment.php?fid=42" target="_blank"><img src="https://jackxiang.com/attachment.php?fid=42" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><a href="https://jackxiang.com/attachment.php?fid=43" target="_blank"><img src="https://jackxiang.com/attachment.php?fid=43" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] TCP TIME_WAIT状态（2MSL)]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>