我正在使用 IIS(在 Windows 2003 上),并在我的默认网站上放置了一个 dummy.html。该文件是空的。
我在用着韓國多次访问此文件(wfuzz 执行 HTTP 请求),使用以下命令:
wfuzz.exe -c -z range -r 0-5000 "http://localhost/dummy.html"
我运行 5 个并行 wfuzz 几分钟,然后 IIS 停止响应。发生这种情况时,我无法再通过端口 80 远程登录本地主机。如果我停止 wfuzz 客户端并等待一分钟,我可以再次远程登录端口 80。
仅当我选择了启用 HTTP 保持连接在 IIS 中。如果我禁用此选项,问题似乎就消失了。我可以运行 15 wfuzz 几分钟,仍然能够通过端口 80 远程登录 localhost,没有任何问题。
IIS 配置为使用无限数量的连接。
那么,为什么 IIS 会在一分钟后停止响应呢?启用 HTTP 保持连接是否已启用?
起初我以为问题是处于 TIME_WAIT 状态的套接字数量太多,但我不明白为什么取消选择启用 HTTP 保持连接如果这是原因,则可解决问题。如果我的客户端在每次请求之间断开连接,则我认为此设置不会对 IIS 行为产生任何影响。
答案1
启用 HTTP Keep-Alives 会尝试保持连接打开,以允许客户端下载多个资源,而无需为每个资源设置新连接的开销。超时就是等待的时间。
即使在 IIS 中设置了无限制连接,机器可以处理的连接数仍然有限制。通过在锤击测试中反复设置新连接,您已经达到了该限制,并阻止了 telnet 建立的新连接。
通过禁用 http keep alive 或减少超时,您增加了连接的周转率,但代价是增加了现实世界浏览器的开销,因为现实世界浏览器的行为方式与您的测试客户端不同。在尝试提高性能时,您可能实际上降低了性能。
与大多数事物一样,找到最佳设置是一种平衡行为,这取决于您的实际使用情况。
答案2
是 TIME_WAIT 状态导致了这个问题。我在注册表中修改了 TIME_WAIT 状态的超时时间,问题就解决了。仍然不确定启用 HTTP Keep-Alives 会如何影响这个问题,但是...
答案3
对于高性能网站,MS 建议进行以下更改:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnablePMTUDiscovery"=dword:00000001
"MaxUserPort"=dword:0000fffe
"TCPTimedWaitDelay"=dword:0000003c
"TCPMaxSendFree"=dword:0000ffff
"SynAttackProtect"=dword:00000001
请注意,需要重新启动服务器才能使这些更改生效。
看:
(从我的堆栈溢出回答)