如何衡量使用UDP协议进行通信的服务器和客户端之间的响应时间?

时间:2009-03-05 22:15:23

标签: java networking udp client-server

测试的目的是检查两台主机(客户端和服务器)之间网络响应时间的形状。网络响应=发送数据包并将其接收所需的往返时间。我正在使用UDP协议。我怎么能计算响应时间?我可以减去TimeOfClientRequest - TimeOfClientResponseRecieved。但我不确定这是否是最佳方法。我不能只从代码内部做到这一点,我认为操作系统和计算机负载可能会干扰客户端启动的测量过程。顺便说一下,我正在使用Java。

我想听听你的想法。

7 个答案:

答案 0 :(得分:2)

只需使用ping - RTT(往返时间)是它测量的标准内容之一。如果您发送的数据包的大小很重要,那么ping也允许您指定每个数据包中的数据大小。

例如,我只发送了10个数据包,每个数据包有1024字节的有效负载到我的网关,只显示摘要统计信息:

ping -c 10 -s 1024 -q 192.168.2.1

PING 192.168.2.1(192.168.2.1)1024(1052)字节的数据。

--- 192.168.2.1 ping statistics ---

发送10个包,10个接收,0%丢包,时间9004ms

rtt min / avg / max / mdev = 2.566 / 4.921 / 8.411 / 2.035 ms

以rtt(往返时间)开头的最后一行是您可能正在寻找的信息。

答案 1 :(得分:1)

我认为你提到的方法很好。操作系统和计算机负载可能会产生干扰,但与通过网络发送数据包所需的时间相比,它们的影响可能会微不足道。

为了解决一些问题,你总是可以来回发送几个数据包并平均时间。

答案 2 :(得分:1)

如果您可以访问代码,那么是,只需测量发送请求和收到答案之间的时间。请记住,Java中的标准计时器只有毫秒级的分辨率。

或者,使用Wireshark捕获线路上的数据包 - 该软件还会记录数据包的时间戳。

显然,在这两种情况下,测量时间取决于另一端对原始请求的响应速度。

如果您真的只想测量网络延迟并自己控制远端,请使用许多UNIX服务器仍然支持的echo 7/udp服务(尽管通常禁用它以防止其用于反映的DDoS攻击)。

答案 3 :(得分:0)

如果您可以发送ICMP软件包会很好 - 我想,因为它们是由网络层直接回答的,所以您的答案将在服务器上的用户模式中毫不费力。

然而,似乎无法在java中发送ICMP包。你可以:

 boolean status = InetAddress.getByName(host).isReachable(timeOut)

这会发送一个ICMP包,但这不是你想要的。

但是,如果您在服务器端启动具有更高优先级的响应者守护程序,则会减少服务器负载的影响。

实际上服务器负载不起作用,只要它低于100%CPU。

答案 4 :(得分:0)

首先使用ping,但您可以通过发送数据包并让另一端发送数据包来测量RTT。

测量框在典型负载下的时间非常重要,因为这会告诉您通常可以获得的RTT。

您可以对许多数据包,数百万甚至数十亿的延迟进行平均,以获得一致的值。

答案 5 :(得分:0)

除了提到使用ICMP ping测量RTT时间的答案很少外,这是一个很好的方法。

如果您可以同时控制服务器和客户端,我想提供另一种通过UDP测量RTT的方法。基本流程如下:

  1. 从客户端向服务器发送带有时间戳C1的UDP数据包P1
  2. 服务器在收到P1时将当前时间戳S1放入数据包。
  3. 服务器端处理
  4. 服务器将当前时间戳S2放入数据包,然后再将其发送回客户端。
  5. 客户端在收到P1时将当前时间戳C2放入数据包。
  6. 之后,我们可以计算出RTT =(C2-C1) - (S2-S1)。

    ICMP ping可能不准确,在客户端和服务器端都需要额外控制,但它是可管理的。

答案 6 :(得分:0)

虽然ping是衡量延迟的良好开端,但它使用的是ICMP协议而不是UDP。不同protol的数据包通常在路由器等方面具有不同的优先级。

您可以使用netperf来测量UDP往返时间: http://www.netperf.org/netperf/training/Netperf.html#0.2.2Z141Z1.SUJSTF.9R2DBD.T