我想知道为什么RTP中使用UDP而不是TCP?大多数VoIP工具只使用UDP,因为我已经黑掉了一些VoIP OSS。
我想知道为什么RTP中使用UDP而不是TCP?大多数VoIP工具只使用UDP,因为我已经黑掉了一些VoIP OSS。
正如DJ所指出的那样,TCP是关于获取可靠的数据流,并且会减慢传输速度,并重新传输损坏的数据包,以实现这一目的。
UDP不在意通信的可靠性,不会减慢或重新传输数据。
如果你的应用程序需要可靠的数据流,例如从Web服务器检索文件,你选择TCP。
如果您的应用程序不关心损坏或丢失的数据包,并且不需要承担提供额外可靠性的额外开销,您可以选择UDP。
VOIP并不会因为可靠的数据包传输而显着提高,事实上,在某些情况下,TCP中的重传和指数退避等功能可能会影响VOIP的质量。因此,UDP是一个更好的选择。
已经有很多好的答案了,但我想明确指出一件事:
基本上,即使实时音频/视频需要完整的数据流,但这并不是必需的(正如其他人所指出的):
重要的事实是,一些迟到的数据是毫无价值的。对于一个应该在一秒钟前显示的帧而言,缺失的数据有什么用呢?
如果你使用TCP(它也保证所有数据的正确顺序),那么在旧数据被正确传输之前将无法获取更及时的数据。这是双倍的坏处:你必须等待旧数据的重传 和 新数据(现在已经延迟)可能仍然毫无价值。
因此,RTP采用了某种尽力而为的传输方式,它试图按时转移所有可用数据,但不会尝试重传在传输过程中丢失/损坏的数据 (*)。它只是继续运行,并希望更重要的当前数据能够正确地到达。
(*)实际上我不知道RTP的具体情况。也许它确实会尝试重传,但如果确实这样做,它不会像TCP那样(永远不接受任何丢失的数据)那样积极。
UDP经常用于各种类型的实时流量,不需要严格排序即可有用。这是因为TCP在将数据传递给应用程序之前强制执行排序(默认情况下,您可以通过设置URG指针来绕过此限制,但似乎没有人会这样做),这在环境中可能非常不希望获取旧数据并确保其可靠性,而是更愿意获取当前的实时数据。
RTP对数据包丢失不太敏感,因此不需要TCP的可靠性。
UDP的头部开销较小,因此一个数据包可以携带更多的数据,从而更有效地利用网络带宽。
UDP还提供快速的数据传输。
因此,在这种情况下,UDP是显而易见的选择。
实时传输协议是一种网络协议,用于通过互联网传递流媒体音频和视频,从而实现网络语音通信(VoIP)。
RTP通常与信令协议(例如SIP)一起使用,以建立网络连接。RTP应用程序可以使用传输控制协议(TCP),但大多数使用用户数据报协议(UDP),因为UDP允许更快的数据传递。
rtpchecksums=yes ; or no if you prefer
干杯!
UDP 被用于发送数据不需要在目标上精确接收,或者不需要稳定的连接的情况下。
TCP 用于数据需要精确地按位接收,没有任何比特丢失的情况。
对于视频和声音流,一些在传输过程中丢失的位不会以明显的方式影响结果,例如在流画面中某些像素失效,这并不会影响用户。在 DVD 上,比特率的丢失可能会更高。