协议的选择?

3

我正在为一个视频会议应用设计自己的传输协议。我想知道基于连接或无连接的方法对于这个应用程序来说哪种更好。


你的竞争对手使用了什么?大多数视频似乎是UDP数据包,但你应该查看所有竞争协议,以便发明一个更好的协议。 - S.Lott
4个回答

4
我开发了游戏,其中包括被归类为“twitch”游戏的竞速和第一人称射击游戏。对于这种类型的游戏,延迟非常重要。你不能使用TCP,因为它保证按顺序传递数据包,并且在重新发送数据包时会保持接收数据包。
我们针对大多数游戏使用的是我们所谓的Stateful UDP。这实际上意味着我们向消息中添加了一个数据包ID。当我们收到一条消息时,我们检查该ID。如果该ID高于我们迄今为止看到的最高ID,则我们接受并处理该数据包。如果它较低,则我们将其丢弃。这种方法在延迟很重要的情况下运作良好,即使使用UDP,您也会收到大部分数据包,并且大多数数据包都按顺序排列。

1

TCP 的注意事项是(假设采用某种 MPEG 编码),如果由于网络问题导致数据包延迟,视频将会冻结或延迟,直到数据到达。根据 TCP 的定义,视频将无误。

使用 UDP 时,虽然视频将是连续的,但视频中可能会出现错误。对于采用 MPEG 样式协议的情况,其中数据以周期性关键帧和它们之间的增量帧形式发送,如果一个包含增量帧的 UDP 数据包未能到达,则您的视频将变得模糊且通常容易出错,因为连接降级了。如果关键帧丢失,则会出现其他错误,也许根本没有视频。

如果您拍摄的对象在移动,且丢失增量帧会真正破坏图像,则可能需要使用 TCP 以保证获取的视频至少是准确的。但是,如果您拍摄的对象相当静止(如果是用于视频会议,则可能不是这样),则 UDP 可能足够,因为偶尔丢失增量帧可能不会影响整体视频质量。

请注意,如果您真的从头开始自己构建解决方案,则可以添加代码以允许故障,并尝试以特殊方式处理它们(例如,如果帧延迟太多,则超时TCP连接,并相应地通知用户)。

游戏使用UDP,因此路由器将通过网络发送UDP数据包。 - Martin
1
TCP 重传会破坏实时视频。当视频到达时,它可能没有错误,但是网络层的任何错误都会导致 TCP 重传时完全冻结。应用层也必须足够智能,在数据落后时丢弃数据,否则每次重传时两端之间的延迟只会扩大。 - Steve Madsen

1

TCP对于这种应用程序是不合适的。问题出在重传上。如果接收方决定一个数据包丢失或损坏,并请求重新传输,TCP不允许单个数据包被重新传输。从丢失/损坏的数据包开始的每个数据包都将被重新传输。随着网络中不断传输高带宽流的数据包,即使有一点小故障也会导致视频流中不可接受的延迟,而您可能无法从中恢复。

使用UDP作为传输协议,并设计应用层,使其在网络条件恶化时能够优雅地降级。


1

视频和音频流并不简单。你应该看看已经存在的 RTP,了解你试图重新发明什么;-)


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