c# - 如何完全终止 HttpWebRequest

标签 c# tcp httpwebrequest network-protocols webproxy

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

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

我明白了

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

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

那么我该如何防止此类问题的发生呢?

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

当我使用 webproxies 时出现此问题:Too many proxy connection kills window's resolving hosts ability

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

enter image description here

最佳答案

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

首先看一下TCP状态图,

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

这是在机器的 TCP 发送 ACK 段以响应从其对等方接收到的 FIN 段后的 TCP 连接状态(详细信息参见 1981 年定义 TCP 的 RFC 793 http://www.ietf.org/rfc/rfc793.txt)。在此状态期间,套接字资源,包括 TCB(TCP 控制 block )和端口,当然不会释放给操作系统。超时到期后,套接字资源将释放给操作系统。最初的原因是为了处理在不可靠介质中对等点之间可能发生的双将军问题。连接将处于 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 来更改此行为。

关于c# - 如何完全终止 HttpWebRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42907117/

相关文章:

c# - 是否必须为 ProcessStartInfo 分配空间?

http - PUT 和 POST 请求是否需要/期望有一个请求主体?

linux - 我对 ERROR_PROTECTION_VIOLATION 感到困惑

c - 在 TCP/IP 聊天程序中无法工作

c# - 如何将文件从 .NET 应用程序上传到 Rocket.Chat-Channel?

CSS 重复背景、sprite 或 1px png

c# - 更改 MAUI Blazor 混合应用程序中的 Windows 托盘图标 - 找不到 OnNativeMessage 定义

c# - 绑定(bind) OxyPlot Tracker 并在 TextBlock 中设置获取值

c# - 减小图像大小 C#

c# - 在局域网外使用 TCP