当TCP连接被关闭时,{ Protocol, Local IP, Local Port, Remote IP, Remote Port}五元组就进入TIME_WAIT状态,默认时间是4分钟。可以通过一组命令看看tcp的连接状态:
netstat -ano>>c:\port.txt
netstat -n | find /C /I "established"
查看连接与内存
ss -s && free -g
本地ip,远程ip,远程端口都是固定的,只有本地端口是变化的,本地端口只能使用1024-5000,因此如果在4分钟内发起了大约4000个连接,这时就会发生异常,下面是使用WCF,客户端的异常:
System.Net.Sockets.SocketException: Only one usage of each socket
address (protocol/network address/port) is normally permitted
192.168.101.5:8888
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at System.ServiceModel.Channels.SocketConnectionInitiator.Connect(Uri uri, TimeSpan timeout)
TcpTimedWaitDelay 描述:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/TCPIP/Parameters
确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。
此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。
减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。
如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。
参考:https://technet.microsoft.com/en-us/library/cc938217.aspx
TYPE: REG_DWORD
VALUE: 0x1E 0x12C ( 30–300 seconds )
DEFAULT: 0xF0 ( 240 seconds = 4 minutes )
将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。
建议值:最小值为 0x1E,它将等待时间设置为 30 秒。
MaxUserPort 描述:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/TCPIP/Parameters
TYPE: REG_DWORD
VALUE: 5,000–65,534 ( port number )
DEFAULT: 5000
确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。
缺省值:无 建议值:至少十进制 32768。
参考:https://technet.microsoft.com/en-us/library/cc938196.aspx
注意: 如果调整 MaxUserPort 或 TcpTimedWaitDelay 设置,您必须重新启动 Microsoft Windows 以使新设置生效。
使用 Exchange Server 2007 :
建议将 MaxUserPort 值设置为 60000。
如果设置的 MaxUserPort 值低于 60000,服务器可能会显示名称服务提供程序接口 (NSPI) 代理警告,例如事件 9040。
http://longwhiteclouds.com/2012/03/22/1-million-iops-microsoft-vs-vmware-comparison/
Links:
http://www.xiaobo.li/network/572.html