Networking 协议的选择?

Networking 协议的选择?,networking,network-protocols,Networking,Network Protocols,我正在为视频会议应用程序设计自己的传输协议。我想知道基于连接还是基于无连接的方法更适合此应用程序。使用TCP需要注意的是(假设采用某种MPEG ish编码),如果数据包由于网络问题而延迟,视频将冻结或延迟,直到数据到达。根据TCP的定义,视频将是无错误的 使用UDP,虽然视频将是连续的,但您可以在视频中获得错误。在MPEG风格的协议中,数据以周期性关键帧的形式发送,然后在关键帧之间发送增量帧,如果包含增量帧的UDP数据包无法到达,则随着连接降级,视频将变得阻塞,并且通常容易出错。如果关键帧丢失,

我正在为视频会议应用程序设计自己的传输协议。我想知道基于连接还是基于无连接的方法更适合此应用程序。

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

使用UDP,虽然视频将是连续的,但您可以在视频中获得错误。在MPEG风格的协议中,数据以周期性关键帧的形式发送,然后在关键帧之间发送增量帧,如果包含增量帧的UDP数据包无法到达,则随着连接降级,视频将变得阻塞,并且通常容易出错。如果关键帧丢失,那么您将得到其他错误,可能根本没有视频

如果您将相机指向的对象正在移动,并且删除的增量帧会真正弄乱图像,那么可能需要TCP以确保您获取的视频至少是准确的。但是,如果您指向某个相当固定的对象(如果是视频会议,则可能不是),那么UDP可能就足够了,因为偶尔的增量帧丢失可能不会影响整体视频质量


另外请注意,如果您真的要从头开始推出自己的解决方案,那么您可以添加代码以允许出现小故障,并尝试以特殊方式处理它们(例如,如果帧延迟过大,则超时TCP连接,并相应地通知用户)。

我开发了一些游戏,包括被归类为“twitch”的游戏像赛车和FPS之类的游戏。对于这种类型的游戏,延迟是非常重要的。您不能使用TCP,因为它保证按顺序传递,并在处理重发时保留传入的数据包


我们所做的大部分工作是使用我们称之为有状态UDP的方法。这意味着我们在消息中添加了一个数据包ID。当我们收到一条消息时,我们检查ID。如果ID高于迄今为止我们看到的最高ID,我们接受并处理该数据包。如果再低一点,我们就把它扔了。当延迟很重要时,这种方法可以很好地工作,因为即使使用UDP,您也会收到大部分数据包,并且大部分数据包都是有序的。

TCP不适合这种应用程序。问题在于重传。如果接收方确定数据包丢失或损坏,并请求重新传输,则TCP不允许重新传输单个数据包。上丢失/损坏的数据包中的每个数据包都将重新传输。随着一个恒定的、高带宽的数据包流通过网络,一个小故障将导致视频流中不可接受的延迟,您可能无法从中恢复


使用UDP作为传输,并设计应用层,以便在网络状况恶化时可以正常降级。

视频和音频流并不是那么简单。你应该看看已经存在的东西,知道你想重新创造什么;-)

你的竞争对手使用什么?大多数视频似乎都是UDP数据包,但你可能应该看看所有竞争协议,这样你才能发明一个更好的协议。游戏使用UDP,所以路由器会在网络上发送UDP数据包。TCP重新传输会把实时视频弄得一团糟。视频到达时可能没有错误,但在TCP重新传输时,网络层的任何错误都将导致完全冻结。应用层还必须足够聪明,以便在数据落后时丢弃数据,否则每次重新传输时,两端之间的滞后只会扩大。