对于相同的数据包大小,Java DatagramSocket receive()比send()花费更多的时间

时间:2016-02-10 17:02:48

标签: java sockets networking

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

为此,我测量了代码的逐块执行时间。奇怪的是,我观察到,socket.receive(pkt)所花费的时间大约是400-500微秒,并且随着数据包大小的增加而不断增加。另一方面,插座。 send(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)));
    }
}

1 个答案:

答案 0 :(得分:1)

发送通常只是转移到套接字发送缓冲区。通过线路的实际发送是异步的。你没有衡量它。

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

它们无法比较。

相关问题