4

我正在构建一个以太网应用程序,我将从一侧发送数据包并在另一侧接收它。我想在接收方计算数据包的延迟,如 RFC 3393 中所示。所以我必须在发送方的数据包中放置一个时间戳,然后在收到数据包后立即在接收方获取时间戳。减去这些值,我将得到时间戳的差异,然后用随后的差异减去这个值,我将得到一种方式 ipdv 延迟。两个时钟都不同步。 因此,非常感谢任何帮助。谢谢你。

4

1 回答 1

3

RFC 3393 用于测量数据包延迟的变化,而不是用于测量延迟本身。

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

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

采取另一个极端:大多数时候,数据在 20 毫秒内到达。除了有时,当它需要 5000 毫秒时。如果您没有保留缓冲区并且第 1 到第 50 帧的延迟为 20 毫秒,那么您可以毫无问题地播放前 50 帧。然后第 51 帧需要 5000 毫秒才能到达,而您在 5000 毫秒内没有任何视频数据。用户去另一个网站访问他们可爱的猫视频。你真正需要的是一个 5000 毫秒数据的缓冲区——那么你就可以了。

长示例,短点:您对数据包的绝对延迟不感兴趣,您对该延迟的差异感兴趣- 这就是您的缓冲区必须有多大。

要测量绝对延迟,您必须使两台机器上的时钟同步。机器 A 将发送一个时间戳为 12337849227 28的数据包,当该数据包在时间 12337849227 48到达机器 B 时,您会知道数据包花了 20 毫秒才到达那里。

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

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

如上所述,我们不关心绝对延迟是多少——所以我们甚至不关心它是负数,还是三个小时,或者其他什么。我们关心的是延迟量变化 20ms。所以你需要一个 20ms 的数据缓冲区。

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

于 2009-02-04T22:14:43.740 回答