【问题标题】:Possible causes of lost data received on a gigabit UDP connection?在千兆 UDP 连接上接收到的数据丢失的可能原因是什么?
【发布时间】:2011-12-01 17:55:07
【问题描述】:

我编写了一个自定义 C# 程序,它接收大约 1MByte/sec 的 UDP 多播数据。它在千兆网卡上运行,连接到专用服务器。

在一天中的某些时候,当网络流量很高时,它会丢失 UDP 数据包。

  • 如果我有 两个 正在运行的程序副本,它们都会在 8 小时内收到 100% 的 UDP 数据包。
  • 如果我有 三个 正在运行的程序副本,它们都会在相同的 8 小时内开始丢失偶尔的 UDP 数据包。

在这两种情况下,CPU 使用率仅为峰值的 15% 左右。

这怎么可能?

【问题讨论】:

  • 你知道 UDP 不保证传送的权利吗? ... 丢包是意料之中的——尤其是在负载下
  • @jtm001。是的,我知道这一点。但是,在这种情况下,它无关紧要,因为程序的所有副本都在监视相同的 UDP 流。在这种情况下,数据包丢失发生在 数据包进入 NIC 之后。

标签: c# .net networking


【解决方案1】:

UDP 连接不保证数据包的传递,如果您需要保证数据包的传递,请改用 TCP。

使用 UDP 时丢包的原因有多种,列举几个:

  • 网络拥塞,
  • 数据包损坏,
  • 硬件故障。

虽然您在服务器(或客户端)上可能只使用了 15% 的 CPU,但这并不意味着您没有耗尽其他资源(即网络吞吐量、路由器缓冲区)。对我来说,听起来您可能正在遭受网络拥塞的困扰(正如您自己所说的那样,这只会在网络流量高的时候发生)。

【讨论】:

  • 看来解决办法是增加网卡上硬件缓冲区的大小。
【解决方案2】:

这里实际上有两个缓冲区在工作:硬件缓冲区(在网卡上)和 Windows 端缓冲区(在 .NET 中设置)。我们将网卡上的硬件缓冲区重新配置为 1024KB 而不是 256KB,希望这可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多