使用java计算Tcp往返时间

时间:2011-07-06 16:25:21

标签: java tcp timing

当我使用10 gig网络接口从一个solaris m / c进行traceroute时,40字节数据包需要0.073 ms。

当我在java中做同样的事情时,时间会更长。即使经过10K迭代,它也会更长。可能是什么原因 ?

Java:Sender(Snippet)

Socket sendingSocket = new Socket(address, RECEIVER_PORT);
 sendingSocket.setTcpNoDelay(true);
 OutputStream outputStream = sendingSocket.getOutputStream();
 byte[] msg = new byte[64]; // assume that it is populated. 
 for (int i = 0; i < 10000; i++) {
    long start = System.nanoTime();
    outputStream.write(msg,0,64);
    outputStream.flush();

    inputStream.read(msg,0,64);  // inputStream is initialized like outputstream 
    long end = System.nanoTime(); 
 }  

它需要更长的69毫秒,它甚至不依赖于字节大小。即使我减少它说1字节数组,它仍然需要69毫安。任何评论/建议?

其他观察: 1. OutputStream.write和flush只需6微秒。 2.类似地,在接收和写回的TCPReceiver端的另一端,它只需要6微秒。

解决方案: 谢谢大家对此查询的回复。 我发现这是由于套接字缓冲区大小:

在solaris m / c上设置的默认缓冲区大小。

收到缓冲区大小49152.

发送缓冲区大小7552。

我增加了套接字缓冲区大小,性能几乎与traceRoute匹配。

3 个答案:

答案 0 :(得分:3)

你不是喜欢比较。 ICMP和TCP是不同的协议。

如果您想确定延迟是否在您的代码,JVM,Solaris TCP堆栈或网络中,您必须从tcpdump / wireshark等开始。

答案 1 :(得分:1)

这可能是由于许多因素造成的。对于初学者来说,建立TCP通道需要时间。必须在两个端点之间发送几个数据包以建立可靠的介质。 ICMP消息不是这种情况,它们只是单个数据包。实际上,因为无论大小如何,您都没有看到传输数据所需的时间差异,那么您可能会认为实际传输数据所需的时间(您谈论的是非常少量的数据)在任何情况下,在10gig连接上)与建立信道所花费的时间相比可以忽略不计。此外,完全有可能存在一些与您使用Java(字节码语言)而不是像C或C ++一样在硬件上本机运行的事实相关的开销。

答案 2 :(得分:0)

连接所需的时间约为20毫秒。您需要使用现有连接进行测试。

TCP堆栈通过内核非常慢。在许多机器上需要大约50-100我们。您可以使用内核旁路驱动程序/支持来减少这种情况。