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