繁体   English   中英

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

[英]Java DatagramSocket receive() takes more time than send() for the same packet size

我正在编写UDP数据报Server-Client应用程序,其中大小为60/100/200字节(包括UDP + IP + MAC报头)的数据包通过高速链路传输。 此应用程序对延迟至关重要,即每个数据包都应经历相同的延迟,最好是链路上的往返时间。 但是,随着数据包大小的增加,延迟的按比例增加是可以接受的。

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

请注意,两个Server-Client套接字都能够处理较高的数据包到达率,因此不必担心数据包丢失。

我显然无法理解,如果数据包大小相同,为什么仅在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)));
    }
}

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

接收首先包括在必要时阻塞,直到套接字接收缓冲区中的数据可用为止,然后从接收缓冲区中传输出去。

它们不可比。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM