双向UDP通信中的吞吐量差异

时间:2014-02-25 21:00:51

标签: c# sockets udp udpclient throughput

我在我的应用+网络中发现了一个疯狂的行为。我写了一个简单的应用程序,发送和接收UDP数据包(全部有968字节)。使用三台机器(A,B和C),所有机器都在同一个本地网络(没有防火墙),我有以下环境:

  1. 在机器A中,应用程序向机器B和C中的应用程序实例发送1个数据包/毫秒。
  2. 在机器B中,应用程序向机器A和C中的应用程序实例发送1个数据包/毫秒。
  3. 在机器C中,应用程序向机器A和B中的应用程序实例发送1个数据包/毫秒。
  4. 除了发送数据包之外,应用程序会对每个远程实例的接收数据包进行计数(时间窗口= 1秒),这会导致:

    1. 在机器A中,应用程序显示从机器B获得6.4%,从机器C获得98%-100%。
    2. 在机器B中,应用程序显示从机器B和C接收98%-100%。
    3. 在机器C中,应用程序显示从机器B获得6.4%,从机器A获得98%-100%。
    4. 所有机器都使用相同的应用程序版本,所以显然有任何疯狂的事情,但在快速测试中使用ipperf没有可能在机器B中看到任何问题。我发送UPD数据包的代码是:

      Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
      IPEndPoint endPoint = new IPEndPoint(peerContext.Address, this.sendPort);
      
      while (mycondition) //this is a thread loop...
      {
        byte[] buffer = (byte[])this.udpPacket.Clone();
        var sent = sender.SendTo(buffer, endPoint);
      
        if (sent != buffer.Length)
          //Warning.... never happen!
      }
      

      使用20ms的速率我看到机器A e C从机器B接收64%(之前是6.4%),但是使用iperf这不会发生。

      然后,任何人都可以提供一些意见吗?

0 个答案:

没有答案