我正在学习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,tmaxvariables最初为0. tmin最初包含的值为2147483647。 这个三元组是通过发送数据包之前计算出来的。 在目的地,数据包被接收,在它发送重放之前,它注意到一次,它填充了回复数据包,并发送回复。 两次被扣除,并将扣除的时间转换成微秒。 triptimevariables包含微秒。
例如,用下面的输出来计算rtt。
第一个分组的行程时间是42573,第二个分组43707,第三个分组48047和第四个分组42559。
用他们如何计算往返时间。 为什么它们和8乘以8和8之后用第一个rtt减去。 我无法find他们为什么计算这样的rtt。 可以有谁解释我为什么用8乘以8和8之后为什么用8除以前计算的rtt。 下面的链接包含了ping实现的完整代码。
ping_common.c
ping.c
提前致谢。
rtt
是修正移动平均 triptime
值,乘以8为了便于计算, N==8
。
rtt
中的程序变量名不一定是rtt中的输出 – 而这里不是。
你显示的实现中的“平均往返延迟”是在数据包的tsum
/ count中。 当你看rtt
,你实际上是在寻找不同的东西。 只有在自适应模式下使用ping
时才会显示。
因为你在处理位。 比特率和传输时间是不一样的,所以你需要做一点点算术转换。 公式是:
分组传输时间=分组大小/比特率
假设100Mbit / s和1526字节的数据包大小,你会得到:
1526字节×8位/(100×10 6位/秒))= 116微秒
位单元取消,你剩下几秒钟。
现在又是一个例子。 假设您的往返时间为225毫秒,吞吐量为32千字节。 你得到:
32,000字节* 8位/ 0.255 = 1,003,921位/秒