35

我想知道为什么在 RTP 中使用 UDP 而不是 TCP?主要的 VoIP 工具仅使用 UDP,因为我入侵了一些 VoIP OSS。

4

11 回答 11

61

正如 DJ 所指出的,TCP 是为了获得可靠的数据流,并会减慢传输速度,并重新传输损坏的数据包,以实现这一目标。

UDP不关心通信的可靠性,不会减慢或重传数据。

如果您的应用程序需要可靠的数据流,例如,从网络服务器检索文件,您可以选择 TCP。

如果您的应用程序不关心损坏或丢失的数据包,并且您不需要产生额外的开销来提供额外的可靠性,那么您可以选择 UDP。

可靠的数据包传输并没有显着改善 VOIP,事实上,在某些情况下,TCP 中的重传和指数退避等事情实际上会损害 VOIP 的质量。因此,UDP 是一个更好的选择。

于 2008-12-12T05:58:56.843 回答
20

已经给出了很多好的答案,但我想明确指出一件事:

基本上,一个完整的数据流对于实时音频/视频来说是一件好事,但它并不是绝对必要的(正如其他人指出的那样):

重要的事实是,一些来得太晚的数据毫无价值。应该在一秒钟前显示的帧的缺失数据有什么用?

如果您要使用 TCP(这也保证所有数据的正确顺序),那么在正确传输旧数据之前,您将无法获得更新的数据。这是双重糟糕的:您必须等待旧数据的重新传输,新数据(现在已延迟)可能同样一文不值。

因此,RTP 会进行某种尽力传输,因为它会尝试及时传输所有可用数据,但不会尝试重新传输在传输期间丢失/损坏的数据 (*)。它只是继续生活,并希望更重要的当前数据正确到达那里。

(*) 实际上我不知道 RTP 的细节。也许它确实会尝试重新传输,但如果确实如此,那么它就不会像 TCP 那样激进(它永远不会接受任何丢失的数据)。

于 2008-12-13T01:42:18.533 回答
14

其他的都是正确的,但是并没有真正告诉你真正的原因。Saua 有点暗示,但这里有一个更完整的答案。

音频和视频是实时的。如果您正在听收音机或看电视,并且信号被中断,它不会从您中断的地方继续......您只是在“观察”信号流时,如果您无法观察它在任何给定的时间,你失去它。

原因,很简单。延迟。VOIP 非常努力地尽量减少从某人说话到一端的延迟量,然后你得到它,然后你的回应。否则,随着错误的发生,从人说话到接收到信号之间的延迟量会不断增加,直到它变得无用。

请记住,重传的每个延迟都必须重放,这会导致进一步的数据延迟,然后另一个错误会导致更大的延迟。唯一可行的解​​决方案是简单地删除任何无法实时显示的数据。

重传延迟 1 秒意味着从我说某事到你听到它现在是 1 秒。1 秒延迟现在意味着从我说某事到你听到它的时间为 2 秒。这是累积的,因为数据以与说话时相同的速率播放,依此类推……

RTP 可能是面向连接的,但是无论如何它都必须丢弃(或跳过)数据以跟上重传错误,那么为什么还要为额外的开销而烦恼呢?

于 2009-02-19T00:42:24.423 回答
5

从技术上讲,RTP 数据包可以通过 TCP 连接交错。这里有很多很好的答案。两个额外的小点:

RFC 4588 描述了如何将重传与 RTP 数据一起使用。大多数接收 RTP 流的客户端使用缓冲区来解决网络中的抖动,该抖动通常为 1-5 秒长,这意味着有时间可用于重新传输以接收所需数据。

RTP 流量可以通过 TCP 连接交错。实际上,当这样做时,Interleaved RTP(即通过 TCP)和通过 UDP 发送的 RTP 之间的区别在于这两者在用户可用带宽不足的有损网络上如何执行。交错的 TCP 流最终会变得不稳定,因为播放器不断地在缓冲状态等待数据包到达。根据玩家的不同,它可能会向前跳跃追赶。通过 RTP 连接,您将在视频中看到伪影(拖尾/撕裂)。

于 2010-03-20T03:46:38.730 回答
3

UDP 通常用于不需要严格排序的各种类型的实时流量。这是因为 TCP 在将数据传递给应用程序之前强制执行排序(默认情况下,您可以通过设置 URG 指针来解决此问题,但似乎没有人这样做),并且在您需要的环境中,这可能是非常不可取的而不是可靠地获取旧数据,而不是获取当前的实时数据。

于 2008-12-12T05:14:14.437 回答
2

RTP 对丢包相当不敏感,因此它不需要 TCP 的可靠性。

UDP 的头部开销较少,因此一个数据包可以携带更多数据,因此可以更有效地利用网络带宽。

UDP 也提供快速的数据传输。

因此,在这种情况下,UDP 是显而易见的选择。

于 2008-12-12T05:16:22.043 回答
1

除了所有其他不错且正确的答案外,本文还很好地理解了 TCP 和 UDP 之间的区别。

于 2009-01-07T13:27:30.870 回答
1

实时传输协议是一种网络协议,用于通过 Internet 传输流式音频和视频媒体,从而启用 Internet 协议语音 (VoIP)。

RTP 通常与信令协议(例如 SIP)一起使用,该协议在网络上建立连接。RTP 应用程序可以使用传输控制协议 (TCP),但大多数使用用户数据报协议 (UDP),因为 UDP 允许更快地传输数据。

于 2019-05-23T13:24:55.497 回答
0

UDP 用于发送数据的任何地方,不需要在目标上准确接收的地方,或者不需要稳定连接的地方。

如果需要准确地接收数据,则使用 TCP,逐位,不丢失位。

对于视频和声音流媒体,在途中丢​​失的一些比特不会以某种方式影响结果,也就是说,流的图片中的一些像素失败,不会影响用户,在 DVD 上丢失的比特率是更高。

于 2008-12-12T06:10:31.607 回答
0

只是一个注释:在 RTP 流中发送的每个数据包都被赋予比其前任高一号的数字。这允许目标确定是否有任何数据包丢失。如果一个数据包丢失,目的地采取的最佳行动是通过插值来近似丢失的值。重传不是一个实用的选项,因为重传的数据包太迟而无法使用。

于 2009-05-11T12:52:20.113 回答
0

我想快速补充一下马特 H 在回应斯托博尔的回答时所说的话。Matt H 提到 RTP over UDP 数据包可以进行校验和,因此如果它们被损坏,它们将被重新发送。这实际上是大多数 PBX 的可选功能。例如,在 Asterisk 中,您可以使用以下行在 rtp.conf 配置文件中启用/禁用 RTP over UDP 流量的校验和:

rtpchecksums=yes ; or no if you prefer

干杯!

于 2009-12-15T22:22:58.233 回答