【问题标题】:TCP connection quality in .NET.NET 中的 TCP 连接质量
【发布时间】:2010-09-17 10:04:24
【问题描述】:

我有一个关键任务实时数据应用程序,它在客户端和服务器之间使用 TCP 连接。在某些情况下,连接会定期终止(SocketException)。没问题 - 只需重新连接并继续。然而,客户对这些断断续续的连接性下降并不感到兴奋。

我想知道把手指指向哪里。是客户端还是服务器?硬件还是软件?与以太网链接有关吗?最终结果将是向用户显示连接健康状况的指标,以便可以调查和修复不良链接。

我可以从 TcpClient、Socket 或其他任何可以告诉我连接健康状况的指标吗?也许平均确认时间、重试次数等?

我特别想了解 TCP 连接 - 不仅仅是整个以太网连接(您的 LAN 连接可能很花哨,但到外部服务器可能会出现问题)。

当然,我可以 ping 远程主机,但我认为这不会真正为我提供我正在寻找的那种统计数据。一方面,如果服务器隐藏在 NAT 后面,我可能会 ping 路由器。

【问题讨论】:

    标签: .net sockets tcp


    【解决方案1】:

    首先,您应该检查您得到的 SocketExceptions 的详细信息。我不知道它们在 .Net 中包含什么,但在 Java 中,详细消息提供了有用的提示,例如“连接已被对等方关闭”或“连接重置”。

    根据我的经验,套接字连接被丢弃的一个常见原因是代码中的一个错误,其中读取超时异常由与所有其他与连接相关的异常相同的 catch 子句处理,因此通常会导致连接被关闭没有充分的理由。

    在企业设置中,长期 TCP 连接被关闭的典型原因是防火墙设备在没有流量的情况下关闭 TCP 连接,例如 10 分钟后,或者在连接时间达到 30 分钟后关闭连接,无论的交通。一般来说,最好假设这些事情会发生,并准备好优雅地重新建立连接。

    一个好的方法是查看连接关闭器中是否存在模式。例如,它们是定期关闭,还是在一段时间没有活动后关闭。您还可以运行数据包嗅探器来查看是哪一方发起了连接关闭或发送了 RST 数据包以及原因。

    【讨论】:

    • +1 用于嗅探器。 Wireshark,以前称为 Ethereal 的嗅探器,非常好用。
    【解决方案2】:

    Perfmon 是您的朋友,为所有 IP、TCP 和网络计数器运行日志。如果您可以判断连接何时终止,您可以查看图表以查看是否有任何问题 - 网络错误、没有传输、没有传输 IO 字节等。

    也添加一些 .NET 计数器,例如 GC、内存和 CPU 使用率。

    您可以做的最后一件事是增加 TCP 超时和其他设置。他们是in the registry

    如果远程服务器确实有问题,您将不得不监视两端,但首先要查看计数器,看看是否有任何东西跳出来。

    【讨论】:

    • 谢谢。但是,我真的在寻找一些方法来在应用程序内小范围地做到这一点。如果客户报告有很多断开的连接,我不能告诉他们要求 IT 部门花一天时间来解决它(不过,这不是很好)。
    • 不过,您可以与客户交谈,我之前已经做过几次尝试跟踪内存、性能和网络问题。经常是网卡的问题。如果您与客户“合作”,通常会让他们感到温暖和模糊。
    猜你喜欢
    • 2010-09-15
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多