【发布时间】: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