为什么RTP使用UDP而不是TCP?

37

我想知道为什么RTP中使用UDP而不是TCP?大多数VoIP工具只使用UDP,因为我已经黑掉了一些VoIP OSS。


为什么RTP使用UDP而不是TCP?听起来像是一个错误的问题。 - Oliver Friedrich
“我想知道为什么RTP中使用UDP而不使用TCP,您怎么看?” - Brian Knoblauch
11个回答

64

正如DJ所指出的那样,TCP是关于获取可靠的数据流,并且会减慢传输速度,并重新传输损坏的数据包,以实现这一目的。

UDP不在意通信的可靠性,不会减慢或重新传输数据。

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

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

VOIP并不会因为可靠的数据包传输而显着提高,事实上,在某些情况下,TCP中的重传和指数退避等功能可能会影响VOIP的质量。因此,UDP是一个更好的选择。


6
我要指出的是UDP确实提供了数据包校验和。因此,如果你接收到了一个UDP消息,那就是发送过来的东西。但是,如果它有问题,那么它将被丢弃,你的应用程序看不到它。TCP会要求另一端重新传输。在某些情况下,TCP并不总是最高效的(例如将相同的文件传输到多个目的地),因此一些应用层协议是建立在UDP之上的。 - hookenz
1
如果您的网络不能保证传输顺序或传输时间,则UDP是更好的选择。这个优势必须通过抖动缓冲来补偿,以重新排序数据包并有时进行插值处理。 - Laurent Etiemble
值得注意的是,音频和视频播放系统可以容忍偶尔丢失的数据包,因为有一些技术可以解决这个问题 - 例如重复使用最后一个音频数据包或播放最近几帧的平均值。结果通常是不可察觉的,而且比巨大的延迟或信号中断要好得多。 - VictorEE

22

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

基本上,即使实时音频/视频需要完整的数据流,但这并不是必需的(正如其他人所指出的):

重要的事实是,一些迟到的数据是毫无价值的。对于一个应该在一秒钟前显示的帧而言,缺失的数据有什么用呢?

如果你使用TCP(它也保证所有数据的正确顺序),那么在旧数据被正确传输之前将无法获取更及时的数据。这是双倍的坏处:你必须等待旧数据的重传 新数据(现在已经延迟)可能仍然毫无价值。

因此,RTP采用了某种尽力而为的传输方式,它试图按时转移所有可用数据,但不会尝试重传在传输过程中丢失/损坏的数据 (*)。它只是继续运行,并希望更重要的当前数据能够正确地到达。

(*)实际上我不知道RTP的具体情况。也许它确实会尝试重传,但如果确实这样做,它不会像TCP那样(永远不接受任何丢失的数据)那样积极。


TCP永远不会接受丢失的数据吗?...你有没有欺骗过TCP包或者使用覆盖差的WiFi? - Jay
1
@Jay:我的意思是,如果数据包1在某个地方丢失了,而数据包2通过了,那么用户应用程序将永远看不到来自数据包2的数据,直到数据包1成功重传。这实际上是TCP在质量较差的连接上如此痛苦的一部分原因。 - Joachim Sauer

15
其他人说的都没错,但他们没有真正告诉你其中的真正原因。Saua有点暗示了一下,但我来给你一个更完整的答案。
音频和视频是实时的。如果你在听收音机或看电视,信号中断时不会继续从你离开的地方播放,而只是“观察”流动的信号。如果你不能在任何给定时间观察到它,你就会失去它。
原因很简单,就是延迟。VOIP会尽力将从一个端口说话到另一个端口接收信息所用的时间最小化,以及你的回应时间。否则,随着错误的发生,从人们讲话到信号被接收之间的延迟将不断增加,直到它变得无用。
记住,每次重传产生的延迟必须重新播放,这会导致进一步的数据延迟,然后另一个错误会导致更大的延迟。唯一可行的解决方案是简单地丢弃任何无法实时显示的数据。
从重传引起的1秒延迟意味着从我说话到你听到它现在需要1秒钟。第二个1秒延迟现在意味着从我说话到你听到它需要2秒钟。这是累积的,因为数据以讲话时的相同速率播放。
RTP可以是面向连接的,但那样它仍然需要丢弃(或跳过)数据才能跟上重传错误,那么为什么要费额外的开销呢?

6
从技术上讲,RTP数据包可以通过TCP连接交错传输。这里提供了很多好的答案。另外还有两点需要注意:
RFC 4588描述了如何在RTP数据中使用重传。大多数接收RTP流的客户端都会使用缓冲区来处理网络中的抖动,缓冲区通常为1-5秒,这意味着有时间重新传输以获取所需数据。
可以将RTP流交错传输到TCP连接中。实际上,当进行此操作时,如果用户的网络带宽不足或存在丢包情况,则交错TCP流将变得不稳定,播放器将不断处于缓冲状态等待数据包到达,因此视频表现出卡顿的现象。而使用RTP连接则会出现一些伪像(模糊/撕裂)问题。

1
RTP 能够在 TCP 上运行是一个优点。但是,RTP 在 TCP 上运行可能会引入帧问题。例如,RFC 4103 没有定义自己的帧结构,因此如果您尝试在 TCP 上运行它,您需要定义自己的帧协议。 - Frank Shearar

4

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


3

RTP对数据包丢失不太敏感,因此不需要TCP的可靠性。

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

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

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


2

实时传输协议是一种网络协议,用于通过互联网传递流媒体音频和视频,从而实现网络语音通信(VoIP)。

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


2
除了其他正确的回答之外,这篇文章很好地解释了TCP和UDP之间的区别,特别是在IT技术领域。请注意,此处保留HTML标记。

1
谢谢 mlarsen。喜欢这个链接。:) - Mahesh
链接失效了。现在这个答案一点用处都没有。 - Matt Klein
1
文章现在可以在这里找到:http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/。 - mbelow

1
我想快速补充一下Matt H对Stobor答案的回应。Matt H提到,RTP over UDP数据包可以进行校验和,以便在它们损坏时重新发送。这实际上是大多数PBX上的可选功能。例如,在Asterisk中,您可以在rtp.conf配置文件中启用/禁用RTP over UDP流量的校验和,方法如下:
rtpchecksums=yes ; or no if you prefer

干杯!


1

UDP 被用于发送数据不需要在目标上精确接收,或者不需要稳定的连接的情况下。

TCP 用于数据需要精确地按位接收,没有任何比特丢失的情况。

对于视频和声音流,一些在传输过程中丢失的位不会以明显的方式影响结果,例如在流画面中某些像素失效,这并不会影响用户。在 DVD 上,比特率的丢失可能会更高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接