【问题标题】:Java DatagramSocket receive() takes more time than send() for the same packet size对于相同的数据包大小,Java DatagramSocket receive() 比 send() 花费更多时间
【发布时间】:2016-02-10 17:02:48
【问题描述】:

我正在编写一个 UDP 数据报服务器-客户端应用程序,其中大小为 60/100/200 字节(包括 UDP+IP+MAC 标头)的数据包通过高速链路传输。此应用程序对延迟至关重要,即每个数据包应经历相同的延迟,理想情况下是链路上的往返时间。然而,随着数据包大小的增加,延迟的成比例增加是可以接受的。

为此,我逐块测量了我的代码的执行时间。奇怪的是,我观察到 socket.receive(pkt) 花费的时间大约为 400-500 微秒,并且随着数据包大小的增加而不断增加。另一方面,插座。发送 (pkt) 需要 20-100 微秒。因此,客户端和服务器上的 socket.receive() 数据包导致实际往返时间超过 1 毫秒的延迟。

请注意,两个服务器-客户端套接字都能够处理高数据包到达率,并且数据包丢失不是问题。

我显然无法理解,如果数据包大小相同,为什么只有在 receive() 函数上才会出现这种行为?高度赞赏帮助/讨论。

以下是接收数据报包的代码块。

private void receive() throws Exception {
    receivedPacket = new DatagramPacket(inBuffer, inBuffer.length);
    while(true){
        long t1 = System.nanoTime();
        clientSocket.receive(receivedPacket);
        System.out.println("time to receive "+ TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - t1));
        threadPool.execute(new ClientSend(new DatagramPacket(receivedPacket.getData(), receivedPacket.getLength(), serverAddress, receiverPort)));
    }
}

【问题讨论】:

  • 你为什么不用两个并发进程来测试这个,一个输出数据报,另一个接受它们?正如 EJP 的回答所指出的,异步发送和同步接收使问题变得毫无意义......
  • 在这种情况下,我认为你的缓冲区太大,所以可能网络堆栈等待这个缓冲区填满

标签: java sockets networking


【解决方案1】:

发送通常只是向套接字发送缓冲区的传输。通过线路的实际发送是异步的。你没有衡量那个。

如果需要,接收首先包括阻塞,直到套接字接收缓冲区中的数据可用,然后从接收缓冲区中传输出来。

它们没有可比性。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2022-09-30
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多