为啥 RTP 使用 UDP 而不是 TCP?
Posted
技术标签:
【中文标题】为啥 RTP 使用 UDP 而不是 TCP?【英文标题】:Why Does RTP use UDP instead of TCP?为什么 RTP 使用 UDP 而不是 TCP? 【发布时间】:2010-09-26 14:11:57 【问题描述】:我想知道为什么在 RTP 中使用 UDP 而不是 TCP?主要的 VoIP 工具只使用 UDP,因为我入侵了一些 VoIP OSS。
【问题讨论】:
为什么在RTP中使用UDP而不在TCP中?听起来像一个错误的问题。 -> 为什么RTP使用UDP而不是TCP? “我想知道为什么在 RTP 中使用 UDP 但为什么不使用 TCP?”怎么样?这可能更接近您的意思? 【参考方案1】:实时传输协议是一种网络协议,用于通过 Internet 传输流式音频和视频媒体,从而支持 Internet 协议语音 (VoIP)。
RTP 通常与信令协议(例如 SIP)一起使用,该协议在网络上建立连接。 RTP 应用程序可以使用传输控制协议 (TCP),但大多数使用用户数据报协议 (UDP),因为 UDP 允许更快地传输数据。
【讨论】:
【参考方案2】:技术上 RTP 数据包可以通过 TCP 连接交错。这里给出了很多很好的答案。两个额外的小点:
RFC 4588 描述了如何将重传与 RTP 数据一起使用。大多数接收 RTP 流的客户端都使用缓冲区来解决网络中的抖动,该抖动通常为 1-5 秒,这意味着有时间进行重新传输以接收所需的数据。
RTP 流量可以通过 TCP 连接交错。实际上,当这样做时,交错 RTP(即通过 TCP)和通过 UDP 发送的 RTP 之间的区别在于,这两者在用户可用带宽不足的有损网络上如何执行。交错的 TCP 流最终会变得不稳定,因为播放器不断地在缓冲状态等待数据包到达。根据玩家的不同,它可能会向前跳跃追赶。通过 RTP 连接,您会在视频中看到伪影(拖尾/撕裂)。
【讨论】:
+1 表示 RTP 能够通过 TCP 运行。此外,基于 TCP 的 RTP 可能会引入帧问题。例如,RFC 4103 没有定义自己的帧,因此如果您尝试通过 TCP 运行它,您需要定义自己的自己的帧协议。【参考方案3】:我想快速补充一下 Matt H 在回应 Stobor 的回答时所说的话。 Matt H 提到 RTP over UDP 数据包可以进行校验和,因此如果它们被损坏,它们将被重新发送。这实际上是大多数 PBX 的可选功能。例如,在 Asterisk 中,您可以使用以下行在 rtp.conf 配置文件中启用/禁用 RTP over UDP 流量的校验和:
rtpchecksums=yes ; or no if you prefer
干杯!
【讨论】:
【参考方案4】:只是一句话: 在 RTP 流中发送的每个数据包都被赋予比其前任高一号的数字。这允许目标确定是否有任何数据包丢失。 如果一个数据包丢失,目的地采取的最佳行动是通过插值来近似丢失的值。 重传不是一个实用的选项,因为重传的数据包太迟而无法使用。
【讨论】:
【参考方案5】:其他的都是正确的,但是并没有真正告诉你真正的原因。 Saua 有点暗示,但这里有一个更完整的答案。
音频和视频是实时的。如果您正在听收音机或看电视,并且信号被中断,它不会从您中断的地方继续......您只是在“观察”信号流,如果您无法观察在任何给定的时间,你都会失去它。
原因很简单。延迟。 VOIP 非常努力地尽量减少从某人说话到一端的延迟量,然后你得到它,然后你的回应。否则,随着错误的发生,从人说话到接收到信号之间的延迟量会不断增加,直到它变得无用。
请记住,重传的每个延迟都必须重放,这会导致进一步的数据延迟,然后另一个错误会导致更大的延迟。唯一可行的解决方案是简单地删除任何无法实时显示的数据。
重传延迟 1 秒意味着从我说某事到你听到它现在是 1 秒。 1 秒延迟现在意味着从我说某事到你听到它的时间为 2 秒。这是累积的,因为数据以与说话时相同的速率播放,依此类推...
RTP 可能是面向连接的,但无论如何它必须丢弃(或跳过)数据以跟上重传错误,那么为什么还要为额外的开销烦恼呢?
【讨论】:
【参考方案6】:除了所有其他不错且正确的答案之外,this article 很好地理解了 TCP 和 UDP 之间的区别。
【讨论】:
感谢 mlarsen。喜欢这个链接。:) 链接失效。现在这个答案根本没有用。 文章现在可以在这里找到:gafferongames.com/networking-for-game-programmers/udp-vs-tcp【参考方案7】:已经给出了很多好的答案,但我想明确指出一件事:
基本上,一个完整的数据流对于实时音频/视频来说是一件好事,但它并不是绝对必要的(正如其他人指出的那样):
重要的事实是,一些来得太晚的数据毫无价值。应该在一秒钟前显示的帧丢失数据有什么用?
如果您要使用 TCP(这也保证所有数据的正确顺序),那么在正确传输旧数据之前,您将无法获得更新的数据。这是双重糟糕的:您必须等待旧数据的重新传输和新数据(现在已延迟)可能同样一文不值。
因此,RTP 会进行某种尽力传输,因为它会尝试及时传输所有可用数据,但不会尝试重新传输在传输期间丢失/损坏的数据 (*)。它只是继续生活,并希望更重要的当前数据正确到达那里。
(*) 其实我不知道 RTP 的细节。也许它确实会尝试重新传输,但如果确实如此,那么它就不会像 TCP 那样激进(它永远不会接受任何丢失的数据)。
【讨论】:
TCP 永远不会接受任何丢失的数据?...您是否曾经欺骗过 TCP 数据包或使用覆盖率较差的 WiFi? @Jay:我的意思是如果数据包 1 被丢弃在某个地方并且数据包 2 通过,那么用户应用程序将永远不会看到数据包 2 中的数据,直到数据包 1 成功重新传输。这实际上就是为什么 TCP 连接不佳会如此痛苦的部分原因。【参考方案8】:UDP 用于发送数据、不需要在目标上准确接收或不需要稳定连接的地方。
如果需要精确接收数据,则使用 TCP,逐位,不丢失位。
对于视频和声音流媒体,途中丢失的某些位不会以某种方式影响结果,也就是说,流图片中的某些像素失败,不会影响用户,在 DVD 上丢失比特率更高。
【讨论】:
【参考方案9】:正如 DJ 所指出的,TCP 是为了获得可靠的数据流,并会减慢传输速度,并重新传输损坏的数据包,以实现这一目标。
UDP 不关心通信的可靠性,不会减慢或重传数据。
如果您的应用程序需要可靠的数据流,例如从网络服务器检索文件,则选择 TCP。
如果您的应用程序不关心损坏或丢失的数据包,并且您不需要产生额外的开销来提供额外的可靠性,那么您可以选择 UDP。
可靠的数据包传输并没有显着改善 VOIP,事实上,在某些情况下,TCP 中的重传和指数退避等事情实际上会损害 VOIP 质量。因此,UDP 是更好的选择。
【讨论】:
我想指出,UDP 确实提供了数据包的校验和。因此,如果您收到一条 UDP 消息,它就是发送的内容。但如果它很糟糕,那么它就会被丢弃,您的应用程序将看不到它。 TCP 会要求另一端重传。在某些情况下,TCP 并不总是最有效的(例如,将同一个文件传输到多个目的地),因此一些应用程序级协议是建立在 UDP 之上的。 如果您的网络不能保证传送或传输的顺序,UDP 是更好的选择。这种优势必须通过抖动缓冲来补偿,以重新排序数据包,有时还要对它们进行插值。【参考方案10】:RTP 对丢包相当不敏感,因此不需要 TCP 的可靠性。
UDP 的头部开销更少,因此一个数据包可以承载更多数据,从而更有效地利用网络带宽。
UDP 也提供快速的数据传输。
所以在这种情况下,UDP 是显而易见的选择。
【讨论】:
【参考方案11】:UDP 通常用于不需要严格排序的各种类型的实时流量。这是因为 TCP 在将数据传递给应用程序之前强制执行排序(默认情况下,您可以通过设置 URG 指针来解决此问题,但似乎没有人这样做过),并且在您需要的环境中,这可能是非常不可取的与其可靠地获取旧数据,不如获取当前的实时数据。
【讨论】:
以上是关于为啥 RTP 使用 UDP 而不是 TCP?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 traceroute 发送 UDP 数据包而不是 ICMP 数据包?
如何指定VLC的RTSP拉流方式(RTP over UDP/TCP)