我想知道为什么在RTP而不是TCP中使用UDP?主要的VoIP工具只使用UDP,因为我攻击了一些VoIP操作系统。
答案 0 :(得分:55)
正如DJ所指出的那样,TCP是为了获得可靠的数据流,并且会减慢传输速度,并重新传输损坏的数据包,以实现这一目标。
UDP不关心通信的可靠性,也不会减慢或重新传输数据。
如果您的应用程序需要可靠的数据流,例如,要从Web服务器检索文件,请选择TCP。
如果您的应用程序不关心数据包损坏或丢失,并且您不需要承担额外的开销以提供额外的可靠性,则可以选择UDP。
VOIP没有通过可靠的数据包传输得到显着改善,事实上,在某些情况下,TCP中的事情(如重传和指数退避)实际上会损害VOIP质量。因此,UDP是更好的选择。
答案 1 :(得分:19)
已经给出了很多好的答案,但我想明确指出一件事:
基本上,完整的数据流对于实时音频/视频来说是一件好事,但它并非绝对必要(正如其他人所指出的那样):
重要的事实是,一些到达太晚的数据毫无价值。应该在一秒钟之前显示的帧的丢失数据有什么用呢?
如果您使用TCP(这也保证了所有数据的正确顺序),那么在旧数据正确传输之前,您将无法获得更新的数据。这是非常糟糕的:您必须等待重新传输旧数据和新数据(现在已经延迟)可能同样毫无价值。
因此,RTP会做出某种尽力传输,因为它会尝试及时传输所有可用数据,但不会尝试重新传输在传输过程中丢失/损坏的数据(*)。它只是继续生活,希望更重要的当前数据能够正确地存在。
(*)实际上我不知道RTP的具体细节。也许它确实尝试重新传输,但如果确实如此,它就不会像TCP那样具有攻击性(它不会接受任何丢失的数据)。
答案 2 :(得分:12)
其他人都是正确的,但是并没有真正告诉你真正的原因。 Saua有点暗示,但这是一个更完整的答案。
音频和视频是实时的。如果您正在收听收音机或看电视,并且信号被中断,它就不会从您离开的地方开始......您只是“观察”信号流,如果您无法观察它在任何时候都会失去它。
原因很简单。延迟。 VOIP非常努力地减少从某人说到一端并且你得到它的时候的延迟量,以及你的回复。否则,当发生错误时,该人发言和收到信号之间的延迟时间将持续增长,直至无效为止。
请记住,必须重播每次重传的延迟,这会导致更多的数据被延迟,然后另一个错误会导致更大的延迟。唯一可行的解决方案是简单地删除任何无法实时显示的数据。
从重传开始延迟1秒意味着从我说的话开始,直到你听到它为止,它现在是1秒。现在,第二个1秒的延迟意味着从我说话之前的2秒钟,直到你听到它为止。这是累积性的,因为数据以与其说话的速率相同的速度播放,等等......
RTP可能是面向连接的,但是它必须丢弃(或跳过)数据才能跟上重传错误,所以为什么还需要额外的开销呢?
答案 3 :(得分:5)
技术上,RTP数据包可以通过TCP连接进行交织。这里有很多很棒的答案。另外两个小问题:
RFC 4588描述了如何使用RTP数据进行重传。大多数接收RTP流的客户端都使用缓冲区来计算网络中的抖动,通常为1-5秒,这意味着有可能有时间重新传输以接收所需的数据。
RTP流量可以通过TCP连接进行交互。实际上,当这样做时,Interleaved RTP(即通过TCP)和通过UDP发送的RTP之间的区别在于这两者如何在可用于用户的带宽不足的有损网络上执行。当播放器持续等待缓冲状态以使数据包到达时,Interleaved TCP流将最终变得不稳定。根据玩家的不同,它可能会向前追赶。使用RTP连接,您将在视频中获得伪影(涂抹/撕裂)。
答案 4 :(得分:3)
UDP通常用于各种类型的实时流量,不需要严格的排序才有用。这是因为TCP在将数据传递给应用程序之前强制执行排序(默认情况下,您可以通过设置URG指针来解决这个问题,但似乎没有人这样做)并且这在您所处的环境中非常不受欢迎而是获得当前的实时数据而不是可靠地获取旧数据。
答案 5 :(得分:2)
RTP对数据包丢失相当不敏感,因此不需要TCP的可靠性。
UDP对报头的开销较小,因此一个数据包可以承载更多数据,因此可以更有效地利用网络带宽。
UDP也提供快速数据传输。
因此在这种情况下,UDP是显而易见的选择。
答案 6 :(得分:1)
除了所有其他好的和正确的答案this article之外,我们对TCP和UDP之间的差异有了很好的理解。
答案 7 :(得分:0)
UDP用于发送数据的任何地方,无需在目标上准确接收,或者不需要稳定连接。
如果需要精确接收数据,逐位,不丢失位,则使用TCP。
对于视频和声音流,在途中丢失的一些比特不会影响结果的方式,这是可以提及的,一些像素在流的图片中失败,没有任何影响用户,在DVD上丢失比特率更高。
答案 8 :(得分:0)
只是一句话: 在RTP流中发送的每个数据包比其前一个数字高一号。这允许thr目的地确定是否有任何数据包丢失。 如果数据包正在进行中,则目标的最佳操作是通过插值来近似丢失的值。 重新发布不是一个推理选项,因为重新传输的数据包太晚而无法使用。
答案 9 :(得分:0)
我想快速补充一下Matt H在回应Stobor答案时说的话。 Matt H提到可以对UDP数据包的RTP进行校验和,这样如果它们被破坏,它们就会被重新发送。这实际上是大多数PBX上的可选功能。例如,在Asterisk中,您可以使用以下行在rtp.conf配置文件中启用/禁用RTP over UDP流量上的校验和:
rtpchecksums=yes ; or no if you prefer
干杯!
答案 10 :(得分:0)
实时传输协议是一种网络协议,用于通过Internet传输流音频和视频媒体,从而启用Internet语音协议(VoIP)。
RTP通常与信令协议(例如SIP)一起使用,该协议在整个网络上建立连接。 RTP应用程序可以使用传输控制协议(TCP),但是大多数应用程序都使用用户数据报协议(UDP),因为UDP可以更快地传输数据。