【问题标题】:Requirements for Repeated TCP connects重复 TCP 连接的要求
【发布时间】:2012-03-23 08:15:43
【问题描述】:

我正在使用 Winsock,我需要反复发出 TCP 连接到第三方服务器。这些应用程序可能会一次保留数天。我是唯一连接到服务器的客户端。连接之间的时间大约是几秒钟,并且连接只保持足够长的时间来发送几个字节的单个消息。我目前看到几个小时后连接开始失败(WSAECONNREFUSED)。有什么我必须做的(例如套接字选项等)来确保这些频繁的重复连接会无限期地成功吗?谢谢!

【问题讨论】:

  • 您所描述的通常被认为是客户的“不良行为”。 “连接被拒绝”错误可能是服务器资源不足(或限制您的客户端),因为它连接太频繁。你的用例是什么?你能改变你的设计以减少所需的连接吗?
  • 至于耗尽资源,我没有提到连接只保持足够长的时间来发送几个字节。我已经为此编辑了原始帖子。我正在轮询服务器以了解服务的可用性。此可用性经常更改,服务器不允许我注册可用性更改通知。为了向我的人类用户提供准确的系统状态表示,我经常轮询。我同意这并不理想,而且很可能是我被限制了(我在服务器上没有描述什么连接频率是可接受的文档)。
  • 我将扩展我之前的评论,指出服务器上的 netstat -an 显示大约 13 个左右处于 TIME_WAIT 状态的连接。虽然这听起来不太好,但我不认为它所表明的问题是所有可用资源都已被消耗,因为 13 在这种情况下是一个很小的数字。
  • 听起来不错。您需要更多信息。请问什么窗口在错误事件日志中告诉你?
  • 事件日志中没有出现与我的问题相关的内容。

标签: tcp winsock


【解决方案1】:

当进行大量基于事务的连接并遇到 TCP 的 TIME_WAIT 状态持续时间(持续 2MSL = 120 秒)问题导致客户端主机没有更多可用连接到特定服务器主机时,您应该考虑使用 UDP 并自行管理重新发送丢失的请求。

我知道这听起来很奇怪。但是像 DNS 这样的标准服务需要使用 UDP 来处理大量事务(请求然后一个 UDP 段中的单个答案)以避免您自己试验的问题。 Web 浏览器使用 UDP 向 DNS 发送请求。重新请求是在短时间内使用 UDP 完成的,我猜不超过几毫秒。有时解析的名称太长,不适合 UDP paquet。因此,DNS 服务器发送一个带有专用标志的 UDP 回复,以要求客户端这次使用 TCP。

此外,如果在您的 Windows 平台上可用,您还可以考虑 TCP 的 T/TCP 扩展(事务 TCP)。它以更短的 TIME_WAIT 状态提供 TCP 可靠性,因为修改客户端代码几乎没有成本。据我所知,即使服务器不处理该扩展,它也可以工作。作为旁注,它目前没有在互联网上使用,因为它已知有一些缺陷......

【讨论】:

  • 您的建议听起来一点也不奇怪,感谢您抽出宝贵时间提出建议。不幸的是,我无法访问服务器代码,所以我无法修改它的通信方式。
  • 关于您在评论中提供的新信息,我的回答对您没有帮助。对于那个很抱歉。您可以尝试修改客户端主机上的配置以缩短 MSL 或 TIME_WAIT 状态持续时间,从而更快地释放与服务器主机的连接。由于我不是专家,我不知道这是否可能......
  • 关于活跃密切讨论的链接。我确实会在完成后立即关闭套接字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2011-07-24
  • 2020-07-28
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多