【问题标题】:How to fully terminate HttpWebRequest如何完全终止 HttpWebRequest
【发布时间】:2017-03-20 15:05:07
【问题描述】:

即使我在检查现有 HTTP 连接时正确终止了所有内容,但我发现它们并未终止

例如,当我通过启动不同的任务打开 200 个并发连接时

我明白了

158 Established HTTP connections
927 TimeWait
95 SynSent
24 LastAck
6 CloseWait
34 FinWait

更糟糕的是,TimeWait 的数量每分钟都在增加

那么我怎样才能防止这样的问题发生呢?

一段时间后,窗口无法发出任何新请求

当我使用 webproxy 时会出现这个问题:Too many proxy connection kills window's resolving hosts ability

当我使用不同代理的 200 个连接时

【问题讨论】:

    标签: c# tcp httpwebrequest network-protocols webproxy


    【解决方案1】:

    处于 TimeWait 状态的连接会产生性能问题。

    首先看一下TCP状态图,

    https://en.wikipedia.org/wiki/File:Tcp_state_diagram_fixed_new.svg

    这是在机器的 TCP 发送 ACK 段以响应从其对等方接收到的 FIN 段之后 TCP 连接的状态(详细信息在 RFC 793 中定义 TCP 早在 1981 年http://www.ietf.org/rfc/rfc793.txt)。在此状态期间,包括 TCB(TCP 控制块)和端口在内的套接字资源当然不会释放给操作系统。超时后,套接字资源被释放给操作系统。最初的原因是为了处理在不可靠介质中的同行之间可能发生的两将军问题。连接将处于 TimeWait 状态,直到一个可配置的超时,其默认值取决于操作系统。

    这些链接可以帮助您在 Windows 中设置 TcpTimedWaitDelay 参数:

    https://technet.microsoft.com/en-us/library/cc938217.aspx http://msdn.microsoft.com/en-us/library/ee377084%28v=bts.10%29.aspx

    它说默认值是 240 秒,但我是我的测试,我经历的时间较短(在 60 到 120 之间)。

    无论如何,今天的网络更加可靠,需要高性能和吞吐量的 Web 服务应该会降低这个值。我建议将其设置为 5 秒。如果您想更保守一点,请将其设置为 30 秒。

    其他可能对您有用的参数是 Windows 允许客户端打开的临时端口的最大数量。默认情况下,Windows Server 会限制临时 TCP 端口的最大数量。在某些 Windows 中,此值可能是 5000。您可以通过在注册表中设置值 MaxUserPort 来更改此行为。

    【讨论】:

    • 非常喜欢。你能告诉我确切的注册表名称来设置这两个值吗?最大 TCP 连接数和更改 TimeWait 的默认等待值?适用于 Windows 8.1
    • @MonsterMMORPG、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort 和 TcpTimedWaitDelay。它在链接中,我相信它们对于 Windows 8.1 是相同的。如果它们不存在,则必须添加它们。
    • 是的,我认为它应该添加。无论如何,我可以验证他们正在工作?我的意思是像一些 cmd 命令等?
    • @MonsterMMORPG,这是我找到的唯一方法:对于 TimeWait 状态,您可以用手表测量它。只需打开和关闭五个连接,看看 TimeWait 中的套接字数量如何变化。很容易区分。 MaxUserPort,首先尝试打开 1K 或 10K 连接会报错。然后更改参数再试一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2015-02-24
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多