【问题标题】:how the ping implementation calculating the round trip time?ping 实现如何计算往返时间?
【发布时间】:2016-08-26 21:13:16
【问题描述】:

我正在学习 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 相除并与第一个 rtt 相减。我无法找到他们为什么这样计算 rtt。 谁能解释一下为什么它们在开始时与 8 相乘,然后为什么它们与 8 相除并与之前计算的 rtt 相减。 以下链接包含 ping 实现的完整代码。

ping_common.c

ping.c

提前致谢。

【问题讨论】:

  • 我想这是一种对 la 累计 8 个值进行平均的方法。第一个数据包是平均累加器的初始化(triptime*8)。之后,仅将上次计算的平均值的变化(差异)添加到累加器中。
  • BTW 像往常一样的 linux mudules:无耻地缺乏 cmets,每次都是无处不在...

标签: c linux ping


【解决方案1】:

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

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

所以假设 100 Mbit/s 和 1526 字节的数据包大小,你会得到:

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

位单位取消,您只剩下几秒钟。

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

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

【讨论】:

  • ping 不关心传输速率。
  • 传输速率我没有问。请再次阅读问题。
【解决方案2】:

rtt 是 Modified Moving Average 的 triptime 值,乘以 8 以便于计算,与 N==8。

【讨论】:

  • 公式类似于RTT_new = RTT_old*7/8 + triptime*1/8。代码中的 rtt 是 RTT_new*8 以节省一个部门。也请看RFC6298。
  • 为什么它们乘以 8 而为什么不是 16 或任何其他数字?
  • 这里的8有什么用?
  • @suresh 它是一个任意数字。您应该将其视为一组样本。在这种情况下,它是一个包含 8 个样本的数组。
  • 这里不像样本数组。我可以发送 n 个数据包。所以我可以发送超过 8 个数据包或少于 8 个数据包。那么,为什么他们硬编码 8。
【解决方案3】:

rtt 在程序变量名中不一定是 rtt 在输出 - 而这里不是。

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

【讨论】:

  • 在ping统计中,有一个字段叫rtt。在上面的代码中,他们计算 rtt。我需要知道计算 rtt 的公式是什么?
  • 我刚刚告诉过你,标记为“rtt”的 ping 统计信息的输出与变量“rtt”不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多