【问题标题】:Why I can't get all UDP packets?为什么我无法获取所有 UDP 数据包?
【发布时间】:2011-01-25 01:37:02
【问题描述】:

我的程序使用 UdpClient 尝试从 27 个主机接收 27 个响应。响应的大小为 10KB。我的宽带传入带宽是 150KB/s。

主机几乎同时每 10 秒发送 27 个响应。

但是,我每次只能收到 8 - 17 个回复。我可以收到的回复数量非常动态,但在范围内。

谁能告诉我为什么?为什么我不能全部收到?

我了解 UDP 不可靠。但我尝试同时收到 5 - 10 个回复,它奏效了。我猜网络链接还不错。

代码很简单。在 27 台主机上,我只使用 UdpClient 将 10KB 发送到我的机器。

在我的机器上,我有一个 UdpClient 接收数据报。每次我得到一个数据,我都会创建一个线程来处理它(基本上处理它意味着只是打印出“我收到了 10KB”,但它在一个线程中运行)。

listener = new UDPListener(Port);
listener.Start();
while (true) {
    try {
        UDPContext context = listener.Accept();
        ThreadPool.QueueUserWorkItem(new WaitCallback(HandleMessage), context);

    } catch (Exception) { }
}

如果我将响应的大小减小到 3KB,情况会好很多,可以接收大约 25 个响应。

还有什么想法吗? UDP缓冲区问题???

【问题讨论】:

  • 请考虑您可能在网络堆栈中的其他位置丢弃 UDP 数据包 - 不一定在您的宽带链路上。
  • 基本上,随着时间的推移已经发现,一旦你将 UDP '修补'到它开始可靠的程度,你就会拥有一个缓慢、庞大、不可靠的 TCP 堆栈。只是说。

标签: c# sockets udp


【解决方案1】:

正如您自己所说,UDP 不可靠。所以很有可能数据包被丢弃在某个地方。

请注意,过载的交换机/路由器/网卡和不良链接一样会导致丢包。如果有人“同时”向您发送 27 个 10Kb 响应。很可能是您的网卡或附近交换机的缓冲区已满,数据包被丢弃。

在您展示一些代码之前,可能没什么好说的了。

【讨论】:

  • UDP 仅用于可靠性不是问题且速度至关重要的情况。如果您需要可靠性,请始终使用 TCP。
  • 感谢您的回复。是否有可能某种缓冲区不足以容纳数据?还是数据在我及时处理数据之前就被擦除了?
  • @Jack 是的,我就是这么说的 :) 这些缓冲区可能在您的网卡、Windows 内核或附近的以太网交换机中。在任何情况下,您都无能为力 - 即使您会增加 UDP 缓冲区,也不能保证它会有所帮助,如果是路由器或交换机丢弃了数据包,它也无济于事。
【解决方案2】:

10kb 数据包可能正在被分段。即使其中一个片段被丢弃,数据包也无法重新组装。根据您的网络,3kb 数据包可能不会被分段,但无论如何它们的分段会更少,从而增加它们通过的机会。您可以运行 PMTU 发现工具来找出链路支持的最大数据包大小。

【讨论】:

    【解决方案3】:

    我认为 UDP 根本不可靠,所以我认为这个问题是因为你遇到了瓶颈(它是多么典型的调用)UDP 发送所有内容,但无序且未经检查 所以我认为你必须使用 UDP 创建这种协议,我告诉这个原因我已经做到了 关键是尝试发送带有 ID 的所有包裹。这样接收方就知道哪些包丢失了,并可以像 TCP 通常那样向发送方索要它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多