测试的目的是检查两个主机(客户端和服务器)之间的网络响应时间的形状。网络响应 = 发送数据包并接收回数据包所需的往返时间。我正在使用 UDP 协议。我如何计算响应时间?我可以减去 TimeOfClientRequest - TimeOfClientResponseRecieved。但我不确定这是否是最好的方法。我不能仅从代码内部执行此操作,并且我认为操作系统和计算机负载可能会干扰客户端启动的测量过程。顺便说一句,我正在使用Java。
我想听听你的想法。
测试的目的是检查两个主机(客户端和服务器)之间的网络响应时间的形状。网络响应 = 发送数据包并接收回数据包所需的往返时间。我正在使用 UDP 协议。我如何计算响应时间?我可以减去 TimeOfClientRequest - TimeOfClientResponseRecieved。但我不确定这是否是最好的方法。我不能仅从代码内部执行此操作,并且我认为操作系统和计算机负载可能会干扰客户端启动的测量过程。顺便说一句,我正在使用Java。
我想听听你的想法。
只需使用 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 统计 ---
发送 10 个数据包,接收 10 个数据包,0% 丢包,时间 9004ms
rtt 最小值/平均值/最大值/mdev = 2.566/4.921/8.411/2.035 毫秒
以 rtt (往返时间)开头的最后一行是您可能正在寻找的信息。
我认为你提到的方法很好。操作系统和计算机负载可能会干扰,但与通过网络发送数据包所需的时间相比,它们的影响可能可以忽略不计。
为了使事情变得更均匀,您总是可以来回发送几个数据包并平均超时。
如果您可以访问代码,那么可以,只需测量发送请求和收到答案之间的时间。请记住,Java 中的标准计时器只有毫秒分辨率。
或者,使用 Wireshark 捕获网络上的数据包 - 该软件还记录数据包的时间戳。
显然,在这两种情况下,测量的时间取决于另一端对您的原始请求的响应速度。
如果您真的只想测量网络延迟并自己控制远端,请使用echo 7/udp
许多 UNIX 服务器仍然支持的服务(尽管它通常被禁用以防止其在反射 DDoS 攻击中的使用)。
如果您可以发送 ICMP 包会很好 - 我想,因为它们直接由网络层回答,您的回答不会在服务器上的用户模式下浪费时间。
然而,在 java 中发送 ICMP 包似乎是不可能的。你可以:
boolean status = InetAddress.getByName(host).isReachable(timeOut)
这将发送一个 ICMP 包,但这不是你想要的。
但是,如果您在具有更高优先级的服务器端启动响应程序守护程序,您将减少服务器负载的影响。
实际上,服务器负载不会起作用,只要它低于 100% CPU。
首先使用 ping,但您可以通过发送数据包并让另一端发回数据包来测量 RTT。
测量盒子何时处于典型负载下很重要,因为这会告诉您通常可以获得的 RTT。
您可以对许多数据包、数百万甚至数十亿数据包的延迟进行平均,以获得一致的值。
除了提到使用 ICMP ping 测量 RTT 时间的几个答案是一个好方法。
如果您可以同时控制服务器和客户端,我想提供另一种通过 UDP 测量 RTT 的方法。基本流程如下:
之后,我们可以计算 RTT = (C2-C1) - (S2-S1)。
它可能不像 ICMP ping 那样准确,并且需要在客户端和服务器端进行额外控制,但它是可管理的。
虽然 ping 是测量延迟的良好开端,但它使用的是 ICMP 协议而不是 UDP。不同协议的数据包通常在路由器等上具有不同的优先级。
您可以使用 netperf 测量 UDP 往返时间: http: //www.netperf.org/netperf/training/Netperf.html#0.2.2Z141Z1.SUJSTF.9R2DBD.T