如何在C中实现RFC 3393(Ipdv数据包延迟变化)?

时间:2009-02-04 05:41:38

标签: c++ c networking rfc ip-protocol

我正在构建一个以太网应用程序,我将从一侧发送数据包并在另一端接收数据包。我想像在RFC 3393中那样计算接收端的数据包延迟。所以我必须在发送方将数据包中的时间戳添加到接收方,然后在收到数据包时立即在接收方侧获取时间戳。减去值i将获得时间戳的差异,然后减去此值与后续差异我将获得单向ipdv延迟。 两个时钟都不同步。 所以任何帮助都非常感谢。 谢谢。

1 个答案:

答案 0 :(得分:3)

RFC 3393用于测量数据包延迟中的方差,而不是用于测量延迟本身。

举个例子:你正在编写一个视频流应用程序。您希望缓冲尽可能少的视频数据(以便视频尽快开始播放)。假设数据始终总是总是从机器A到机器B需要20ms。在这种情况下(假设机器A能够以所需的速度发送视频数据),你就不要根本不需要任何缓冲区。一旦你收到第一帧,你就可以开始玩,安全地知道,当需要下一帧时,它就会到达(因为数据总是需要20ms到达而机器A至少发送当你在玩的时候很快。

无论20ms多长,这都有效,只要它总是相同的。它可能是1000毫秒 - 第一帧需要1000毫秒到达,但你仍然可以在它到达时立即开始播放,因为下一帧也将花费1000毫秒并被发送到第一帧后面 - 换句话说,它已经在它的方式,并将暂时在这里。显然现实世界不是这样的。

采取另一种极端:大部分时间,数据到达20ms。除非有时需要5000毫秒。如果没有缓冲区并且帧1到50的延迟是20ms,那么你可以毫无问题地播放前50帧。然后第51帧需要5000毫秒才能到达,而你在5000毫秒内没有任何视频数据。用户前往另一个网站浏览他们可爱的猫咪视频。你真正需要的是5000毫秒数据的缓冲 - 然后你就没事了。

很长的例子,短点:你对数据包的绝对延迟不感兴趣,你对那个延迟中的方差感兴趣 - 那就是你的缓冲区有多大。

要测量绝对延迟,您必须同步两台机器上的时钟。机器A将发送时间戳为12337849227 28 的数据包,当它在12337849227 48 时到达机器B时,您知道数据包已经花了20ms到达那里。 / p>

但是,由于您对 variance 感兴趣,您需要(如RFC 3393所述)来自机器A的几个数据包。机器A发送时间戳为1233784922 72 的数据包1 8,然后10ms后发送时间戳为1233784922 73 8的数据包2,然后10ms后发送时间戳为1233784922 74 8的数据包3。

机器B以其认为的时间戳1233784922 12 接收数据包1.机器A和机器B之间的单向延迟在这种情况下(从机器B的角度来看)为-600ms。这显然是完全垃圾,但我们并不在意。机器B以其认为时间戳1233784922 15 8接收数据包2.单向延迟为-580ms。机器B按其认为的时间戳1233784922 16 接收数据包3.单向延迟再次为-580ms。

如上所述,我们并不关心绝对延迟是什么 - 因此我们甚至不关心它是否为负,或三小时,或其他什么。我们关心的是延迟量变化了20ms。所以你需要一个20ms数据的缓冲区。

请注意,我完全掩盖了时钟漂移的问题(也就是说,机器A和B上的时钟以略微不同的速率运行,因此例如机器A的时间以每个1.00001秒的速率前进第二个实际通过)。虽然这确实在测量中引入了不准确性,但其实际效果在大多数应用中不太可能成为问题。