ping实现如何计算往返时间?

时间:2016-05-02 07:06:18

标签: c linux ping

我正在学习ping实现。

因为我有一个疑问。令人怀疑的是,他们如何计算往返时间。

他们做了一些计算来计算往返时间。我无法理解这个计算。

以下是往返时间计算的代码。

 tsum += triptime;
 tsum2 += (long long)triptime * (long long)triptime;
 if (triptime < tmin)
      tmin = triptime;
 if (triptime > tmax)
      tmax = triptime;
 if (!rtt)
      rtt = triptime*8;
 else
      rtt += triptime-rtt/8;

tsum,tsum2,triptime,tmax变量最初为0。 tmin最初包含值2147483647。 跳闸时间由数据包发送之前计算,记录一次。在目的地,收到数据包,在发送重播之前,它会记录一次并填写回复数据包并发送回复。 减去两次并将减去的时间转换为微秒。 triptime变量包含微秒。

例如,使用以下输出计算rtt。

第一个数据包的跳闸时间是42573,第二个数据包43707,第三个数据包48047和第四个数据包42559。

使用它们如何计算往返时间。为什么他们在开始时乘以8,然后用8除以第一rt减去。我无法找到为什么他们这样计算rtt。 任何人都可以解释一下为什么他们在开始时乘以8,之后为什么他们除以8并用之前计算的rtt减去。 以下链接包含ping实现的完整代码。

ping_common.c

ping.c

提前致谢。

3 个答案:

答案 0 :(得分:0)

rtt Modified Moving Average triptime个值enter image description here,乘以N==8,便于计算。

答案 1 :(得分:0)

程序变量名中的

rtt在输出中不一定是 rtt - 而这里不是。

您显示的实施中的“平均往返延迟”是tsum /数据包数。当你看rtt时,你实际上在寻找不同的东西。只有在自适应模式下使用ping时才会显示。

答案 2 :(得分:-1)

因为你正在处理比特。比特率和传输时间不是一回事,所以你需要做一点点算术来转换。公式是:

  

数据包传输时间=数据包大小/比特率

假设100 Mbit / s和数据包大小为1526字节,您得到:

  

1526字节x 8位/(100 x 10 6 位/秒))= 116微秒

位单元取消,你剩下几秒钟。

现在是另一个例子。假设您的往返时间为225毫秒,吞吐量为32千字节。你得到:

  

32,000字节* 8位/0.255 =每秒1,003,921位