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

问题描述 投票:2回答:7

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

我想听听你的想法。

java networking udp client-server
7个回答
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统计信息-

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

rtt最小/平均/最大/ mdev = 2.566 / 4.921 / 8.411 / 2.035 ms

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


1
投票

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

为了使事情变得平淡无奇,您总是可以来回发送几个数据包并平均超时。


1
投票

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

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

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

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


0
投票

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

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

  1. 从客户端到服务器发送带有时间戳C1的UDP数据包P1
  2. 服务器在接收到P1时将当前时间戳S1放入数据包中。
  3. 服务器端处理
  4. 服务器将当前时间戳S2放入数据包,然后再将其发送回客户端。
  5. 客户端在收到P1时将当前时间戳C2放入数据包中。

之后,我们可以计算RTT =(C2-C1)-(S2-S1)。

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


0
投票

尽管ping是衡量延迟的一个很好的开始,但它使用的是ICMP协议而不是UDP。 不同协议的数据包通常在路由器等上具有不同的优先级。

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


0
投票

如果您可以发送ICMP程序包,那就太好了-我猜,因为它们是由网络层直接答复的,所以您的答复不会在服务器上的用户模式下浪费时间。

但是,似乎无法用Java发送ICMP软件包。 你可以:

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

这将发送ICMP程序包,但这不是您想要的。

但是,如果您以更高的优先级在服务器端启动响应方守护进程,则会降低服务器负载的影响。

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


0
投票

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

测量箱子在典型负载下的时间很重要,因为这将告诉您通常可以预期的RTT。

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

© www.soinside.com 2019 - 2024. All rights reserved.